我对 C# 知之甚少,但与 Java 目标应该没有太大区别。
ASTLabelType
您可以通过在options { ... }
部分中设置(XTree
在本例中为 an)来创建 - 并让 ANTLR 使用 - 自定义树:
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
: .
;
然后,您创建一个扩展 a 的自定义类CommonTree
:
演示/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
:
演示/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