如何在使用ANTLR解析Python时获取AST树而非列表?

1 投票
1 回答
1371 浏览
提问于 2025-04-17 17:53

我拿到了一个简单的antlr3语法,叫做MicroXpath,然后为Python构建了词法分析器和语法分析器。

接着我写了一段简单的测试代码:

import antlr3
from XPathLexer import XPathLexer
from XPathParser import XPathParser

def print_level_order(tree, indent):
    print('{0}{1}'.format('   '*indent, tree.text, tree.getType()))
    for child in tree.getChildren():
        print_level_order(child, indent+1)

input = 'descendant::name[class/name[test="x"]="File"]'
char_stream = antlr3.ANTLRStringStream(input)
lexer = XPathLexer(char_stream)
tokens = antlr3.CommonTokenStream(lexer)
parser = XPathParser(tokens)
tree = parser.xPath().tree

print_level_order(tree, 0)

结果是:

None
   descendant
   :
   name
   [
   class
   /
   name
   [
   test
   =
   "x"
   ]
   =
   "File"
   ]

那树在哪里?这只是一个线性列表!我哪里做错了?还是说用ANTLR就不能构建树?

1 个回答

3

仅仅在 options{...} 中添加 output=AST; 还不够:你还需要告诉 ANTLR 哪些节点或标记需要排除在抽象语法树(AST)之外(如果有的话),以及哪些节点或标记想要作为(子)树的根节点。如果不这样做,结果就是你已经看到的那种扁平的树。

查看这个问答,了解如何在你的树中创建层次结构: 如何输出使用 ANTLR 构建的 AST?

撰写回答