Parsing single-line C-style comments with Antlr

antlr, java

Solution

You don't need the `greedy=...` option: you usually need it when you have `.*` or `.+` in your rule. And since you're already putting line break chars on the hidden channel in your `WS` rule, you can remove it from your `SINGLELINE_COMMENT`:

SINGLELINE_COMMENT
 : '//' ~('\r' | '\n')* {$channel=HIDDEN;}
 ;

WS 
 : (' '|'\r'|'\t'|'\u000C'|'\n')+ {$channel=HIDDEN;}
 ;

Problem

I wrote a grammar for a small language which understands C-style single line comments, eg. ``` // this is a comment ``` Here is a fragment of the grammar I wrote for this language, using antlr v3.0.1 ``` SINGLELINE_COMMENT : '/' '/' (options {greedy=false;} : ~('\r' | '\n'))* ('\r' | '\n' )+ {$channel=HIDDEN;}; WS : (' '|'\r'|'\t'|'\u000C'|'\n')+ {$channel=HIDDEN;}; ``` This pretty much kind of works, except that when the comment is last in the script and there is no terminating NL/CR, I got an annoying message from antlr (at runtime): ``` line 1:20 required (...)+ loop did not match anything at character '<EOF>' ``` How can I get rid of this message? I tried adding `EOF` token to the `(..)+` expression but this does not work.

Original source