2012-02-13 60 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