2010-02-27 31 views
3

我發現自己質疑如何在原始規則中出現特定條件時正確格式化重寫規則。ANTLR 3.x - 如何格式化重寫規則

什麼是改寫這個適當的方式:

unaryExpression: op=('!' | '-') t=term 
    -> ^(UNARY_EXPR $op $t) 

ANTLR的似乎不喜歡我什麼品牌在括號中有一個標籤和「OP =」失敗。此外,我試過:

unaryExpression: ('!' | '-') t=term 
    -> ^(UNARY_EXPR ('!' | '-') $t) 

Antlr不喜歡或'|'並引發語法錯誤。

用一個標記名替換字符類確實解決了這個問題,但它創建了我的語法的其他問題的泥潭。

---編輯----

第二個問題已被添加。請幫我格式化這個規則與樹語法:

multExpression : unaryExpression (MULT_OP unaryExpression)* ;

很簡單:我的期望是附上每個匹配的令牌在父(虛構的)令牌MULT讓我最終是這樣的:

MULT 
    o 
    | 
    o---o---o---o---o 
    | | | | | 
'3' '*' '6' '%' 2 

回答

2
unaryExpression 
    : (op='!' | op='-') term 
     -> ^(UNARY_EXPR[$op] $op term) 
    ; 

我用UNARY_EXPR[$op]所以根節點得到一些有用的行/列信息,而不是默認爲-1。

+0

非常感謝。我從來沒有聽說過使用過TOKEN [$ op],但我並不是一個廣泛的專家。在這方面使用它並沒有產生我期待的結果。 UNARY_EXPR標記是虛構的,在此上下文中用於描述遵循它的兩個標記。 但是,op = x | op = y恰恰是我做得不對的。 – Kivin