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.
AFAIK, the error is because
nestingBlockCommentCharacterscan match+/(the~'/'twice).Personally, I’d keep the
nestingBlockCommentas 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: