1

我得到简单的 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不能建树?

4

1 回答 1

3

仅添加output=AST;options{...}不够的:您必须告诉 ANTLR 哪些节点/令牌要从 AST 中排除(如果有),以及您希望哪些节点/令牌成为(子)树的根。正如您已经观察到的,不这样做会导致一棵扁平的树。

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

于 2013-03-04T16:28:41.937 回答