2

この Java コードの AST を作成するために ANTLR 3.2 を使用しています。

テスト.java

public class Test {

    public static void main(String args[]) {

        int x = 10;

        switch(x){
            case 1:{
                break;
            }
            case 2:{
                break;
            } 
            default:
                return;          
        }  
    }
}

ANTLR wikiの Java 1.5文法を使用します。

しかし、生成された AST には重複したswitchノードがあります。

入力ファイルを解析し、生成された ASTcaseのブロック内の s と複合ブロックの数を見つけたいと考えています。switch

import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
import org.antlr.stringtemplate.*;

public class Main1 {

    public static void main(String[] args) throws Exception {

        JavaLexer lexer = new JavaLexer(new ANTLRFileStream("Test.java"));
        JavaParser parser = new JavaParser(new CommonTokenStream(lexer));
        CommonTree tree = (CommonTree)parser.javaSource().getTree();
        DOTTreeGenerator gen = new DOTTreeGenerator();
        StringTemplate st = gen.toDOT(tree);
        System.out.println(st);
    }
}

AST:

ここに画像の説明を入力

(画像をクリックすると拡大します)

ANTLR 文法にバグがありますか、それとも何か間違っていますか?

4

1 に答える 1

1

編集:この答えは正しくありませんでした。書き換えルールを読み間違え、回答を更新して対処しました。

これは、この回答が以前に参照した文法の断片です。

switchBlockLabels
    :   switchCaseLabels switchDefaultLabel? switchCaseLabels
        ->  ^(SWITCH_BLOCK_LABEL_LIST switchCaseLabels switchDefaultLabel? switchCaseLabels)
    ;

この書き換え規則では、 への参照がまたはでswitchCaseLabels記述されていないため、それぞれが規則の 1 つの要素のみを参照します。このルールでは が 2 回参照されているため、すべての結果を AST に含めるには、書き換えルールに次のいずれかを含める必要があります。+*switchCaseLabels

  • switchCaseLabels switchCaseLabels(これは現在使用されている形式です)
  • switchCaseLabels*
  • switchCaseLabels+

AST に重複したノードが含まれている理由がわかりません。

于 2013-06-12T13:08:20.963 に答える