我是ANTLR的新手,目前正在尝试将ANTLR 3.1.3与Python结合使用。我已经为python成功安装了ANTLR运行时。但是我不知道如何打印出特定输入的分析树。
语法
grammar Expr;
options {
language=Python;
output=AST;
}
expr : atom (op atom)* NEWLINE ;
op : '+' | '-';
atom : ID | INT;
ID : ('a'..'z'|'A'..'Z')+ ;
INT : ('0'..'9')+ ;
NEWLINE : '\r'? '\n' ;
WS : (' '|'\t'|'\n'|'\r')+ {self.skip()} ;
Python代码
import sys
import antlr3
from antlr3 import *
from ExprLexer import ExprLexer
from ExprParser import ExprParser
# test the parser with an input
char_stream = antlr3.ANTLRStringStream('3+5\n')
lexer = ExprLexer(char_stream)
tokens = antlr3.CommonTokenStream(lexer)
parser = ExprParser(tokens)
# print the parse tree
t = parser.expr().tree
print t.toStringTree()
虽然执行代码时我想要的是解析树。该代码将仅打印“ 3 + 5”。
您能告诉我如何修改代码以打印分析树吗?
最佳答案
几周前,我想打印出ANTLR AST(不是解析树,但这取决于您实现语法的方式..)以进行调试。
您可以做一些很简单的事情:
def print_tree(tree, lev):
print (" " * lev) + "` " + str(tree)
for c in tree.getChildren():
print_tree(c, lev + 1)
print_tree(parser.expr().tree, 0)
注意:我直接用SO编写了代码,因此未经测试