2014-06-10 120 views
0

我的完整語法導致了可怕的「沒有可行的替代方案」的化身,但無論如何,也許解決我看到的這個修剪版本的問題可以幫助我理解發生了什麼。令牌識別順序

grammar NOVIA; 

WS : [ \t\r\n]+ -> skip ; // whitespace rule -> toss it out 

T_INITIALIZE : 'INITIALIZE' ; 
T_REPLACING : 'REPLACING' ; 
T_ALPHABETIC : 'ALPHABETIC' ; 
T_ALPHANUMERIC : 'ALPHANUMERIC' ; 
T_BY   : 'BY' ; 

IdWord : IdLetter IdSeparatorAndLetter* ; 

IdLetter : [a-zA-Z0-9]; 
IdSeparatorAndLetter : ([\-]* [_]* [A-Za-z0-9]+); 



FigurativeConstant : 
     'ZEROES' | 'ZERO' | 'SPACES' | 'SPACE' 
; 

statement : initStatement ; 

initStatement : T_INITIALIZE identifier+ T_REPLACING (T_ALPHABETIC | T_ALPHANUMERIC) T_BY (literal | identifier) ; 

literal : FigurativeConstant ; 

identifier : IdWord ; 

和下面的輸入

INITIALIZE ABC REPLACING ALPHANUMERIC BY SPACES 

結果

(statement (initStatement INITIALIZE (identifier ABC) REPLACING ALPHANUMERIC BY (identifier SPACES))) 

我本來期望看到空間被認定爲 「文字」,而不是 「標識符」。

任何和所有的指針大爲讚賞,

TIA - 亞歷

回答

1

可能匹配FigurativeConstant規則也將匹配IdWord規則每個字符串。由於IdWord規則是首先列出的,並且匹配長度與任一規則相同,Lexer發出一個IdWord令牌,而不是一個FigurativeConstant令牌。

首先列出FigurativeConstant規則,您將得到您期望的結果。

作爲一種風格,您列出規則的順序掩蓋了其順序的重要性,特別是對於Lexer和Parser的必要POV。查看antlr/grammars-v4存儲庫中的語法作爲示例 - 通常,對於組合語法,解析器在頂部和自上而下排序。我甚至會冒險猜測,如果你的語法更容易閱讀,其他人可能已經回答了。

+0

謝謝 - 我現在覺得很愚蠢嗎?冒着積極的猜測,你不會錯的。 在我瘋狂的嘗試重現NoViableAlt問題時,我只是沒有對它的風格給予足夠的關注,對不起'布特那。 我只交換了「文字」和「標識符」規則,但不是詞法分析規則。 我會試圖將這個歸因於我昨天的溫度爲35°C的油炸腦袋cos,我們昨天有過 ,並希望我能逃脫它;-) 所以回到繪圖板,因爲這沒有(和不能)用完整的語法解決我的NoViableAlt。 –