Tree ANTLR自定义点模板

Tree ANTLR自定义点模板,tree,antlr,dot,stringtemplate,abstract-syntax-tree,Tree,Antlr,Dot,Stringtemplate,Abstract Syntax Tree,是否有方法创建/扩展默认模板以在ANTLR中生成.dot文件 我的节点中有一些自定义属性,我想在我的树上可视化这些属性,而不是每次都必须将它们打印到控制台上 目前我只掌握StringTemplate(V3)的基本工作知识 谢谢。你能做的是: 扩展DOTTreeGenerator并更改构造函数中的(静态)节点模板 覆盖其getNodeST,并将自定义属性添加到模板中 演示如何添加每个树的子计数: // Original source of DOTTreeGenerator: // https

是否有方法创建/扩展默认模板以在ANTLR中生成.dot文件

我的节点中有一些自定义属性,我想在我的树上可视化这些属性,而不是每次都必须将它们打印到控制台上

目前我只掌握StringTemplate(V3)的基本工作知识

谢谢。

你能做的是:

  • 扩展
    DOTTreeGenerator
    并更改构造函数中的(静态)节点模板
  • 覆盖其
    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));

谢谢你,巴特。但是,我使用的是C#,相应的C#类没有Java版本所具有的任何字段。奇怪。然后我建议您查看for
DotTreeGenerator
,并进行相应的更改。