ANTLR:使用Python生成解析树

时间:2014-02-14 06:43:53

标签: python parsing antlr3

我是ANTLR的新手,目前我正在尝试使用带有Python的ANTLR 3.1.3。我已经成功安装了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”。

请您告诉我如何修改代码以打印解析树?

1 个答案:

答案 0 :(得分:1)

几周前,我想打印出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中编写代码,因此未经测试