私の文法を見てください: https://bitbucket.org/rstoll/tsphp-parser/raw/cdb41531e86ec66416403eb9c29edaf60053e5df/src/main/antlr/TSPHP.g
どういうわけか、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 は有効なトークンであるため、そのように指定していないにもかかわらず、ループが終了しないという問題が発生します。
EDIT行 342 と 347 をコメントアウトしてもエラーは発生しません (ルール accessModifierWithoutPrivateOrPublic、accessModifierOrPublic の空のケース)
EDIT 2私は私の問題を解決することができました. methodModifier ルールを書き直しました (すべての可能な修飾子を 1 つのルールに統合しました)。このように、ANTLR は EOF が after / empty / inの有効なトークンであるとは信じていません
accessModifierOrPublic
: accessModifier
| /* empty */ -> Public["public"]
;