2015-05-20 41 views
0

我在antlr3上使用antlrworks1.5並遇到以下警告/錯誤。我已經在這個問題上工作了幾天,有人可以給我一些提示嗎?先謝謝你。ANTLR3:編譯警告(200)「多個替代品」

最小化的語法文件是:

grammar p; 

cs : '[' c ']'; 
c : 'x' ('p' c)*; 

ANTLR報告以下警告:警告(200):決策可以匹配輸入諸如 「 'P'」 使用多個替代:1,2

TTP://i.stack.imgur.com/eg7cQ.png

http://i.stack.imgur.com/rnRvx.png

我很納悶: (1)什麼是「馬的意思使用多個替代方案「?這是否意味着語法不明確?如果是這樣,請給我舉個例子嗎? (2)一般如何解決這個問題?

非常感謝。

回答

0

語法確實含糊不清。

c ::= 'x' 
    | c 'p' c 

現在,這是左右兩個遞歸,所以推導可以在任何一方建立子樹,從而產生不同的解析樹的同樣的話:要理解這一點,通過轉換爲純BNF更換克萊尼明星。

直接從EBNF,這是很難看到。這裏的區別體現在分析樹不同的深度,依賴於重複是否使用或不使用:

 c     c       
     /|    /|\    
    /|    | | \ 
    //|\    | | \ 
// | \  vs.  | | c   
//| | |    | | /|\   
|/c | c    | | | | c   
| | | | |    | | | | | 
x p x p x    x p x p x   

ANTLR對這一觀點是由SLL算法確定。在處理重複時,必須決定是否要 繼續進行另一次迭代,或者完成c生產的右側。在任一種情況下,預計從c的追隨者的前瞻 令牌 - 在第一種情況下,因爲c在第二種情況下在重複部分的末端 ,因爲重複發生在c生產的末尾。因此無法決定。

解決方案相當明顯:確保有一種獨特的方式獲得重複序列。在這種情況下,可以通過c : 'x' ('p' 'x')*;省略遞歸,或者通過選項c : 'x' ('p' c)?;替換Kleene星。