我为一种理解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
令牌添加到(..)+
表达式,但这不起作用。
答案 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不是。
不是您特定问题的解决方案,但您最初编码规则的方式会暴露此问题。