ANTLR解析器生成以下生成的代码:

protected TreeAdaptor adaptor = new CommonTreeAdaptor();

我已经实现了自己的TreeAdaptor,并且希望解析器始终使用我的而不使用CommonTreeAdaptor()。我发现的唯一方法是每次创建新解析器时都在调用代码中设置它:
Parser parser = new MyParser();
parser.setTreeAdaptor(new MyAdaptor());

有什么方法可以设置默认的TreeAdaptor或向生成的构造函数附加一些初始化代码?

最佳答案

有什么方法可以设置默认的TreeAdaptor或向生成的构造函数附加一些初始化代码?

一种方法是添加一个设置自定义树适配器的静态方法:

grammar T;

options {
  output=AST;
  ASTLabelType=CommonTree;
}

@parser::members {

  public static TParser newTParser(TreeNodeStream input) {
    TParser parser = new TParser(input);
    parser.setTreeAdaptor(new MyAdaptor());
    return parser;
  }
}

parse
 : Any* EOF
 ;

Any
 : .
 ;

然后您可以替换:
TParser parser = new TParser(input);


TParser parser = TParser.newTParser(input);

08-16 19:29