我从根本上不明白antlr是如何工作的。使用以下语法:
blockcomment : '/\*' ANYCHARS '\*/';
ANYCHARS : ('a'..'z' | '\n' | 'r' | ' ' | '0'..'9')* ;
当我编译语法文件时,我收到一条警告消息:
“非片段词法分析器规则'ANYCHARS'可以匹配空字符串”
精细。我希望它能够匹配空字符串:"/\*\*/"
完全有效。但是当我在TestRig中运行"/\*\*/"
时,我得到:
错过了'*/'
显然我可以改变它,以便'/**/'
作为特例处理:
blockcomment : '/\*' ANYCHARS '\*/' | '/**/';
但这并没有真正解决潜在的问题。有人可以向我解释我做错了什么吗? ANTLR如何提出关于匹配空字符串然后不匹配它们的警告?
答案 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
以启用片段使用