2012-02-13 61 views
1

我有一個簡單的語法解析括號內包含的標識符文件和關鍵字(希望):簡單的語法不工作

grammar Keyword; 

// PARSER RULES 
// 
entry_point : ('['ID']')*; 

// LEXER RULES 
// 
KEYWORD  : '[Keyword]'; 

ID  : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*; 
WS  : (' ' | '\t' | '\r' | '\n' | '\r\n') 
      { 
       $channel = HIDDEN; 
      }; 

它適用於輸入:

[Hi] 
[Hi] 

它返回一個NoViableAltException錯誤輸入:

[Hi] 
[Ki] 

如果我評論KEYWORD,那麼它工作正常。此外,如果我將我的語法更改爲:

grammar Keyword; 

// PARSER RULES 
// 
entry_point : ID*; 

// LEXER RULES 
// 
KEYWORD  : '[Keyword]'; 

ID  : '[' ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ']'; 
WS  : (' ' | '\t' | '\r' | '\n' | '\r\n') 
      { 
       $channel = HIDDEN; 
      }; 

然後它工作。你能幫我弄清楚爲什麼嗎?

此致敬禮。

回答

1

的1 ST語法失敗,因爲每當詞法看到"[K",詞法分析器將進入KEYWORD規則。如果它在您的情況下遇到其他情況"eyword]","i",它會嘗試返回可以匹配"[K"的其他規則。但是沒有其他詞法分析規則以"[K"開頭,並且因此會引發異常。請注意,詞法分析器不會刪除"K",然後嘗試再次匹配(詞法分析器是機器)!

你2 第二語法的作品,因爲現在詞法分析器可以找到依傍時"[Ki"沒有得到由KEYWORD因爲ID現在包括"["匹配。

+0

謝謝!是否有任何理論或建築原因,爲什麼詞法分析器在找到匹配之前不會「回來」? – Korchkidu 2012-02-13 20:17:36

+0

@Korchkidu,不是我所知道的。我相信ANTLR(v4)的下一個版本,詞法分析器會變得「更聰明」,並能夠從#1回溯(不是100%肯定,儘管...) – 2012-02-13 20:28:16

+0

非常感謝您的幫助! – Korchkidu 2012-02-13 20:29:48