0

我正在使用 ANTLRv3。我已经定义了一个语法。现在我想显示解析树(如在 ANTLRWorks 解析树或堆栈中)。我已经尝试过http://www.antlr.org/wiki/display/ANTLR3/Interfacing+AST+with+Java(遍历孩子),但它忽略了语法中的子句,而这些子句不会出现在解析字符串中。

例如。我有一个 SQL 语法。我正在解析 SELECT title,description from document 。在 ANTLRWorks 中,我可以看到(在解析树中) root_statement->select_statement->select_expression->select_list->[displayed_column,displayed_colummn] 这就是我想要的。

但是当我从 root_statement(通过 getChildren)获取 AST 树时,我没有得到 select_statement,select_expression。子项仅适用于“SELECT title,description from document”中的字符串。

我怎样才能像在 ANTLv4 中一样通过树?(root_statement.select_statemet.select_expression)

4

1 回答 1

0

ANTLR 3 使用由语法中的特殊语法(运算符、、和)定义的自定义形状^构建!AST ->。ANTLR 4 构建自动遵循语法本身形状的解析树。

要使 ANTLR 3 的行为类似于 ANTLR 4,您需要为语法中的每个解析器规则创建重写规则,其中根节点具有规则本身的名称。例如:

myParserRule
    :   x y* -> ^(MyParserRule x y*)
    |   z+   -> ^(MyParserRule z+)
    ;

至于另一个方向,没有一种“简单”的方法可以让 ANTLR 4 表现得像 ANTLR 3。

于 2013-05-15T13:05:56.760 回答