ANTLR和空字符串矛盾行为

时间:2014-01-29 02:25:39

标签: antlr

我从根本上不明白antlr是如何工作的。使用以下语法:

blockcomment    :   '/\*' ANYCHARS '\*/';

ANYCHARS        :   ('a'..'z' | '\n' | 'r' | ' ' | '0'..'9')*  ;

当我编译语法文件时,我收到一条警告消息:

“非片段词法分析器规则'ANYCHARS'可以匹配空字符串”

精细。我希望它能够匹配空字符串:"/\*\*/"完全有效。但是当我在TestRig中运行"/\*\*/"时,我得到:

错过了'*/'

的ANYCHARS

显然我可以改变它,以便'/**/'作为特例处理:

blockcomment    :   '/\*' ANYCHARS '\*/' | '/**/';

但这并没有真正解决潜在的问题。有人可以向我解释我做错了什么吗? ANTLR如何提出关于匹配空字符串然后不匹配它们的警告?

2 个答案:

答案 0 :(得分:1)

将“片段”添加到ANYCHARS?然后它会做你想做的事。

答案 1 :(得分:1)

"non-fragment lexer rule 'ANYCHARS' can match the empty string"

错误消息提示您制作ANYCHARS片段。 空字符串不能作为标记匹配,在源中的任何地方都会有无限多的空标记。

您想要制作ANYCHARS令牌的BLOCKCOMMENT部分,而不是单独的令牌。 这基本上是片段有用的 - 它们简化了词法分析器规则,但不产生令牌。

BLOCKCOMMENT : '/*' ANYCHARS '*/';
fragment ANYCHARS : ('a'..'z' | '\n' | 'r' | ' ' | '0'..'9')* ;

编辑:将解析器规则blockcomment切换为词法规则BLOCKCOMMENT以启用片段使用