衣锦夜行^O^ 2023-01-15 20:36 采纳率: 0%
浏览 27

ANTLR4迁移至多语言时的问题

在使用ANTLR4编写多种程序语言代码生成JSON格式的抽象语法树(AST)过程中,我重写了Listener类以实现逐个访问ast。现在我扩展其他语言时发现我重写的MyListener类继承自我自定义的语法MyCGrammer的listener基类,即MyCGrammerBaseListener。

public class MyListener extends MyCGrammerBaseListener{
    public String oFile=new String();
    public Stack<ASTNode> NodeStack=new Stack<>();
    @Override public void enterCompilationUnit(MyCGrammerParser.CompilationUnitContext ctx) {
        ASTCompilationUnit node = new ASTCompilationUnit();
        NodeStack.push(node);
    }
    @Override public void exitCompilationUnit(MyCGrammerParser.CompilationUnitContext ctx) {
        ASTNode node=NodeStack.pop();
        node.children.addAll(((ASTCompilationUnit)node).items);

以上代码中MyCGrammerBaseListener和MyCGrammerParser.CompilationUnitContext都是我自己测试用的语法用antlr编译出来的库,无法迁移至其他语言。

我的解答思路和尝试过的方法

我曾尝试过把MyCGrammerParser改成org.antlr.v4.runtime.Parser,因为前者继承自后者,但是改完后org.antlr.v4.runtime.Parser并没有CompilationUnitContext方法。

我想要达到的结果

不知道有没有人知道ANTLR的listener是否有共同基类,可以方便的为多种语言做扩展的。(可以在实际调用函数中传入不同语言Parser,Lexer,Listener对象,定义时用其共同的基类)

  • 写回答

2条回答 默认 最新

  • 流比 2023-01-15 21:52
    关注

    ANTLR提供了一种使用相同的Listener类来解析不同语言语法的方法。这种方法是通过使用ANTLR的统一语法来实现的。

    具体来说,你可以编写一个统一语法,然后使用这个语法来生成不同语言的词法和语法分析器。这些分析器可以使用相同的Listener类来解析语法树。

    你可以使用ANTLR的统一语法来实现这一点。这个语法可以支持多种语言,并且可以使用相同的语法来生成不同语言的词法和语法分析器。

    具体实现可以参考ANTLR官方文档,里面有更加详细的说明,或者参考其他相关资料。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月15日

悬赏问题

  • ¥15 comsol仿真压阻传感器
  • ¥15 Python线性规划函数optimize.linprog求解为整数
  • ¥15 llama3中文版微调
  • ¥15 时间序列预测算法 预测结果出现负值
  • ¥15 在win系统Django虚拟环境下载mysqlclient报错
  • ¥15 pg数据库导入数据序列重复
  • ¥15 三分类机器学习模型可视化分析
  • ¥15 本地测试网站127.0.0.1 已拒绝连接,如何解决?(标签-ubuntu)
  • ¥50 Qt在release捕获异常并跟踪堆栈(有Demo,跑一下环境再回答)
  • ¥30 python,LLM 文本提炼