Tree 扩展ANTLR3 AST和x27;s

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工厂,而不是我手动执行树复制),是否有任何想法?它不能仅仅通过简单的语法定义从旧格式复制到新格式,我试图搜索他们的网站和样本,寻找类似的东西

使用ANTLR2,您可以在语法定义文件中定义如下内容:

options
{
   language = "CSharp";
   namespace = "Extended.Tokens";
}

tokens {
   TOKEN<AST=Extended.Tokens.TokenNode>;
}
如果可以使用类似的方法(将类创建委托给AST工厂,而不是我手动执行树复制),是否有任何想法?它不能仅仅通过简单的语法定义从旧格式复制到新格式,我试图搜索他们的网站和样本,寻找类似的东西。有什么提示吗

编辑 我并没有尝试创建自定义标记,而是创建自定义的“节点解析器”

为了“执行”一棵树,您有两个选择(据我所知):

  • 创建“树访问者”并处理值,或
  • 通过“几乎复制”语法定义来创建树解析器 在v2的情况下,我可以将树节点修饰成我想要的方法,然后在解析器运行后通过从根节点调用类似于“execute”的东西来调用它们。

    我对C#知之甚少,但与Java目标应该没有太大区别

    通过在
    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
    {
        ...
    }