处理 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 ;
我有一个简单的 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 ;