处理 EOF 时 ANTLR4 挂起

ANTLR4 Hangs Up When Dealing with EOF

我有一个简单的 ANTLR4 语法:

grammar Test;
preprocessing_file: oneline+;

oneline: IDENTIFIER? new_line;

new_line: EOF|CRLF
;

WS: [ \t\f]+ -> channel(2);

CRLF: '\r'? '\n';


IDENTIFIER:  (NONDIGIT | DIGIT )+
; 
  fragment DIGIT: [0-9];
  fragment NONDIGIT: [_a-zA-Z]  ;

我正在测试如何使用允许最后一行不被 CRLF 终止的换行规则。我用 ANTLR v4.1 和 v4.5.3 测试了语法。

几行文本的输入文件导致 ANTLR4 冻结并在一段时间后出现 OutOfMemoryException。看起来 ANTLR4 进入了某个无限循环。这是 ANTLR4 的错误吗?我做错了什么吗?另外,如果我删除 new_line 规则中的 EOF,一切正常。

EOF [文件结尾] 不应在 new_line 规则中。只需更改

oneline: IDENTIFIER? new_line

进入

oneline: IDENTIFIER? new_line?

如果完全需要验证,请在后续阶段验证 new_line 的存在

只需在主规则中添加一个EOF即可。没有它,主规则将永远不会终止——词法分析器将继续生成 EOF 标记,这些标记被 new_line 规则成功消耗。

preprocessing_file: oneline+? EOF ;
oneline: IDENTIFIER? new_line ;
new_line: EOF|CRLF ;