美文网首页
手拉手教你实现一门编程语言 Enkel, 系列 6

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

作者: KevinOfNeu | 来源:发表于2018-09-08 01:30 被阅读0次

    本文系 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 模式是一个正确的选择。

    相关文章

      网友评论

          本文标题:手拉手教你实现一门编程语言 Enkel, 系列 6

          本文链接:https://www.haomeiwen.com/subject/scfkgftx.html