2013-03-04 94 views
1

我得到简单的antlr3语法MicroXpath并为Python构建词法分析器和分析器。如何在使用ANTLR解析Python时获取AST树而不是列表?

然后我写了一个简单的测试代码:

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不能建立一棵树?

回答

3

只有将添加到options{...}是不够的:您必须告诉ANTLR哪些节点/标记要从AST中排除(如果有),以及要将哪些节点/标记作为(sub )树。正如你已经观察到的那样,不这样做会导致一棵扁平的树。

结帐这个问答&一个找出如何在树中创建一个层次:How to output the AST built using ANTLR?

+0

非常感谢!这就是我一直在寻找的! – Cosmologist 2013-03-04 18:38:33

+0

不客气@Cosmologist。 – 2013-03-04 22:50:04