Я немного знаю C #, но не должно быть большой разницы с целью Java.
Вы можете создать - и позволить ANTLR использовать - собственное дерево, установив ASTLabelType
в options { ... }
section (в данном случае XTree
):
Tg
grammar T;
options {
output=AST;
ASTLabelType=XTree;
}
tokens {
ROOT;
}
@parser::header {
package demo;
import demo.*;
}
@lexer::header {
package demo;
import demo.*;
}
parse
: Any* EOF -> ^(ROOT Any*)
;
Any
: .
;
Затем вы создаете собственный класс, который расширяет CommonTree
:
demo / XTree.java
package demo;
import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
public class XTree extends CommonTree {
public XTree(Token t) {
super(t);
}
public void x() {
System.out.println("XTree.text=" + super.getText() + ", children=" + super.getChildCount());
}
}
и когда вы создаете экземпляр вашего TParser
, вы должны создать и установить пользовательский TreeAdaptor
, который создает экземпляры вашего XTree
:
demo / Main.java
package demo;
import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
public class Main {
public static void main(String[] args) throws Exception {
String source = "ABC";
TLexer lexer = new TLexer(new ANTLRStringStream(source));
TParser parser = new TParser(new CommonTokenStream(lexer));
parser.setTreeAdaptor(new CommonTreeAdaptor(){
@Override
public Object create(Token t) {
return new XTree(t);
}
});
XTree root = (XTree)parser.parse().getTree();
root.x();
}
}
При запуске демо:
java -cp antlr-3.2.jar org.antlr.Tool T.g -o demo/
javac -cp antlr-3.2.jar demo/*.java
java -cp .:antlr-3.2.jar demo.Main
будет напечатано:
XTree.text=ROOT, children=3
Для получения дополнительной информации см .: http://www.antlr.org/wiki/display/ANTLR3/Tree+construction