有没有办法创建/扩展用于在 ANTLR 中生成 .dot 文件的默认模板?
我的节点中有一些自定义属性,我想在我的树上进行可视化,而不是每次都必须将它们打印到控制台。
我目前只有 StringTemplate (V3) 的基本工作知识。
谢谢。
有没有办法创建/扩展用于在 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));