不知何故,ANTLR 产生了一个无限循环,为以下输入找到无限的 EOF 标记:
class a{public function void a(}
虽然,只有 prog 期望 EOF classBody 也能以某种方式接受它。有人知道我该如何解决这个问题,我必须改变 classBody 分别不接受 EOF 令牌吗?
生成的类中的代码:
// D:\\TSPHP-parser\\src\\main\\antlr\\TSPHP.g:287:129: ( classBody )*
loop17:
do {
int alt17=2;
int LA17_0 = input.LA(1);
if ( (LA17_0==EOF||LA17_0==Abstract||LA17_0==Const||LA17_0==Final||LA17_0==Function||LA17_0==Private||(LA17_0 >= Protected && LA17_0 <= Public)||LA17_0==Static) ) {
alt17=1;
}
switch (alt17) {
case 1 :
// D:\\TSPHP-parser\\src\\main\\antlr\\TSPHP.g:287:129: classBody
{
pushFollow(FOLLOW_classBody_in_classDeclaration1603);
classBody38=classBody();
state._fsp--;
if (state.failed) return retval;
if ( state.backtracking==0 ) stream_classBody.add(classBody38.getTree());
}
break;
default :
break loop17;
}
} while (true);
问题出现了,当令牌 = EOF 时,循环永远不会退出,因为 EOF 是一个有效的令牌,即使我没有这样指定。
编辑如果我将第 342 行和第 347 行注释掉(分别在规则 accessModifierWithoutPrivateOrPublic、accessModifierOrPublic 中的空例),则不会出现错误
编辑 2我可以解决我的问题。我重写了 methodModifier 规则(将所有可能的修饰符集成到一个规则中)。这样ANTLR不相信EOF是/ empty /in
accessModifierOrPublic
: accessModifier
| /* empty */ -> Public["public"]
;