Antlr Tree Grammar

时间:2012-05-01 05:05:19

标签: java tree antlr grammar abstract-syntax-tree

我无法从解析器语法转到树语法,当我使用树操作符(^ ,!)而不是重写规则( - >)时出现问题

where_clause
    :   'where'! condition_or
    ;

condition_or
    :   condition_and ( 'or'^ condition_and )*
    ;

condition_and
    :   condition_expr ( 'and'^ condition_expr )*
    ;

condition_expr
    :   condition_comparision
//  |   condition_in
//  |   condition_like
    ;

condition_comparision
    :   column_identifier ('=' | '!=' | '>' | '<')^ sql_element
    ;

对于上面的解析器语法,树语法怎么样?由于这不是递归的,因此我无法将其折叠为树语法中的单个规则。

使用重写语法

强制重写解析器语法的另一种方法
condition_or
    :   condition_and -> condition_and 
     ( 'or' x=condition_and -> ^('or' condition_or $x))*
    ;

有没有更简单的方法呢?

由于

1 个答案:

答案 0 :(得分:2)

相应的树语法如下所示:

where_clause
    :   condition_or
    ;

condition_or
    :   ^('or' condition_and condition_and)
    ;

condition_and
    :   ^('and' condition_expr condition_expr)
    ;

condition_expr
    :   condition_comparision
    ;

condition_comparision
    :   ^('=' column_identifier sql_element)
    |   ^('!=' column_identifier sql_element)
    |   ^('>' column_identifier sql_element)
    |   ^('<' column_identifier sql_element)
    ;