2012-05-01 86 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

你使它看起來那麼容易。再次感謝。 –