OpenJDK源码研究笔记(十一):浅析Javac编译过程中的抽象语法树(IfElse,While,Switch等语句的抽象和封装)
浅析OpenJDK源码编译器Javac的语法树包com.sun.source.tree。
抽象语法树,是编译原理中的经典问题,有点难,本文只是随便写写。
0.赋值语句
public interface AssignmentTree extends ExpressionTree {
    ExpressionTree getVariable();
    ExpressionTree getExpression();
}
一个赋值语句的表达式,variable = expression,例如 a = a+1。
按照AssignmentTree 接口中的抽象,一个赋值语句的抽象语法树可以拆分成2个部分:左边的变量和右边的表达式。
变量和表达式也都是一个语法树。
更多语句
1.块语句
语法:{ }, { statements }, static { statements }
抽象语法树定义
public interface BlockTree extends StatementTree {
    /**
     * 是否为静态初始化
     */
    boolean isStatic();
    /**
     * 初始化语句集合
     */
    List<? extends StatementTree> getStatements();
}
2.类的定义
语法:modifiers class simpleName typeParameters extends extendsClause implements implementsClause {
members
}
抽象语法树定义
public interface ClassTree extends StatementTree {
    /**
     * 类的修饰符
     */
    ModifiersTree getModifiers();
    /**
     * 类的简单名字
     */
    Name getSimpleName();
    /**
     * 类的参数类型
     */
    List<? extends TypeParameterTree> getTypeParameters();
    /**
     * 类的继承父类的语句
     */
    Tree getExtendsClause();
    /**
     * 类的实现接口的语句
     */
    List<? extends Tree> getImplementsClause();
    /**
     * 类的成员集合
     */
    List<? extends Tree> getMembers();
}
3.Do-While循环
语法:do
statement
while ( expression );
抽象语法树定义
public interface DoWhileLoopTree extends StatementTree {
    /**
     * 条件表达式
     */
    ExpressionTree getCondition();
    /**
     * 条件成立时,执行的语句
     */
    StatementTree getStatement();
}
4.For-each循环
语法:for ( variable : expression )
statement
抽象语法树定义
public interface EnhancedForLoopTree extends StatementTree {
    /**
     * for-each循环中的变量定义
     */
    VariableTree getVariable();
    /**
     * for-each循环中的需要遍历的变量(表达式)
     */
    ExpressionTree getExpression();
    /**
     * for-each一次遍历过程中的语句
     */
    StatementTree getStatement();
}
5.传统的for循环
语法:for ( initializer ; condition ; update )
statement
抽象语法树定义
public interface ForLoopTree extends StatementTree {
    /**
     * for循环中的初始化语句集合
     */
    List<? extends StatementTree> getInitializer();
    /**
     * for循环中的判断条件
     */
    ExpressionTree getCondition();
    /**
     * for循环中的更新条件语句
     */
    List<? extends ExpressionStatementTree> getUpdate();
    /**
     * for循环中一次遍历执行的语句
     */
    StatementTree getStatement();
}
6.Switch语句
语法:switch ( expression ) {
cases
}
抽象语法树定义
public interface SwitchTree extends StatementTree {
    /**
     * switch语句的条件表达式
     */
    ExpressionTree getExpression();
    /**
     * switch语句的case表达式集合
     */
    List<? extends CaseTree> getCases();
}
更多语句的语法定义和抽象语法树,与上面的类似,不再赘述。
编译器的编译过程和抽象语法树等概念,是比较难的。
大部分的同学,只需要了解即可。
原文参见:http://FansUnion.cn/articles/3086(小雷网-FansUnion.cn)
OpenJDK源码研究笔记(十一):浅析Javac编译过程中的抽象语法树(IfElse,While,Switch等语句的抽象和封装)的更多相关文章
- OpenJDK源码研究笔记(十三):Javac编译过程中的上下文容器(Context)、单例(Singleton)和延迟创建(LazyCreation)3种模式
		
在阅读Javac源码的过程中,发现一个上下文对象Context. 这个对象用来确保一次编译过程中的用到的类都只有一个实例,即实现我们经常提到的"单例模式". 今天,特意对这个上下文 ...
 - OpenJDK源码研究笔记(八)-详细解析如何读取Java字节码文件(.class)
		
在上一篇OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构中,我们大致了解了Java字节码文件的结构. 本篇详细地介绍了如何读取.class文件的大部分细节. 1.构造文件 ...
 - OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构
		
最近在看OpenJDK源码的过程中,顺便看了Java编译器(javac)的源码. 为了理解javac的源码,需要先搞懂Java字节码文件(.class)的结构. 于是,我就认真看了下OpenJDK中J ...
 - OpenJDK源码研究笔记(十):枚举的高级用法,枚举实现接口,竟是别有洞天
		
在研究OpenJDK,Java编译器javac源码的过程中,发现以下代码. 顿时发现枚举类竟然也有如此"高端大气上档次"的用法. 沙场点兵(用法源码) com.sun.tools. ...
 - [置顶] OpenJDK源码研究笔记(九)-可恨却又可亲的的异常(NullPointerException)
		
可恨的异常 程序开发过程中,最讨厌异常了. 异常代表着程序出了问题,一旦出现,控制台会出现一屏又一屏的堆栈错误信息. 看着就让人心烦. 对于一个新人来讲,遇到异常经常会压力大,手忙脚乱,心生畏惧. 可 ...
 - OpenJDK源码研究笔记(五)-缓存Integer等类型的频繁使用的数据和对象,大幅度提升性能(一道经典的Java笔试题)
		
摘要 本文先给出一个看似很简单实则有深意的Java笔试面试题,引出JDK内部的缓存. JDK内部的缓存,主要是为了提高Java程序的性能. 你能答对这道"看似简单,实则有深意"的J ...
 - OpenJDK源码研究笔记(四)-编写和组织可复用的工具类和方法
		
本篇主要讲解java.util.Arrays这个针对数组的工具类. 1.可复用的工具类和方法. 这个工具类里,包含很多针对数组的工具方法,如 排序.交换.二分查找.比较.填充.复制.hashcode ...
 - OpenJDK源码研究笔记(二)-Comparable和Comparator2个接口的作用和区别(一道经典的Java笔试面试题)
		
Comparable和Comparator是JDK中定义的2个比较接口,很相似,但又有所不同. 这2个接口的作用和区别也是Java中的常见经典面试题. 下面我们就来详细介绍下这2个接口的定义.作用.区 ...
 - OpenJDK源码研究笔记(一)-参数检查&抛出带关键错误提示信息的异常
		
OpenJDK源码研究笔记系列文章,是我在阅读OpenJDK7源码的过程中的一些体会.收获.看法. 把研究过程中的成长和收获一点点地整理出来,是对自己研究学习的一个小结,也有可能给学习Java的一些同 ...
 
随机推荐
- hadoop1.1.0的伪分布搭建步骤
			
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWFuYnVyZW4wMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
 - JConsole远程监控Tomcat7
			
下面技术应用于最优质的水果的鲜果篮 一.设置服务端: 1.增加Listener到conf/server.xml <Listener className="org.apache.cata ...
 - IIS访问站点,出现connection refused
			
排查后,发现是因为使用了代理导致的. 需要设置 Don't use the proxy server for local addresses.
 - django 笔记13 CSRF
			
CSRF a. CSRF原理 b. 无CSRF时存在隐患 c. Form提交(CSRF) d. Ajax提交(CSRF) CSRF请求头 x-CSRFToken HTTP_X_CSRFToken dj ...
 - []HAOI2008] 硬币购物 解题报告 ( 完全背包+容斥原理)
			
题目链接:https://www.luogu.org/problemnew/show/P1450 题目描述: 题解: 如果去掉限制的话,这就是一个完全背包. 我们可以考虑先去掉限制,把这个完全背包做出 ...
 - 《剑指offer》二叉树的镜像
			
一.题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 二.输入描述 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 三.输出描述 镜像二叉树 8 / \ 10 ...
 - 不同框架实现的todomvc
			
http://todomvc.com/ http://hao.jobbole.com/
 - 515Nod 1126 求递推序列的第n项【矩阵快速幂】
			
有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. 给出A,B和N,求f(n)的值. Input 输 ...
 - 超链接:a标签
			
a标签的功能:实现跳转功能 a标签的重要属性:href,target href的值为跳转目标的地址,如果是跳转页面的话,需要这个页面的超链接. target的值有四个:_blank._self._pa ...
 - 雅礼集训1-9day爆零记
			
雅礼集训1-9day爆零记 先膜一下虐爆我的JEFF巨佬 Day0 我也不知道我要去干嘛,就不想搞文化科 (文化太辣鸡了.jpg) 听李总说可以去看(羡慕)各路大佬谈笑风声,我就报一个名吧,没想到还真 ...