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

标签 c# antlr antlr4

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

我正在使用 Antlr 4 和 C# 4.5。

MyFirstGrammar.g4:

grammar MyFirstGrammar;

/*
 * Parser Rules
 */

compileUnit
    :   ID
    ;


/*
 * Lexer Rules
 */

ID  :   [A-Za-z]+ ;

WS  :   ' ' -> skip ;

程序.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/

相关文章:

c# - 无法让 Antlr4 解析器遵循隐式乘法的运算顺序

python - 访问用括号定义的属性

java - Antlr4 当第二个谓词失败时不遵循备用路径

c# - 用作变量错误的类型

c# - 有没有办法在 C# 中直接从磁盘填充和使用变量?

c# - 我如何在 ANTLR 中实现将两个节点合二为一的解析器规则?

java - ANTLR 通配符运算符不消耗预期输入

java - 我如何引用在 ANTLR 中多次调用同一规则?

c# - 是否可以在 ASPX、C# 和 JavaScript 之间共享一个包含字符串的文件?

面向 Java/*nix 程序员的 C#