ANTLR和空字符串的矛盾行为

ANTLR和空字符串的矛盾行为,antlr,Antlr,我根本不明白antlr是如何工作的。使用以下语法: blockcomment : '/\*' ANYCHARS '\*/'; ANYCHARS : ('a'..'z' | '\n' | 'r' | ' ' | '0'..'9')* ; 当我编译语法文件时,我收到一条警告消息,上面说: “非片段lexer规则'ANYCHARS'可以匹配空字符串” 好的。我希望它能够匹配空字符串,因为:“/\*\*/”是完全有效的。但是当我在TestRig中运行“/\*\*/”时,

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

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

ANYCHARS        :   ('a'..'z' | '\n' | 'r' | ' ' | '0'..'9')*  ;
当我编译语法文件时,我收到一条警告消息,上面说:

“非片段lexer规则'ANYCHARS'可以匹配空字符串”

好的。我希望它能够匹配空字符串,因为:
“/\*\*/”
是完全有效的。但是当我在TestRig中运行
“/\*\*/”
时,我得到:

'*/'

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

blockcomment    :   '/\*' ANYCHARS '\*/' | '/**/';
但这并没有真正解决根本问题。有人能给我解释一下我做错了什么吗?ANTLR如何发出关于匹配空字符串的警告,然后又不同时匹配它们呢?

在ANYCHARS中添加“fragment”?然后它会做你想做的事

"non-fragment lexer rule 'ANYCHARS' can match the empty string"
错误消息提示您生成
ANYCHARS
片段。 空字符串不能作为令牌进行匹配,这将导致源中任意位置出现无限多个空令牌

您希望使
ANYCHARS
成为
BLOCKCOMMENT
标记的一部分,而不是单独的标记。 这基本上就是片段的好处所在——它们简化了lexer规则,但不生成令牌

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

编辑:将解析器规则
blockcomment
切换到lexer规则
blockcomment
以启用片段使用

仍然不起作用。我在运行时得到同样的错误。警告消息更改为:语法分析器中标记“ANYCHARS”的隐式定义。所以看起来它仍然试图成为一个令牌。正如我所说的,片段不是令牌,它们是其他令牌的一部分。因此,您不能在解析器规则中使用片段,只能在另一个lexer规则中使用。我建议将解析器规则
blockcomment
更改为lexer规则
blockcomment
(使整个注释成为一个标记),看看是否有效。谢谢!成功了。我感谢你的帮助。我还在想办法,还是不行。我在运行时得到同样的错误。警告消息更改为:语法分析器中标记“ANYCHARS”的隐式定义。所以看起来它仍然在试图成为一种象征。很抱歉使blockcomment成为lexer规则而不是解析器规则。;)