2009-08-12 112 views
1

我想解析一個像a IN [3 .. 5[這樣的表達式,其中尖括號的方向決定間隔是包含還是獨佔。我想這被重寫到AST等Antlr樹重寫規則

   NODE-TYPE 
       | 
    +------------+-----------+ 
    |   |   | 
variable lower-bound upper-bound 

其中節點型是BTW_INCLUSIVE,BTW_EXCL_LOWER,BTW_EXCL_UPPER或BTW_EXCL_BOTH之一,這取決於角括號的方向。

我有以下解析規則:

interval_expr : expr1=variable IN 
       (LBRACKET|RBRACKET) 
       expr2=expression DOTDOT expr3=expression 
       (LBRACKET|RBRACKET) 
       -> ^(BETWEEN $expr1 $expr2 $expr3) 

這工作,但它不會創建正確的樹節點類型。如何根據匹配的內容選擇要創建的節點類型?

回答

5

我認爲你必須通過爲每個括號組合編寫一個規則來解決這個問題,手動添加節點類型。據我所知,不可能將兩個(不相鄰的)匹配的標記重寫爲另一個。

所以,你會得到這樣的:

interval_expr: 
    inclusive_expr | 
    excl_lower_expr | 
    excl_upper_expr | 
    excl_both_expr; 

inclusive_expr: 
    expr1=variable IN LBRACKET expr2=expression DOTDOT expr3=expression RBRACKET 
    -> ^(BTW_INCLUSIVE $expr1 $expr2 $expr3); 

excl_lower_expr: 
    expr1=variable IN RBRACKET expr2=expression DOTDOT expr3=expression RBRACKET 
    -> ^(BTW_EXCL_LOWER $expr1 $expr2 $expr3); 

excl_upper_expr: 
    expr1=variable IN LBRACKET expr2=expression DOTDOT expr3=expression LBRACKET 
    -> ^(BTW_EXCL_UPPER $expr1 $expr2 $expr3); 

excl_both_expr: 
    expr1=variable IN RBRACKET expr2=expression DOTDOT expr3=expression LBRACKET 
    -> ^(BTW_EXCL_BOTH $expr1 $expr2 $expr3);