2017-04-18 69 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

对。这也起作用。这些类没有必要是非静态的。事实上,可能不需要每次都创建一个新对象。 –