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