本文系 Creating JVM language 翻譯的第 6 篇。 原文中的程式碼和原文有不一致的地方均在新的程式碼倉庫中更正過,建議參考新的程式碼倉庫。
原始碼
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 模式是一個正確的選擇。