首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展ANTLR3 AST

扩展ANTLR3 AST
EN

Stack Overflow用户
提问于 2011-10-03 13:34:49
回答 1查看 1.4K关注 0票数 3

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

代码语言:javascript
复制
options
{
   language = "CSharp";
   namespace = "Extended.Tokens";
}

tokens {
   TOKEN<AST=Extended.Tokens.TokenNode>;
}

然后,您可以创建一个类:

代码语言:javascript
复制
public class TokenNode: antlr.BaseAST
{
    ...
}

如果可以使用这样的方法(将类创建委托给AST工厂,而不是我手动执行树复制),那么还可以使用任何ideea吗?它的工作不仅仅是简单的语法定义拷贝,从旧到新的格式,我试图搜索他们的网站和样本,以寻找一些类似的。有什么暗示吗?

编辑

我不是试图创建自定义令牌,而是自定义“节点解析器”。

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

  1. 创建“树访问者”并处理值,或者
  2. 通过“几乎复制”语法定义创建树解析器。

在v2的情况下,我可以将树节点装饰成我想要的任何方法,然后在解析器运行后调用它们,只需从根节点调用类似于'execute‘之类的东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-03 18:42:42

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

您可以通过在ASTLabelType部分中设置options { ... } (本例中为XTree )来创建--并让ANTLR使用--自定义树:

T.g

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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();
  }
}

运行演示:

代码语言:javascript
复制
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

将印刷:

代码语言:javascript
复制
XTree.text=ROOT, children=3

有关更多信息,请参见:http://www.antlr.org/wiki/display/ANTLR3/Tree+construction

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7635729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档