抽象语法树AST的全面解析(一)
Javac编译概述
将.java源文件编译成.class文件,这一步大致可以分为3个过程:
1、把所有的源文件解析成语法树,输入到编译器的符号表;
2、注解处理器的注解处理过程;
3、分析语法树并生成字节码。
javac编译过程.png
Parse and Enter
1.词法分析: 通过Scanner将源码的字符流解析成Token流
通过词法分析器分析源文件中的所有字符,将所有的单词或字符都转化成符合规范的Token,规范化的token可以分成一下三种类型:
- java关键字:public, static, final, String, int等等;
- 自定义的名称:包名,类名,方法名和变量名;
- 运算符或者逻辑运算符等符号:+、-、*、/、&&,|| 等等。
int x=y+1;
这一行代码解析成token流如下:
token流.png
2.语法分析: 根据token流,利用TreeMaker,以JCTree的子类作为语法节点来构建抽象语法树
抽象语法树(Abstract Syntax Tree)是一种用来描述程序代码语法结构的树形表示方式,语法树的每一个节点都代表着程序代码中的一个语法结构, 如包、类型、修饰符、运算符、接口、返回值都可以是一个语法结构。
package com.example.adams.astdemo;
public class TestClass {int x = 0;int y = 1;public int testMethod(){int z = x + y;return z;}
}
对应的抽象语法树如下:
3.将java类中的符号输入到符号表中
符号表是由一组符号地址和符号信息构成的表格;符号表中所登记的信息在编译的不同阶段都要用到,在语法分析中, 符号表所登记的内容将用于语义检查和产生中间代码。在目标代码生成阶段, 符号表是当对符号名进行地址分配时的依据。
- 将所有类中出现的符号输入到类自身的符号表中,所有类符号、类的参数类型符号(泛型参数类型)、超类符号和继承的接口类型符号等都存储到一个未处理的列表(To Do List)中;
- 将这个未处理的列表中所有的类都解析到各自的类符号列表中,这个操作是在MemberEnter.complete()中完成(默认构造器也是在这里完成的)。
Annotation Processing
在JDK 1.5之后,Java语言提供了对注解(Annotation)的支持,注解与普通的Java关键字一样,而在JDK 1.6中实现了JSR-269规范JSR-269:Pluggable Annotations Processing API(插入式注解处理API)。提供了一组插入式注解处理器的标准API在编译期间对注解进行处理;在注解处理期间,我们可以获取到所有的抽象语法树,可以对抽象语法树进行增删改查;语法树被修改过之后,编译器将回到解析及填充符号表的过程重新处理,直到所有插入式注解处理器都没有再对语法树进行修改为止。
Parse and Enter
1.语义分析
语义分析的主要任务是对结构正确的源程序进行上下文有关性质的审查,过程分为标注检查和数据及控制流分析两个步骤:
- 标注检查
检查语义合法性、进行逻辑判断,如变量使用前是否已被声明、变量与赋值之间的数据类型是否能够匹配等; - 数据及控制流分析
在Javac的源码中,数据及控制流分析的入口是图中的flow(),由com.sun.tools.javac.comp.Flow类来完成,作用是对程序上下文逻辑更进一步的验证,检查局部变量在使用前是否有赋值、方法的每条路径是否都有返回值、是否所有的受查异常都被正确处理了等问题。
2.解语法糖
语法糖(Syntactic Sugar),也称糖衣语法,指在计算机语言中添加的某种语法,Java中最常用的语法糖主要是的泛型擦除、变长参数、自动装箱/拆箱、条件编译等,解语法糖就是还原回简单的基础语法结构。
3.生成字节码
字节码生成是Javac编译过程的最后一个阶段,由com.sun.tools.javac.jvm.Gen类来完成;把前面各个步骤所生成的信息(语法树、符号表)转化成字节码,再将字节码输出到*.class文件中。
总结
通过javac的编译原理可以得出:
1.抽象语法树是一种描述程序代码语法结构的树形表示方式;
2.对java源文件经过词语法分析,构建出抽象语法树;
3.我们可以在注解处理器中获取到抽象语法树。
作者:zl_adams
链接:https://www.jianshu.com/p/ff8ec920f5b9
抽象语法树AST的全面解析(一)相关推荐
- java抽象语法树_抽象语法树AST的全面解析(一)
Javac编译概述 将.java源文件编译成.class文件,这一步大致可以分为3个过程: 1.把所有的源文件解析成语法树,输入到编译器的符号表: 2.注解处理器的注解处理过程: 3.分析语法树并生成 ...
- 理解Babel是如何编译JS代码的及理解抽象语法树(AST)
Babel是如何编译JS代码的及理解抽象语法树(AST) 1. Babel的作用是? 很多浏览器目前还不支持ES6的代码,但是我们可以通过Babel将ES6的代码转译成ES5代码,让所有的浏览器 ...
- 什么是抽象语法树(AST)
原创: 弗拉 码农翻身 作者: 弗拉@重度前端 https://segmentfault.com/a/1190000017992387 已经获得作者独家授权发布,老刘做了改编. 张大胖一上班,领导就扔 ...
- java抽象语法树(ast),【你应该了解的】抽象语法树AST
团队:skFeTeam 本文作者:李世伟 作为前端程序员,webpack,rollup,babel,eslint这些是不是经常用到?他们是打包工具,代码编译工具,语法检查工具.他们是如何实现的呢?本 ...
- 抽象语法树AST以及babel原理
什么是AST? 借用一下百度百科的解释: 在计算机科学中,抽象语法树(Abstract Syntax Tree,AST),或简称语法树(Syntax tree),是源代码语法结构的一种抽象表示.它以树 ...
- php7 ast,PHP7新特性之抽象语法树(AST)带来的变化详解
本文分析了PHP7新特性之抽象语法树(AST)带来的变化.分享给大家供大家参考,具体如下: 这里大部分内容参照 AST 的 RFC 文档而成:https://wiki.php.net/rfc/abst ...
- 【编译原理】构建一个简单的解释器(Let’s Build A Simple Interpreter. Part 7.)(笔记)解释器 interpreter 解析器 parser 抽象语法树AST
[编译原理]让我们来构建一个简单的解释器(Let's Build A Simple Interpreter. Part 7.) 文章目录 python代码 插--后序遍历 C语言代码(有错误) C语言 ...
- js最小化浏览器_「译」解析、抽象语法树(ast) +如何最小化解析时间的5个技巧...
前言 该系列课程会在本周陆续更新完毕,主要讲解的都是工作中可能会遇到的真实开发中比较重要的问题以及相应的解决方法.通过本系列的课程学习,希望能对你日常的工作带来些许变化.当然,欢迎大家关注我,我将持续 ...
- 从零写一个编译器(九):语义分析之构造抽象语法树(AST)
项目的完整代码在 C2j-Compiler 前言 在上一篇完成了符号表的构建,下一步就是输出抽象语法树(Abstract Syntax Tree,AST) 抽象语法树(abstract syntax ...
最新文章
- Spring Boot微服务中Chaos Monkey的应用
- 001_Servlet简介
- linux sort
- hdu 1286 找新朋友 欧拉函数模版题
- 【LiveVideoStack线上分享】WebAssembly在Web多媒体领域的相关实践
- Makefile中怎么使用Shell if判断
- ORACLE JDBC 对千万数据 批量删除和批量插入
- Office LTSC 2021 for Mac
- oracle用plsql导出表结构与数据
- WPS表格 JSA 学习笔记 - 实现贪吃蛇
- JAVA中interface接口的使用
- 365天深度学习训练营-第P5周:运动鞋识别
- 在 Jetpack Compose 中安全地使用数据流
- 账号密码登录和注册业务逻辑
- 删除所有奇数顺序表c语言,如何删除列表中的所有奇数序数项?
- vsto 删除exccel十万数据表格都有数据慢解决
- 全新同步整流IC助力SMPS应用更简易、更高效
- 特步2020年总收入81.72亿元,主品牌下半年显著复苏
- 物联网ARM开发-4协议-单总线应用温湿度传感器
- 使用php生成二维码
热门文章
- 因为计算机丢失D3DCOMPILER_47.dll 的解决方法
- VBA、.net查汉字区位码
- python爬虫学习笔记分析Ajax爬取果壳网文章
- 任志强:松房贷等政策出台后 房价将U型缓慢回升
- volatility内存取证学习,美亚杯比赛版,密码+注册表
- 水平集(Level Set)的基本方法
- SL651-2014 《水文监测数据通信规约》 人工置数详解
- 电子商务应围绕网商、网货、网规三要素 - 卫哲
- matlab watershed函数简单实现_薛定宇教授大讲堂(卷):MATLAB程序设计|文末赠书...
- vue_云点播TCPlayer