antlr无限eof循环

antlr无限eof循环,antlr,infinite-loop,eof,Antlr,Infinite Loop,Eof,请看一下我的语法: 不知何故,ANTLR生成一个无限循环,为以下输入查找无限EOF标记: class a{public function void a(} 尽管如此,只有prog希望类主体的EOF以某种方式接受它。有人知道我如何解决这个问题吗?我要改变的是,类主体不接受EOF令牌 生成的类中的代码: // D:\\TSPHP-parser\\src\\main\\antlr\\TSPHP.g:287:129: ( classBody )* loop17: do { int alt17=

请看一下我的语法:

不知何故,ANTLR生成一个无限循环,为以下输入查找无限EOF标记:

class a{public function void a(}
尽管如此,只有prog希望类主体的EOF以某种方式接受它。有人知道我如何解决这个问题吗?我要改变的是,类主体不接受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);

这种类型的错误可能发生在ANTLR 3的错误处理中。在ANTLR 4中,该方法被更新为要求抛出以下异常以抢占此问题

抛出:
IllegalStateException
-如果试图使用流的末尾(即调用consume之前的
==


对于ANTLR 3语法,您至少可以通过使用自己的实现(可能是最容易扩展的)防止无限循环,并在违反上面列出的条件时抛出此异常。请注意,您可能需要允许违反此条件一次(原因很复杂),因此,如果代码尝试使用EOF超过2或3次,请保留计数并抛出
IllegalStateException
。请记住,这只是一种打破无限循环的努力,这样您就可以在实际检查中有点“模糊”。

谢谢您的回答。我可以用谓词解决这个问题。欢呼太快了,我忘了补充?到accessModifier,然后再次遇到相同的问题。我会试试你的方法。我可以通过改写一些规则来解决这个问题。新语法可以在这里找到(对于那些有相同问题的人):
accessModifierOrPublic
    :   accessModifier 
    |   /* empty */ -> Public["public"]
    ;