2

ANTLR で .dot ファイルを生成するための既定のテンプレートを作成/拡張する方法はありますか?

毎回コンソールに出力するのではなく、ツリーで視覚化したいノードにいくつかのカスタム プロパティがあります。

現時点では、StringTemplate (V3) の基本的な知識しかありません。

ありがとう。

4

1 に答える 1

0

あなたができることは次のとおりです。

  • DOTTreeGeneratorコンストラクターで (静的) node-template を拡張および変更する
  • それをオーバーライドしgetNodeST、カスタム属性をテンプレートに追加します

各ツリーの子カウントを追加する方法を示すデモ:

// Original source of DOTTreeGenerator: 
// https://github.com/antlr/antlr3/blob/master/runtime/Java/src/main/java/org/antlr/runtime/tree/DOTTreeGenerator.java
class MyDOTTreeGenerator extends DOTTreeGenerator {

    public MyDOTTreeGenerator() {
        // added ", childCount=$childCount$"
        DOTTreeGenerator._nodeST = new StringTemplate("$name$ [label=\"text=$text$, childCount=$childCount$\"];\n");
    }

    @Override
    protected StringTemplate getNodeST(TreeAdaptor adaptor, Object t) {

        // cast "t" to your own tree implementation
        CommonTree tree = (CommonTree)t;
        String text = adaptor.getText(t);
        StringTemplate nodeST = _nodeST.getInstanceOf();
        String uniqueName = "n"+getNodeNumber(t);
        nodeST.setAttribute("name", uniqueName);

        // set the "childCount" attribute 
        nodeST.setAttribute("childCount", tree.getChildCount());
        nodeST.setAttribute("text", fixString(text));
        return nodeST;
    }
}

次のように使用します。

TLexer lexer = new TLexer(new ANTLRStringStream("..."));
TParser parser = new TParser(new CommonTokenStream(lexer));
CommonTree root = parser...
MyDOTTreeGenerator gen = new MyDOTTreeGenerator();
System.out.println(gen.toDOT(root));
于 2013-02-16T08:09:08.900 に答える