这很简单。我正在通过发明一种可以识别单个单词的语法来学习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类未在the way you expect中定义ToString
ANTLR生成的CompileUnitContext类扩展了ParserRuleContext,该类又扩展了RuleContext

尝试这个:

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


它将打印parse tree

(compileUnit amy)


也许您只是在寻找这个:

Debug.WriteLine(root.GetText());


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

关于c# - ANTLR语法给人意想不到的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32213403/

10-13 05:16