ANTLR 语法给出了意想不到的结果

ANTLR grammar is giving unexpected results

这个很简单。我正在通过发明一种可以识别单个单词的语法来学习 ANTLR4。但为什么它不符合我的名字?它正在打印 [ ].

我正在使用带有 C# 4.5 的 Antlr 4。

MyFirstGrammar.g4:

grammar MyFirstGrammar;

/*
 * Parser Rules
 */

compileUnit
    :   ID
    ;


/*
 * Lexer Rules
 */

ID  :   [A-Za-z]+ ;

WS  :   ' ' -> skip ;

Program.cs

static class Program
{
    private static void Main()
    {
        var stream = new AntlrInputStream("amy");
        var lexer = new Grammars.MyFirstGrammarLexer(stream);
        var tokens= new CommonTokenStream(lexer);
        var parser = new Grammars.MyFirstGrammarParser(tokens);
        var root = parser.compileUnit();
        Debug.WriteLine(root);
    }
}

嗯... 它有效,除了 RuleContext class 没有在 the way you expect 中定义 ToString。 ANTLR 生成的 CompileUnitContext class 扩展了 ParserRuleContext,扩展了 RuleContext.

试试这个:

Debug.WriteLine(root.ToStringTree(parser));

它将打印 parse tree:

(compileUnit amy)

或者您可能正在寻找这个:

Debug.WriteLine(root.GetText());

这将按您的预期打印 amy。 :)