生成されたパーサー ファイルでは、このメソッドは return ステートメントが見つからないという例外をスローしますが、return ステートメントには常に到達可能です。関数は次のとおりです。
Program Goal():
{
MainClass mc;
ClassDecl cd;
ClassDeclList cdl = new ClassDeclList();
}
{
mc = mainClass()
(
cd = ClassDeclaration()
{
cdl.addElement(cd);
}
)* < EOF >
{
return new Program(mc, cdl);
}
}
ありがとう。
編集
つまり、問題はこの方法ではなく、別の方法にありました。簡単に言えば、問題は、そのメソッドにいくつかの OR があり、最後に java return ステートメントがあることでした。すべての ORed 関数呼び出しを 1 組の括弧で囲む必要がありましたが、それを見逃していました。
以下は、私がすべきことです。
Exp expression() :
{
Token t;
Exp exp = null;
IntegerLiteral il;
FloatLiteral fl;
CharLiteral cl;
StringLiteral sl;
String s;
Identifier id;
Exp tmpExp = null;
}
{
( // <--- This and its enclosing parenthesis are what I missed.
(
t = < INTEGRAL_LITERAL >
{
il = new IntegerLiteral(Integer.parseInt(t.image));
}
exp = ExpressionBar(il)
)
|
(
t = < FLOAT_LITERAL >
{
fl = new FloatLiteral(Float.parseFloat(t.image));
}
exp = ExpressionBar(fl)
)
|
(
t = < CHAR_LITERAL >
{
cl = new CharLiteral(t.image.charAt(1));
}
exp = ExpressionBar(cl)
)
|
(
t = < STRING_LITERAL >
{
sl = new StringLiteral(t.image);
}
exp = ExpressionBar(sl)
)
)
{
return exp;
}
}