我对C#了解很少,但与Java目标应该没有太大区别。
您可以通过设置来创建并让 ANTLR 使用自定义树ASTLabelType
in the options { ... }
节(一个XTree
在这种情况下):
T.g
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
:
演示/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