2013-02-16 86 views
2

有没有办法创建/扩展在ANTLR中生成.dot文件的默认模板?ANTLR自定义DOT模板

我在我的节点上有一些自定义属性,我想在树上进行可视化处理,而不是每次都将它们打印到控制台。

我目前只具备StringTemplate(V3)的基本工作知识。

谢谢。

回答

0

你可以做的是:

  • 延长DOTTreeGenerator和改变(静态)节点模板的构造
  • 覆盖其getNodeST和您的自定义属性(S)添加到模板

的演示,演示如何增加每棵树的孩子数:

// 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)); 
+0

Thanks Bart。不过,我使用的是C#,而相应的C#类没有任何Java版本所具有的字段。奇怪的。 – 2013-02-17 15:33:13

+0

然后我建议你看一下[DotTreeGenerator]的[C#源代码](https://github.com/antlr/antlr3/blob/master/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/DotTreeGenerator.cs)并相应地做出改变。 – 2013-02-17 19:37:07