Javac分四个模块:词法分析器,语法分析器,语义分析器,代码生成器。
整个流程如下图:

本文先记录词法分析器的工作过程,文中出现的源码出自Jdk9
首先来看一下词法分析器设计的类图:

Lexer和Parser:Javac的主要词法分析器的接口类
Scanner:Lexer的默认实现类,逐个读取java源文件的单个字符,对读取到的词法进行归类
JavacParser:规定哪些词是符合Java语言规范的
Token:规定了所有Java语言的合法关键词
Names:存储和表示解析后的词法
词法分析过程是在JavacParser的parseCompilationUnit方法中完成的:
public JCTree.JCCompilationUnit parseCompilationUnit() {
Token firstToken = token;
JCModifiers mods = null;
boolean consumedToplevelDoc = false;
boolean seenImport = false;
boolean seenPackage = false;
ListBuffer<JCTree> defs = new ListBuffer<>();
if (token.kind == MONKEYS_AT)
// 解析修饰符 "@"
mods = modifiersOpt();
if (token.kind == PACKAGE) {
// 解析package声明
int packagePos = token.pos;
List<JCAnnotation> annotations = List.nil();
seenPackage = true;
if (mods != null) {
checkNoMods(mods.flags);
annotations = mods.annotations;
mods = null;
}
nextToken();
JCExpression pid = qualident(false);
accept(SEMI);
JCPackageDecl pd = F.a