本文系 Creating JVM language 翻译的第二篇。

总的来说,我需要实现如下三个模块:

模块 输入 输出
Lexer(词法分析器) 代码(文本格式) Token 序列
Parse(语法分析器) Token 序列 AST(抽象语法书)
Compiler(编译器) AST JVM 字节码

Lexer

词法分析器的职责是把简单的文本输入,识别为 Token(可以理解为一种记号),代码,即文本文件在词法分析之前,仅仅是无意义的字节流而已,但 Token 不同,Token 记录的类型信息对接下来的步骤很重要。

Parser

语法分析器的职责是把 Token 序列输入,组织成具有层次结构的抽象语法树(AST), AST 决定了代码是被如何执行的。

Compiler

编译器的职责是遍历 AST,并且翻译成合法的 Java 字节码。

例子

假设有表达式 int x=a*5+2,处理流程如下图所示:

AST 创建完毕后,就可以用 Compiler 生成字节码了。