2012-05-01 85 views
2
我无法从语法分析器移动到树文法

,问题是当我使用树运算符(^,!),而不是重写规则( - >)ANTLR的树语法

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))* 
    ; 

有没有什么简单的方法来做到这一点有力地改写解析器语法?

感谢

回答

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) 
    ; 
+0

你使它看起来那么容易。再次感谢。 –