java前端编译器的入口在com.sun.tools.javac.Main,然而跟着main方法走下去,你会发现真正的实现内容在com.sun.tools.javac.main.JavaCompiler类的compile()方法中。
借用《深入理解java虚拟机》中的一张图片,实际的解析分为多个步骤。
0.初始化插入式注解处理器(非必须)
1.词法分析、
2.语法分析
3.输入到符号表
4.执行注解处理
5.属性分析
6.数据流分析
7.解析语法糖
8.生成字节码
源码中有一个枚举类描述了解析的过程,可以作为参考:
public enum CompileState {
INIT(0),
PARSE(1),
ENTER(2),
PROCESS(3),
ATTR(4),
FLOW(5),
TRANSTYPES(6),
UNLAMBDA(7),
LOWER(8),
GENERATE(9);
}
因为第0步非必须,我们从第一步词法分析开始
二、词法解析
javac的词法解析器是com.sun.tools.javac.parser.Scanner,实现代码在com.sun.tools.javac.parser.JavaTokenizer,其中核心方法是readToken(),其中
scanIdent()用了解析一个标识符;
scanNumber()用于解析一个数字,包括二进制、8进制、十进制和十六进制;
scanOperator()用了解析加减乘除等操作符;
scanLitChar()解析一个字符串字面量;
词法分析的结果是一个token流