【问题标题】:how print parse-tree using python2 runtime with antlr4如何使用带有 antlr4 的 python2 运行时打印解析树
【发布时间】:2014-08-05 10:22:59
【问题描述】:

我正在尝试使用antlr4 version 4.4python2 runtime。语法来自antlr4 book, page 6, file: Hello.g4:

grammar Hello;           
r  : 'hello' ID ;
ID : [a-z]+ ;
WS : [ \t\r\n]+ -> skip ;

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

antlr4 -Dlanguage=Python2 Hello.g4

然后生成文件 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)

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

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

我还没弄清楚问题出在哪里。

【问题讨论】:

    标签: python-2.7 antlr4


    【解决方案1】:

    奇怪的是,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
    

    【讨论】:

      【解决方案2】:

      您似乎使用了错误的toStringStree 函数。

      看看java docs

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

      【讨论】:

      • 我现在明白了,我应该这样称呼我:print tree.toStringTree(),
      猜你喜欢
      • 1970-01-01
      • 2018-10-08
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 2014-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多