如何更改应用于antlr4生成的类和方法的访问修饰符?

问题描述

我不希望antlr生成的类和方法公开给公共API。

一个6岁的答案Antlr generated classes access modifier to internal。但我希望有一种更现代,更真实的方法来实现这一目标。

解决方法

AFAIK,您不能。您可以在语法中使用superClass选项,以便扩展自定义解析器类,在其中仅定义要公开的那些方法:

grammar T;

options {
  superClass=MyParser;
}

parse
 : id+ EOF
 ;

id
 : ID
 ;

ID
 : [a-zA-Z] [a-zA-Z0-9_]*
 ;

和您的MyParser类可能如下所示:

public abstract class MyParser extends Parser {

    public MyParser(TokenStream input) {
        super(input);
    }

    abstract TParser.ParseContext parse() throws RecognitionException;
}

然后像这样实例化解析器:

TLexer lexer = new TLexer(CharStreams.fromString("foo"));
MyParser parser = new TParser(new CommonTokenStream(lexer));
parser.parse(); // OK
parser.id();    // No can do

但是我实际上需要隐藏整个班级。这个类应该是内部的,它在lib的内部方法中被调用

您不能执行AFAIK。我想,您必须使用一些构建后脚本(简单的搜索/替换)来添加自己。