Tree 扩展ANTLR3 AST和x27;s
使用ANTLR2,您可以在语法定义文件中定义如下内容:Tree 扩展ANTLR3 AST和x27;s,tree,antlr,antlr3,tree-nodes,heterogeneous,Tree,Antlr,Antlr3,Tree Nodes,Heterogeneous,使用ANTLR2,您可以在语法定义文件中定义如下内容: options { language = "CSharp"; namespace = "Extended.Tokens"; } tokens { TOKEN<AST=Extended.Tokens.TokenNode>; } 如果可以使用类似的方法(将类创建委托给AST工厂,而不是我手动执行树复制),是否有任何想法?它不能仅仅通过简单的语法定义从旧格式复制到新格式,我试图搜索他们的网站和样本,寻找类似的东西
options
{
language = "CSharp";
namespace = "Extended.Tokens";
}
tokens {
TOKEN<AST=Extended.Tokens.TokenNode>;
}
如果可以使用类似的方法(将类创建委托给AST工厂,而不是我手动执行树复制),是否有任何想法?它不能仅仅通过简单的语法定义从旧格式复制到新格式,我试图搜索他们的网站和样本,寻找类似的东西。有什么提示吗
编辑
我并没有尝试创建自定义标记,而是创建自定义的“节点解析器”
为了“执行”一棵树,您有两个选择(据我所知):
options{…}
部分(在本例中是XTree
)中设置ASTLabelType
,可以创建并让ANTLR使用自定义树:
T.g
语法T;
选择权{
输出=AST;
ASTLabelType=XTree;
}
代币{
根;
}
@解析器::头{
包装演示;
导入演示。*;
}
@lexer::header{
包装演示;
导入演示。*;
}
作语法分析
:Any*EOF->^(ROOT Any*)
;
任何
: .
;
然后创建一个自定义类,该类扩展了CommonTree
:
demo/XTree.java
软件包演示;
导入org.antlr.runtime.*;
导入org.antlr.runtime.tree.*;
公共类XTree扩展了CommonTree{
公共XTree(令牌t){
超级(t);
}
公共空间x(){
System.out.println(“XTree.text=“+super.getText()+”,children=“+super.getChildCount());
}
}
当您创建TParser
的实例时,必须创建并设置自定义TreeAdaptor
,以创建XTree
的实例:
demo/Main.java
软件包演示;
导入org.antlr.runtime.*;
导入org.antlr.runtime.tree.*;
公共班机{
公共静态void main(字符串[]args)引发异常{
字符串source=“ABC”;
TLexer lexer=新的TLexer(新的AntlStringStream(源));
TParser parser=newtparser(newcommontokenstream(lexer));
setTreeAdaptor(新的CommonTreeAdaptor(){
@凌驾
公共对象创建(令牌t){
返回新的XTree(t);
}
});
XTree root=(XTree)parser.parse().getTree();
root.x();
}
}
运行演示:
java-cp-antlr-3.2.jar org.antlr.Tool T.g-o演示/
javac-cp antlr-3.2.jar demo/*.java
java-cp.:antlr-3.2.jar demo.Main
将打印:
XTree.text=ROOT,children=3
有关更多信息,请参阅:抱歉,这是一个输入错误:此定义与v2一起使用。我编辑了这篇文章,有什么意义吗?有没有办法在ANTLR3中实现类似于ANTLR2的东西?不是自定义标记,而是自定义“节点解析器”。为了“执行”一棵树,你有2个选择(据我所知):1。创建“树访问者”并处理值和2。通过“几乎复制”语法定义来创建树解析器。在v2的情况下,我可以将树节点修饰成我想要的方法,然后在解析器运行后通过从根节点调用类似“execute”的东西来调用它们。这不是我想要的。。。在我看到的示例中(-“AST工厂”和“异构AST”),您可以定义要为特定令牌创建的类。在您的示例中,可以在解析树后创建单个对象类型(XTree)。在
CommonTreeAdaptor
的create
方法中,您可以根据作为参数传递的标记返回任何您喜欢的树,无论是XTree
还是YTree
,这都无关紧要。在这种情况下,您可能需要将ASTLabelType
更改为CommonTree
或所有自定义树扩展的其他类。我想我找到了我要查找的:(异构树节点)。谢谢你的提示!:-)我刚刚发了一个链接到那个!:)当然不客气。
public class TokenNode: antlr.BaseAST
{
...
}