2012-12-20 118 views
2

AST rewrite rule with " * +" in antlr處出現關於使用分組技術的AST重寫規則的問題。 。ANTLR中複雜的AST重寫規則

我有在ANTLR AST發生故障,再次:)這裏是我的ANTLR代碼:現在

start : noun1+=n (prep noun2+=n (COMMA noun3+=n)*)* 
     -> ^(NOUN $noun1) (^(PREP prep) ^(NOUN $noun2) ^(NOUN $noun3)*)* 
    ; 
n  : 'noun1'|'noun2'|'noun3'|'noun4'|'noun5'; 
prep : 'and'|'in'; 
COMMA :  ','; 

,與輸入: 「名1和名2,noun3在noun4,noun5」,我得到了以下意外的AST:

enter image description here

與 「解析樹」 在ANLRwork比較:

enter image description here

我認爲$ noun3變量持有「COMMA noun3 + = n」中所有「n」的列表。因此,AST解析器^(NOUN $名詞3)*將繪製所有「n」而不用說其中「n」實際上屬於「準備」。

還有什麼辦法,可以使盲分離Blind在「(^(PREP PREP)^(名詞$名2)^(名詞$ noun3)。我想要做的就是AST必須在ANTLRwork中使用「Parse Tree」精確繪製,而不使用標記COMMA。

感謝您的幫助!

回答

2

如果分解start規則,獲得所需的分離最容易。下面是一個例子(不寫入COMMA S到AST):

start : prepphrase    //one prepphrase is required. 
      (COMMA! prepphrase)* //"COMMA!" means "match a COMMA but don't write it to the AST" 
     ; 

prepphrase: noun1=n    //You can use "noun1=n" instead of "noun1+=n" when you're only using it to store one value 
      (prep noun2=n)? 
      -> ^(NOUN $noun1) ^(PREP prep)? ^(NOUN $noun2)? 
     ; 

prepphrase是可以隨後用另一個名詞介詞名詞。 start規則查找以逗號分隔的prepphrase s。

輸出顯示爲分析樹圖像,但沒有逗號。


如果你更喜歡明確寫出的AST與->,或者如果你不喜歡的語法像COMMA!,你可以寫start規則是這樣吧。兩種不同的形式在功能上是等同的。

start : prepphrase    //one prepphrase is required. 
      (COMMA prepphrase)* 
      -> prepphrase+   //write each prepphrase, which doesn't include commas 
     ; 
+0

非常感謝!這真的很健康 –