2017-05-25 6 views
3

JavaCCを初めて使用していますが、デッドコードが多く発生していることに気付いています。JavaCCでデッドコードが生成される

{if ("" != null) return result;} 
    throw new Error("Missing return statement in function"); 
    } 

このデッドコードの生成を避けることはできますか?それはうまく避けることができますコンパイラの警告が発生します。

ありがとうございます!

Statement UseStatement(): 
{ 
    String dbName; 
} 
{ 
    <USE> dbName=DbObjectName() 
    { 
     return new UseStatement(dbName); 
    } 
} 

生成します:ここで

は.jjファイルからの完全な最小限の例です

final public Statement UseStatement() throws ParseException {String dbName; 
    jj_consume_token(USE); 
    dbName = DbObjectName(); 
{if ("" != null) return new UseStatement(dbName);} 
    throw new Error("Missing return statement in function"); 
    } 

さらにJavaCCのはTokenMgrErrorをスローParserTokenManagerファイルを生成している - しかし、コードがしませんコンパイル。それはcharと宣言する必要があるprotected int curCharを宣言します。このフレーズを検索すると、正確にcharと宣言されている多くの例が表示されます。これは多くの人々が結果を手動で編集することですか?

+1

JavaCCのどのバージョンを使用していますか? 'LEGACY_EXCEPTION_HANDLING = false'オプションを試しましたか? –

+1

'curChar'のタイプについてのあなたの質問に答えるために、それは多くの手編集ではありません。バージョン5は型を 'char'として生成します。 –

+0

LEGACY_EXCEPTION_HANDLINGは実際には「ユーザー設定可能」ではありませんが、変更することは可能です。下記の編集をご覧ください。使用していたMavenプラグインで使用されていたバージョンは6.1.3でしたが、元のcodehausプラグインに戻ってJavaCCのバージョンを7.xに強制する方法を考え出しました。ありがとう! –

答えて

0

私はソースに行き、デッドコードを防止するために、Options.isLegacyExceptionHandlingをトリガーしなければなりません。その後、トリガー

// Add if statement to prevent subsequent code generated 
    // from being dead code. 
    // NB: eclipse now detects 'if (true)' as dead code, so use the more complicated 
    // 'if ("" != null)' 
    if (inAction && (Options.isLegacyExceptionHandling())) { 
    t.image = "{if (\"\" != null) return"; 
    jumpPatched = true; 
    } 

if (p.isJumpPatched() && !voidReturn) { 
    if (isJavaDialect) { 
    // TODO :: I don't think we need to throw an Error/Exception to mark that a return statement is missing as the compiler will flag this error automatically 
    if (Options.isLegacyExceptionHandling()) { 
     codeGenerator.genCodeLine(" throw new "+(Options.isLegacyExceptionHandling() ? "Error" : "RuntimeException")+"(\"Missing return statement in function\");"); 
    } 
    } else { 
    codeGenerator.genCodeLine(" throw \"Missing return statement in function\";"); 
    } 
} 

https://github.com/javacc/javacc/blob/e38cbdb1db7ca8bd66f892859fef88b4876e69ba/src/main/javacc/JavaCC.jj#L2771-L2779

https://github.com/javacc/javacc/blob/2ac628df1f899fdf6acf1f87fad313b6797085f7/src/main/java/org/javacc/parser/ParseEngine.java#L707-L712

レガシー例外処理をする場合にのみJAVA_TEMPLATE_TYPE=modern falseで派生オプションです。それは正しく設定を取得する唯一の方法は、そのよう.jjファイルにoptionsブロックに含めることです。理論的には

options { 
    JAVA_TEMPLATE_TYPE="modern"; 
} 

それはまた、コマンドラインオプションを経由して設定可能であるが、これを書いているとして、それは実際にありますコマンドライン引数が解析される前に派生したオプションを設定することは不可能(​​)

+1

「従来の例外処理」をオフにする方法はありますか? – EJP

+0

はい - 私の編集を参照してください。それは少しナッツですが、私はそれを最終的に得ました。 –

関連する問題