嵌入注释的 antlr 问题
我正在尝试在 D 中实现嵌套注释。
nestingBlockComment
: '/+' (options {greedy=false;} :nestingBlockCommentCharacters)* '+/' {$channel=HIDDEN;}; // line 58
nestingBlockCommentCharacters
: (nestingBlockComment| '/'~'+' | ~'/' ) ; //line 61
对我来说,这应该可行是合乎逻辑的...
This is the error message I get:
[21:06:34] warning(200): d.g:58:64: Decision can match input such as "'+/'" using multiple alternatives: 1, 2
As a result, alternative(s) 1 were disabled for that input
[21:06:34] warning(200): d.g:61:7: Decision can match input such as "'/+'" using multiple alternatives: 1, 3
As a result, alternative(s) 3 were disabled for that input
有人可以向我解释这些错误消息和修复方法吗?
谢谢。
I am trying to implement a nested comment in D.
nestingBlockComment
: '/+' (options {greedy=false;} :nestingBlockCommentCharacters)* '+/' {$channel=HIDDEN;}; // line 58
nestingBlockCommentCharacters
: (nestingBlockComment| '/'~'+' | ~'/' ) ; //line 61
For me, it would be logical that this should work...
This is the error message I get:
[21:06:34] warning(200): d.g:58:64: Decision can match input such as "'+/'" using multiple alternatives: 1, 2
As a result, alternative(s) 1 were disabled for that input
[21:06:34] warning(200): d.g:61:7: Decision can match input such as "'/+'" using multiple alternatives: 1, 3
As a result, alternative(s) 3 were disabled for that input
Could someone explan those error messages to me and the fix?
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
AFAIK,错误是因为
nestingBlockCommentCharacters
can 匹配+/
(~'/'
两次)。就我个人而言,我会将nestingBlockComment保留为词法分析器规则而不是解析器规则。您可以通过在词法分析器类中添加一些辅助方法来做到这一点:
然后在词法分析器注释规则中,使用 门控语义谓词,使用该辅助方法作为谓词内的布尔表达式:
一些演示语法:
以及一个用于测试它的主类:
然后是以下命令:
(对于 Windows,最后一个命令是:
java -cp .;antlr-3.2.jar Main
)产生以下输出:
AFAIK, the error is because
nestingBlockCommentCharacters
can match+/
(the~'/'
twice).Personally, I'd keep the
nestingBlockComment
as a lexer rule instead of a parser rule. You can do that by adding a little helper method in the lexer class:and then in a lexer comment-rule, use a gated semantic predicates with that helper method as the boolean expression inside the predicate:
A little demo-grammar:
and a main class to test it:
Then the following commands:
(for Windows, the last command is:
java -cp .;antlr-3.2.jar Main
)produce the following output: