java编译器源码解析-词法分析

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流

posted @ 2022-04-14 16:15  Mars.wang  阅读(344)  评论(0编辑  收藏  举报