我使用的是ANTLRv3。我已经定义了一个语法。现在我想显示解析树(就像在ANTLRWorks解析树或堆栈中一样)。我尝试过http://www.antlr.org/wiki/display/ANTLR3/Interfacing+AST+with+Java (遍历子句),但它省略了语法中的子句,这些子句在解析字符串时不会出现。
例如:我有一个SQL语法。我从文档中解析SELECT title,description。在ANTLRWorks中,我可以看到(在解析树中) root_statement->select_statement->select_expression->select_list->displayed_column,displayed_colulmn,这就是我想要的。
但是当我从root_statement (通过getChildren)获得AST树时,我没有得到select_statement,select_expression。子项仅用于"SELECT title,description from document“中的字符串。
我怎样才能像在ANTLv4中一样通过树呢?(root_statement.select_statemet.select_expression)
发布于 2013-05-15 21:05:57
ANTLR3使用由语法中的特殊语法(运算符^、!和->)定义的自定义形状构建AST。ANTLR4构建的解析树自动遵循语法本身的形状。
要使ANTLR 3的行为类似于ANTLR 4,您需要为语法中的每个解析器规则创建重写规则,其中根节点具有规则本身的名称。例如:
myParserRule
    :   x y* -> ^(MyParserRule x y*)
    |   z+   -> ^(MyParserRule z+)
    ;至于另一个方向,没有一种“简单”的方法可以让ANTLR 4表现得像ANTLR 3一样。
https://stackoverflow.com/questions/16562851
复制相似问题