0

Visual Studio で antlr を使用する方法を学習し始めていますが、基本的な例が機能しません。

私が使用しているグラマーは次のとおりです。

grammar T;

options {
    language=CSharp3;
    TokenLabelType=CommonToken;
}
@lexer::namespace {CoolTool.CoolProject.Compiler} 
@parser::namespace {CoolTool.CoolProject.Compiler}

/*
 * Parser Rules
 */

compileUnit
    : 'a' AFTER
    ;


AFTER
    :    'after'
    ;

WS
    : (' '|'\r'|'\t'|'\u000C'|'\n');

以下は、レクサーとグラマーをインスタンス化する C# コードです。

using System;
using Antlr.Runtime;
namespace CoolTool.CoolProject.Compiler
partial class TParser
    {
        public static void Main(String[] args)
        {
            TLexer lexer = new TLexer(new ANTLRStringStream("$$%$%"));
            CommonTokenStream tokens = new CommonTokenStream(lexer);
            TParser parser = new TParser(tokens);

            parser.compileUnit();

            Console.WriteLine("OK");

        }
    }
}

問題は、レクサー/パーサーに何を渡しても、エラーが発生しないことです。「$$」に対して NoViableAltException が発生しないのはなぜですか?

誰でも助けることができますか?

ありがとう、アミール

4

2 に答える 2

0

私はantlr3.4を使用し、次のような例外を扱います:

        ICharStream input = new ANTLRStringStream(_expressionString);
        ExpressionLexer lex = new ExpressionLexer(input);

        CommonTokenStream tokens = new CommonTokenStream(lex);
        ExpressionParser parser = new ExpressionParser(tokens);
        AstParserRuleReturnScope<CommonTree, CommonToken> r = parser.expression();

        if (lex.HasError)
        {
            throw new ExpressionException(lex.ErrorMessage);
        }
        if (parser.HasError)
        {
            throw new ExpressionException(parser.ErrorMessage);
        }

あなたのantlrバージョンは少し古いですが、例外はおそらく同じだと思います

于 2012-05-24T16:00:29.350 に答える
0

私の記憶が正しければ、C# で生成されたソースは、状況によっては生成されたエラーを飲み込み、返されたオブジェクトをクエリして、エラーが発生したかどうかを確認する必要があります。

トラップするコードを追加する必要があるエラーもあります。

2年前にAntlrを使用したときにも同様の問題がありました。

古いコードを見つけることができるかどうかを確認します。

于 2012-05-15T09:59:38.347 に答える