2012-10-05 55 views
2

對於語法來說,如何保存生產出現的順序。在ANTLR AST中保留生產訂單

class: 'class' ID 
     '{' (fields 
     | methods) * '}'   -> ^(CLASS ID ^(FIELD fields*) ^(METHOD methods) 
     ; 

生產工作如我所料,但如果有像

class abc { 
    field 1 
    field 2 
    method 1 
    method 2 
    field 3 
    method 3 
    field 4 
} 

一類單列表中的所有字段的結束和第二列表中的方法。什麼是維持秩序的正確方法?我試着做..

class: 'class' ID 
     '{' (fields    -> ^(FIELD fields) 
     | methods    -> ^(METHOD methods) 
     )* '}'     -> ^(CLASS ID $class) 
     ; 

我甚至試過,沒有運氣之間插入一個假人頭部。

class: 'class' ID 
     '{' (fields 
     | methods) * '}'   -> ^(CLASS ID ^(FIELD fields*) ^NODE ^(METHOD methods) 
     ; 

但這沒有奏效。

回答

2

在該第一情況下,CLASS節點包含一系列後面是一系列METHOD節點(METHOD methods*)的FIELD節點(FIELD fields*)的,因爲生產明確指出field表達式一起處理,然後method表達式一起處理:

-> ^(CLASS ID ^(FIELD fields*) ^(METHOD methods) 

你沒有提到的第二和第三種方法生產的,但它比第一個可能不太理想。

嘗試用body表達,而不是下面的辦法:

grammar temp; 
options {output=AST;} 
tokens { KLASS; FIELD; METHOD; } 

klass : 'class' ID body -> ^(KLASS ID body) 
     ; 

body : '{'! 
       (field | method) * 
      '}'! 
     ; 

field : 'field' INT -> ^(FIELD INT) 
     ; 

method : 'method' INT -> ^(METHOD INT) 
     ; 

ID  : ('a'..'z')+; 
INT  : ('0'..'9')+; 
WS  : (' '|'\r'|'\n')+ {$channel = HIDDEN;} ; 

,你會得到以下結果AST:

-KLASS 
    -abc 
    -FIELD 
     -1 
    -FIELD 
     -2 
    -METHOD 
     -1 
    -METHOD 
     -2 
    -FIELD 
     -3 
    -METHOD 
     -3 
    -FIELD 
     -4 

如果你想測試與ANTLRWorks語法,開(或創建)語法:

enter image description here

並按CTRL + d啓動調試器(不使用的解釋,這是越野車!):

enter image description here

將輸入內容貼在彈出的窗口中,並確保你選擇正確的起始生產規則(在這種情況下爲klass)。然後按確定

當調試器啓動時,按結束箭頭按鈕> |解析輸入,然後點擊AST按鈕,看看AST創建解析器的樣子:

enter image description here

+0

沒有注意到你還張貼解答...我會刪除我的自你的是正確的,並張貼在我的編輯:) –

+0

@BartKiers這是非常慷慨的,謝謝。我浪費了至少30分鐘試圖讓ANTLRWorks工作,然後放棄並編寫了我自己的測試應用程序,因此我的漂亮的ASCII輸出。 :P – user1201210

+0

沒問題。讓我在關於如何使用ANTLRWorks進行測試的答案中添加一些額外的信息。 –