2016-03-28 81 views
0

ANTLR 4.5給了我一個「不匹配的輸入」字符串[]'期望'字符串'「,但我不明白爲什麼'[]'被包含在令牌。由於托架包含在令牌中,ANTLR4給出了不匹配的輸入

我已經剝離了語法下降到最低限度,以顯示該問題:

grammar Test;  
@header 
{ 
package parser; 
} 

mainClass : 'class' ID '{' 'void' 'main' '(' 'String' '[' ']' ID ')' '}' ; 

ID : [a-zA-Z] [a-zA-z0-9]* ; 

WS : [ \t\f\r\n]+ -> channel(HIDDEN); 

的輸入是:

class A 
{ 
    void main(String[] args) 
} 

如果我使用「字符串[]」則輸入是成功解析。

如果我從分析樹中打印出令牌,那麼它們都看起來像我所期望的,除了'String []'被顯示爲一個ID令牌而不是3個單獨的令牌。

我試着明確地定義'String','['和']'標記,但結果是一樣的。

我只是不能解決什麼是錯的。

+0

唯一讓我想到的是,你的詞法分析規則是互相爭鬥的。嘗試將它們轉換爲命名規則,而不僅僅是文字規則,並嘗試玩規則的順序。 – Divisadero

回答

0

嘗試爲每個標記定義詞法分析規則。我想知道如何用這個語法生成解析器。 ANTLR通常會發出一條消息,說明它不能從文字中隱式生成詞法分析標記。

0

哦,看到你期望在那裏的危險。

我改變了所有的令牌,顯式的結果相同。

然後我改變了ID詞法分析器規則,使用2個片段,一個用於字母,另一個用於數字,它的工作!

我改回原來的規則,它仍然工作。

對此問題中發佈的版本進行了非常仔細的檢查,結果表明問題出現在ID詞法分析器規則的大寫範圍內。它有A-Z,但應該是A-Z。範圍A-z包括\[]^_'因此存在問題。