2014-01-29 15 views
2

我根本不知道如何ANTLR的作品。使用下面的语法:ANTLR和空字符串矛盾的行为

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

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

我得到一个警告消息时,我编译语法文件,上面写着:

“非片段的词法规则‘ANYCHARS’可以匹配空字符串”

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

'*/'

显然缺少ANYCHARS我可以改变它,这样'/**/'被作为特殊情况处理:

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

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

回答

1

添加 “片段”,以ANYCHARS?它会做你想做的。

+0

还不行。我在运行时遇到同样的确切错误。警告消息更改为:解析器中令牌“ANYCHARS”的隐式定义。所以看起来它仍然在努力成为一个令牌。 – jcfolsom

+0

哦。抱歉。使块注释成为词法分析规则而不是解析器规则。 ;) –

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

错误消息提示您制作ANYCHARS片段。 空字符串不能作为标记匹配,最终会在源代码中的任意位置结束无数个空标记。

您想使BLOCKCOMMENT令牌的ANYCHARS部分成为令牌的一部分,而不是单独的令牌。 这基本上是什么片段的好处 - 他们简化词法分析规则,但不产生令牌。

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

编辑:切换解析器规则blockcomment到词法规则BLOCKCOMMENT使片段使用

+0

仍然不起作用。我在运行时遇到同样的确切错误。警告消息更改为:解析器中令牌“ANYCHARS”的隐式定义。所以看起来它仍然在努力成为一个令牌。 – jcfolsom

+1

正如我所说的,碎片不是令牌,它们是其他令牌的组成部分。因此,不能在解析器规则中使用片段,只能在另一个词法分析器规则中使用。我建议将解析器规则'blockcomment'改为一个词法分析器规则'BLOCKCOMMENT'(使整个评论成为一个标记)并查看它是否有效。 – pepo

+0

谢谢!这工作。我感谢您的帮助。我仍然试图弄清楚这一点。 – jcfolsom