如何在使用ANTLR解析Python时获取AST树而非列表?
我拿到了一个简单的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?