2014-05-07 50 views
0

如果我有我的輸入消息:ANTLR如何區分同一類型的輸入參數

IS(喬恩,TED)IS NOT(彼得);

我想這個AST:

 name 
     | 
    |-----| 
    IS IS NOT 
    |  | 
    | Peter 
|----| 
Jon Ted 

但我收到:

   name 
        | 
     |-----------------| 
     IS    IS NOT 
     |     | 
     |     | 
    |----|-----|  |----|-----| 
    Jon Ted Peter Jon Ted Peter 

我的語法文件有:

...

expression 
    | NAME 'IS' OParen Identifier (Comma Identifier)* CParen 'IS NOT' OParen 
Identifier (Comma Identifier)* CParen 
    -> ^(NAME ^('IS' ^(Identifier)*) ^('IS NOT' ^(Identifier)*)) 
    ; 

..

NAME 
    : 'name' 
    ; 

Identifier 
    : ('a'..'z' | 'A'..'Z' | '_' | '.' | Digit)* 
    ; 

我該如何區分屬於'IS'和屬於'IS NOT'的屬性?

回答

1

像這樣的東西應該這樣做:

expression 
: NAME IS left=id_list IS NOT right=id_list -> ^(NAME ^(IS $left) ^(NOT $right)) 
; 

id_list 
: '(' ID (',' ID)* ')' -> ID+ 
; 

IS : 'IS'; 
NOT : 'NOT'; // not a single token that is 'IS NOT' 

ID 
: ('a'..'z' | 'A'..'Z' | '_' | '.' | Digit)+ 
    // Not `(...)*`: it should always match a single char! 
; 
+0

非常感謝,這作品! – user2144555

+0

你能告訴我,如果我可以使用這種符號(保存在變量中)來保存「表達式」嗎?例如在:賦值:'('expression(condition expression)*')'(condition expression)* - > ^(Brackets ^(condition expression *));我想分開括號和後面的內容,打印如下所示的內容: - > ^(方括號$之間)$ – user2144555

+0

@ user2144555之後,試試看看最終結果。如果遇到問題,請隨時提出一個比這些評論框可以容納的更詳細的新問題。 –

相關問題