2

生成されたパーサー ファイルでは、このメソッドは 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;
  }
}
4

0 に答える 0