用Antlr解析单行C风格的注释

ins*_*itu 5 java antlr

我为一种理解C风格单行注释的小语言编写了一个语法,例如.

  // this is a comment
Run Code Online (Sandbox Code Playgroud)

这是我使用antlr v3.0.1为这种语言编写的语法片段

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

  WS      :      (' '|'\r'|'\t'|'\u000C'|'\n')+ {$channel=HIDDEN;};
Run Code Online (Sandbox Code Playgroud)

除了当注释在脚本中的最后一个并且没有终止NL/CR时,我得到了来自antlr的恼人消息(在运行时):这几乎是有效的.

 line 1:20 required (...)+ loop did not match anything at character '<EOF>'
Run Code Online (Sandbox Code Playgroud)

我怎样才能摆脱这条消息?我尝试EOF(..)+表达式中添加令牌,但这不起作用.

Bar*_*ers 4

您不需要该选项:当您有或在您的规则中greedy=...时,通常需要它。由于您已经在规则中的隐藏通道上放置了换行符,因此您可以将其从您的:.*.+WSSINGLELINE_COMMENT

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

WS 
 : (' '|'\r'|'\t'|'\u000C'|'\n')+ {$channel=HIDDEN;}
 ;
Run Code Online (Sandbox Code Playgroud)