手拉手教你实现一门编程语言 Enkel, 系列 6

本文探讨了在Enkel编译器设计与实现中,使用Visitor模式相较于Listener模式的优势,包括减少代码量和降低错误率。通过代码示例对比,展示了Visitor模式如何简化语法解析过程。

本文系 Creating JVM language 翻译的第 6 篇。 原文中的代码和原文有不一致的地方均在新的代码仓库中更正过,建议参考新的代码仓库。

源码

Github

Visitor vs listener

之前的章节中,我都使用了 listener 来实现 Enkel 的解析器。Antlr 提供了另一种方式-- Visitor。我们需要在命令里加 -visiotor 来显示的开启。

我专门写了一篇博客,来探讨究竟哪种方式更适合 Enkel 的编译器设计和实现。

下面我们简要列举 Visitor 模式带来的好处:

  • 更少的代码
  • 更少的 BUG。无需把解析的结果保存到变量里。

对比代码如下:

//Listener
class ClassListener extends EnkelBaseListener<ClassDeclaration> {

        private Class parsedClass;

        @Override
        public void enterClassDeclaration(@NotNull EnkelParser.ClassDeclarationContext ctx) {
            String className = ctx.className().getText();
            //do some other stuff
            parsedClass = new Class(className,methods);
        }

        public Class getParsedClass() {
            return parsedClass;
        }
    }
复制代码
//Visitor
public class ClassVisitor extends EnkelBaseVisitor<ClassDeclaration> {

    @Override
    public ClassDeclaration visitClassDeclaration(@NotNull EnkelParser.ClassDeclarationContext ctx) {
        String name = ctx.className().getText();
        //do some other stuff
        return new ClassDeclaration(name, methods);
    }
}
复制代码

由此来看,切换到 Visitor 模式是一个正确的选择。

转载于:https://juejin.im/post/5b914b75f265da0aa6649ea2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值