首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ANTLR4在处理EOF时挂断

ANTLR4在处理EOF时挂断
EN

Stack Overflow用户
提问于 2016-04-29 14:12:26
回答 2查看 1.9K关注 0票数 2

我有一个简单的ANTLR4语法:

代码语言:javascript
复制
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规则,一切都会正常工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-30 00:30:20

只需要在主规则中添加一个EOF。没有它,主规则就永远不会终止-- lexer将继续生成被EOF规则成功使用的new_line令牌。

代码语言:javascript
复制
preprocessing_file: oneline+? EOF ;
oneline: IDENTIFIER? new_line ;
new_line: EOF|CRLF ;
票数 3
EN

Stack Overflow用户

发布于 2016-04-29 15:01:00

文件的EOF结束不应在new_line规则中。只要改变

代码语言:javascript
复制
oneline: IDENTIFIER? new_line

转到

代码语言:javascript
复制
oneline: IDENTIFIER? new_line?

在以后的阶段验证new_line的存在(如果需要的话)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36940597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档