2017-04-18 6 views
1

私は次のものを持っていますjavacc文法。javaCCは不要なステートメントを挿入します

ルールUnaryExpr私はJavaCCの7.0.2を使用してコードを生成していたときにjava.util.function.Predicate<>

options { 
static=false; 
DEBUG_PARSER=false; 
IGNORE_CASE=true; 
JDK_VERSION="1.8"; 
} 

(...) 

private Predicate<SAMRecord> UnaryExpr(): { } 
    { 
    (
    <DUPLICATE> { return new Predicate<SAMRecord>() { 
      @Override public boolean test(final SAMRecord rec) { return rec.getDuplicateReadFlag();} 
     };} 
    | <UNMAPPED> { return new Predicate<SAMRecord>() { 
      @Override public boolean test(final SAMRecord rec) { return rec.getReadUnmappedFlag();} 
     };} 
    | <FAILSVENDORQUALITY> { return new Predicate<SAMRecord>() { 
      @Override public boolean test(final SAMRecord rec) { return rec.getReadFailsVendorQualityCheckFlag();} 
     };} 
    | <PROPERPAIR> { return new Predicate<SAMRecord>() { 
      @Override public boolean test(final SAMRecord rec) { return rec.getReadPairedFlag();} 
     };} 
    ) 
    } 

を実装するいくつかの匿名クラスを作成し、生成されたJavaコードはコード{if ("" != null)を破るいくつかの余分なステートメントが含まれています。 Javaの代わりに、ファイル、または私の元のコードでは:

@Override public boolean test(final SAMRecord rec) {return rec.getDuplicateReadFlag();} 

私が持っている:

@Override public boolean test(final SAMRecord rec) { {if ("" != null) return rec.getDuplicateReadFlag();}} 

私はこの問題を解決するにはどうすればよいですか?ありがとう。

+0

クロスポスト:https://github.com/javacc/javacc/issues/24 – Pierre

答えて

1

これはかなり面倒な動作です。

あなたはこれと一緒に住んでもらえますか?

private Predicate<SAMRecord> UnaryExpr(): { 
    class A implements Predicate<SAMRecord> { 
     @Override public boolean test(final SAMRecord rec) { 
      return rec.getDuplicateReadFlag(); } } 

    class B implements Predicate<SAMRecord> { 
     @Override public boolean test(final SAMRecord rec) { 
      return rec.getReadUnmappedFlag(); } } 

    class C implements Predicate<SAMRecord> { 
     @Override public boolean test(final SAMRecord rec) { 
      return rec.getReadFailsVendorQualityCheckFlag(); } } 

    class D implements Predicate<SAMRecord> { 
     @Override public boolean test(final SAMRecord rec) { 
      return rec.getReadPairedFlag(); } } 
} 
{ 
    (<DUPLICATE> { return new A() ; } 
    | <UNMAPPED> { return new B() ; } 
    | <FAILSVENDORQUALITY> { return new C() ; } 
    | <PROPERPAIR> { return new D() ; } 
    ) 
} 
+0

はい、それは、より私のアイデアだった私は自分のインスタンスを生成するために、パーサーにいくつかの静的メソッドを作成しましたためstaticプレディケート createA();静的述語 createB(); ' – Pierre

+0

右。それも動作します。クラスが非静的である必要はありません。実際、毎回新しいオブジェクトを作成する必要はおそらくありません。 –

関連する問題