2017-04-18 72 views
1

我有以下javacc語法。javaCC插入不需要的語句

規則UnaryExpr創建實施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();} 
     };} 
    ) 
    } 

當我使用的JavaCC 7.0.2,生成的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 Predicate createA();靜態謂詞 createB();' – Pierre

+0

對。這也起作用。這些類沒有必要是非靜態的。事實上,可能不需要每次都創建一個新對象。 –