我有一个简单的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的一个bug吗?我做错什么了吗?另外,如果我删除了EOF中的new_line规则,一切都会正常工作。
发布于 2016-04-30 00:30:20
只需要在主规则中添加一个EOF。没有它,主规则就永远不会终止-- lexer将继续生成被EOF规则成功使用的new_line令牌。
preprocessing_file: oneline+? EOF ;
oneline: IDENTIFIER? new_line ;
new_line: EOF|CRLF ;发布于 2016-04-29 15:01:00
文件的EOF结束不应在new_line规则中。只要改变
oneline: IDENTIFIER? new_line转到
oneline: IDENTIFIER? new_line?在以后的阶段验证new_line的存在(如果需要的话)
https://stackoverflow.com/questions/36940597
复制相似问题