我正在使用 Antlr 3.2,但在编写忽略注释行的语法时遇到了麻烦。具体来说,如果注释行是输入的最后一行,后面没有换行符,我会收到错误消息。
我的输入实际上是汇编语言,其中注释以分号开头,然后到行尾。其他所有内容都被解析为命令。
显示问题的我的语法的简化版本是:
grammar Test;
options {
language = Java;
output = AST;
ASTLabelType = CommonTree;
}
@header {
package test;
}
@lexer::header {
package test;
}
rule
: instruction+ EOF!
;
instruction
: 'SET' NEWLINE!*
;
COMMENT
: ';' .* NEWLINE+ { $channel=HIDDEN; }
;
NEWLINE
: '\r'? '\n'
;
WS
: (' ' | '\r' | '\n' | '\t' | '\f')+ { $channel = HIDDEN; }
;
如果我使用如下输入:
; comment line 1 with blank line after it
SET ; comment after command
; comment line again
解析这句话时出现错误line 4:11 required (...)+ loop did not match anything at character '<EOF>'
。
如果我在输入的最后一行添加换行符,它可以正常工作,因为换行符与注释剥离相匹配,并且 EOF 在规则末尾匹配。
我怎样才能更好地写这个,以便它忽略最后一行的注释但不给出错误?我不想在原始输入中附加任何内容来破解它,有没有更简洁的方法来阅读评论行?我已经尝试了 NEWLINE|EOF 的各种组合,但没有任何方法可以消除错误。