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

时间:2012-12-08 08:44:38

标签: java antlr

我为一种理解C风格单行评论的小语言写了一个语法,例如。

  // this is a comment

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

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

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

除了当评论在脚本中的最后一个并且没有终止NL / CR时,我从antlr(在运行时)收到了一条恼人的消息:

这非常有用。
 line 1:20 required (...)+ loop did not match anything at character '<EOF>'

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

2 个答案:

答案 0 :(得分:4)

您不需要greedy=...选项:当您的规则中有.*.+时,通常需要它。由于您已经在WS规则中的隐藏频道上设置换行符,您可以将其从SINGLELINE_COMMENT中移除:

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

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

答案 1 :(得分:3)

一般来说,解决“无终止NL”问题会涉及很多曲折的语法变化,以迎合这种边缘条件。仅仅将NL添加到输入流的末尾总是更简单,这意味着您可以保证有一个终止NL而不用担心它在您的语法中。 UNIX在这方面是正确的,Windows不是。

不是您特定问题的解决方案,但您最初编码规则的方式会暴露此问题。