2013-02-16 2 views
2

Есть ли способ создать/расширить шаблон по умолчанию для генерации .dot-файлов в ANTLR?ANTLR Custom DOT Template

У меня есть некоторые пользовательские свойства в моих узлах, которые я хотел бы визуализировать на своем дереве, вместо того, чтобы каждый раз печатать их на консоли.

В настоящее время у меня есть только базовое рабочее знание StringTemplate (V3).

Спасибо.

ответ

0

Что вы можете сделать, это:

  • расширить 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; 
    } 
} 

Использовать его следующим образом:

+0

Thanks Bart. Однако я использую C#, и соответствующий класс C# не имеет ни одного из полей, которые имеет версия Java. Weird. –

+0

Затем я предлагаю вам посмотреть исходный код [C#] (https://github.com/antlr/antlr3/blob/master/runtime/CSharp3/Sources/Antlr3.Runtime/Tree/DotTreeGenerator.cs) для 'DotTreeGenerator' и внести соответствующие изменения. –