如何使用 python2 运行时和 antlr4 打印解析树

lgw*_*est 5 python-2.7 antlr4

我正在尝试使用antlr4 4.4 版python2 运行时。语法来自 antlr4 书,第 6 页,文件:Hello.g4

grammar Hello;           
r  : 'hello' ID ;
ID : [a-z]+ ;
WS : [ \t\r\n]+ -> skip ;
Run Code Online (Sandbox Code Playgroud)

我用命令生成词法分析器和解析器

antlr4 -Dlanguage=Python2 Hello.g4
Run Code Online (Sandbox Code Playgroud)

然后生成文件HelloLexer.pyHelloParser.pyHelloListener.py等。我制作了一个主程序 test.py 来测试生成的 python 解析器:

from antlr4 import *
from HelloLexer import HelloLexer
from HelloParser import HelloParser

def main(argv):
    input = FileStream(argv[1])
    lexer = HelloLexer(input)
    stream = CommonTokenStream(lexer)
    parser = HelloParser(stream)
    tree = parser.r()
    print tree.toStringTree(parser)        <= the problem is here!

if __name__ == '__main__':
    import sys
    main(sys.argv)
Run Code Online (Sandbox Code Playgroud)

一切似乎都正常,除了我无法打印解析树。

C:\Users\LG\antlr\tpantlr2-code\code\install>Test.py data.txt
Traceback (most recent call last):
  File "C:\Users\LG\antlr\tpantlr2-code\code\install\Test.py", line 15, in <module>
    main(sys.argv)
  File "C:\Users\LG\antlr\tpantlr2-code\code\install\Test.py", line 11, in main
    print tree.toStringTree(parser)
  File "C:\Python27\lib\site-packages\antlr4\RuleContext.py", line 181, in toStringTree
    return Trees.toStringTree(self, ruleNames=ruleNames, recog=recog)
  File "C:\Python27\lib\site-packages\antlr4\tree\Trees.py", line 48, in toStringTree
    s = escapeWhitespace(cls.getNodeText(t, ruleNames), False)
  File "C:\Python27\lib\site-packages\antlr4\tree\Trees.py", line 68, in getNodeText
    return ruleNames[t.getRuleContext().getRuleIndex()]
TypeError: 'HelloParser' object does not support indexing
Run Code Online (Sandbox Code Playgroud)

我还没有弄清楚是什么问题。

Mar*_*ick 5

奇怪的是,toStringTree 是 Python 运行时中的一个类方法。您可以这样调用它来获取包含字符串化标记的 lisp 样式解析树:

from antlr4 import *
from antlr4.tree.Trees import Trees
# import your parser & lexer here

# setup your lexer, stream, parser and tree like normal

print(Trees.toStringTree(tree, None, parser))

# the None is an optional rule names list
Run Code Online (Sandbox Code Playgroud)


Onu*_*nur 3

看来您使用了错误的toStringStree功能。

查看java 文档

这解释了错误消息“对象不支持索引”。您选择的函数需要规则名称列表,而不是解析器。