使用ANTLR2,您可以在语法定义文件中定义如下内容:
options
{
language = "CSharp";
namespace = "Extended.Tokens";
}
tokens {
TOKEN<AST=Extended.Tokens.TokenNode>;
}然后,您可以创建一个类:
public class TokenNode: antlr.BaseAST
{
...
}如果可以使用这样的方法(将类创建委托给AST工厂,而不是我手动执行树复制),那么还可以使用任何ideea吗?它的工作不仅仅是简单的语法定义拷贝,从旧到新的格式,我试图搜索他们的网站和样本,以寻找一些类似的。有什么暗示吗?
编辑
我不是试图创建自定义令牌,而是自定义“节点解析器”。
为了“执行”一棵树,您有两个选择(据我理解):
在v2的情况下,我可以将树节点装饰成我想要的任何方法,然后在解析器运行后调用它们,只需从根节点调用类似于'execute‘之类的东西。
发布于 2011-10-03 18:42:42
我对C#知之甚少,但与Java目标没有太大区别。
您可以通过在ASTLabelType部分中设置options { ... } (本例中为XTree )来创建--并让ANTLR使用--自定义树:
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
https://stackoverflow.com/questions/7635729
复制相似问题