0

文法アクションでルール参照を使用しようとしていました。

string_decl_list  : (string_decl)+;
string_decl       : ('STRING' id ':=' str ';') 
{//table.currentScope().define(new BaseDescriptor(), id.text, ValueType.STRING);
 System.out.println($str.text);
};
str               : STRINGLITERAL;

私の文法はこんな感じです。コンパイルは問題ありません。しかし、ファイルを解析しようとすると。

例外が出てきます。

Exception in thread "main" java.lang.NoSuchFieldError: str
at MicroParser.string_decl(MicroParser.java:368)
at MicroParser.string_decl_list(MicroParser.java:312)
at MicroParser.decl(MicroParser.java:246)
at MicroParser.pgm_body(MicroParser.java:187)
at MicroParser.program(MicroParser.java:107)
at Compiler.main(Compiler.java:32)
Java Result: 1

ルール参照のために正しくやっていると思いますが、これについて誰か助けてもらえますか? 解決方法がわかりません

4

1 に答える 1

0

エラーが発生します

 Exception in thread "main" java.lang.NoSuchFieldError: str

パーサー ルール「str」の戻り値がないためです。

次のようなことを試してください:

 str returns [String str] :  STRINGLITERAL { $str = new String($STRINGLITERAL.text); } ;
于 2013-10-07T23:13:38.093 に答える