浅析OpenJDK源码编译器Javac的语法树包com.sun.source.tree。

抽象语法树,是编译原理中的经典问题,有点难,本文只是随便写写。

0.赋值语句

  1. public interface AssignmentTree extends ExpressionTree {
  2. ExpressionTree getVariable();
  3. ExpressionTree getExpression();
  4. }

一个赋值语句的表达式,variable = expression,例如 a = a+1。

按照AssignmentTree 接口中的抽象,一个赋值语句的抽象语法树可以拆分成2个部分:左边的变量和右边的表达式。

变量和表达式也都是一个语法树。

更多语句

1.块语句

语法:{ }, { statements }, static { statements }

抽象语法树定义

  1. public interface BlockTree extends StatementTree {
  2. /**
  3. * 是否为静态初始化
  4. */
  5. boolean isStatic();
  6. /**
  7. * 初始化语句集合
  8. */
  9. List<? extends StatementTree> getStatements();
  10. }

2.类的定义

语法modifiers class simpleName typeParameters extends extendsClause implements implementsClause {

      members

}

抽象语法树定义

  1. public interface ClassTree extends StatementTree {
  2. /**
  3. * 类的修饰符
  4. */
  5. ModifiersTree getModifiers();
  6. /**
  7. * 类的简单名字
  8. */
  9. Name getSimpleName();
  10. /**
  11. * 类的参数类型
  12. */
  13. List<? extends TypeParameterTree> getTypeParameters();
  14. /**
  15. * 类的继承父类的语句
  16. */
  17. Tree getExtendsClause();
  18. /**
  19. * 类的实现接口的语句
  20. */
  21. List<? extends Tree> getImplementsClause();
  22. /**
  23. * 类的成员集合
  24. */
  25. List<? extends Tree> getMembers();
  26. }

3.Do-While循环

语法:do

        statement

while ( expression );

抽象语法树定义

  1. public interface DoWhileLoopTree extends StatementTree {
  2. /**
  3. * 条件表达式
  4. */
  5. ExpressionTree getCondition();
  6.  
  7. /**
  8. * 条件成立时,执行的语句
  9. */
  10. StatementTree getStatement();
  11. }

4.For-each循环

语法:for ( variable : expression )

       statement

抽象语法树定义

  1. public interface EnhancedForLoopTree extends StatementTree {
  2. /**
  3. * for-each循环中的变量定义
  4. */
  5. VariableTree getVariable();
  6.  
  7. /**
  8. * for-each循环中的需要遍历的变量(表达式)
  9. */
  10. ExpressionTree getExpression();
  11.  
  12. /**
  13. * for-each一次遍历过程中的语句
  14. */
  15. StatementTree getStatement();
  16. }

5.传统的for循环

语法:for ( initializer ; condition ; update )

statement

抽象语法树定义

  1. public interface ForLoopTree extends StatementTree {
  2. /**
  3. * for循环中的初始化语句集合
  4. */
  5. List<? extends StatementTree> getInitializer();
  6.  
  7. /**
  8. * for循环中的判断条件
  9. */
  10. ExpressionTree getCondition();
  11.  
  12. /**
  13. * for循环中的更新条件语句
  14. */
  15. List<? extends ExpressionStatementTree> getUpdate();
  16.  
  17. /**
  18. * for循环中一次遍历执行的语句
  19. */
  20. StatementTree getStatement();
  21. }

6.Switch语句

语法:switch ( expression ) {

      cases

}

抽象语法树定义

  1. public interface SwitchTree extends StatementTree {
  2. /**
  3. * switch语句的条件表达式
  4. */
  5. ExpressionTree getExpression();
  6.  
  7. /**
  8. * switch语句的case表达式集合
  9. */
  10. List<? extends CaseTree> getCases();
  11. }

更多语句的语法定义和抽象语法树,与上面的类似,不再赘述。

编译器的编译过程和抽象语法树等概念,是比较难的。

大部分的同学,只需要了解即可。

原文参见http://FansUnion.cn/articles/3086(小雷网-FansUnion.cn)

OpenJDK源码研究笔记(十一):浅析Javac编译过程中的抽象语法树(IfElse,While,Switch等语句的抽象和封装)的更多相关文章

  1. OpenJDK源码研究笔记(十三):Javac编译过程中的上下文容器(Context)、单例(Singleton)和延迟创建(LazyCreation)3种模式

    在阅读Javac源码的过程中,发现一个上下文对象Context. 这个对象用来确保一次编译过程中的用到的类都只有一个实例,即实现我们经常提到的"单例模式". 今天,特意对这个上下文 ...

  2. OpenJDK源码研究笔记(八)-详细解析如何读取Java字节码文件(.class)

    在上一篇OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构中,我们大致了解了Java字节码文件的结构. 本篇详细地介绍了如何读取.class文件的大部分细节. 1.构造文件  ...

  3. OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构

    最近在看OpenJDK源码的过程中,顺便看了Java编译器(javac)的源码. 为了理解javac的源码,需要先搞懂Java字节码文件(.class)的结构. 于是,我就认真看了下OpenJDK中J ...

  4. OpenJDK源码研究笔记(十):枚举的高级用法,枚举实现接口,竟是别有洞天

    在研究OpenJDK,Java编译器javac源码的过程中,发现以下代码. 顿时发现枚举类竟然也有如此"高端大气上档次"的用法. 沙场点兵(用法源码) com.sun.tools. ...

  5. [置顶] OpenJDK源码研究笔记(九)-可恨却又可亲的的异常(NullPointerException)

    可恨的异常 程序开发过程中,最讨厌异常了. 异常代表着程序出了问题,一旦出现,控制台会出现一屏又一屏的堆栈错误信息. 看着就让人心烦. 对于一个新人来讲,遇到异常经常会压力大,手忙脚乱,心生畏惧. 可 ...

  6. OpenJDK源码研究笔记(五)-缓存Integer等类型的频繁使用的数据和对象,大幅度提升性能(一道经典的Java笔试题)

    摘要 本文先给出一个看似很简单实则有深意的Java笔试面试题,引出JDK内部的缓存. JDK内部的缓存,主要是为了提高Java程序的性能. 你能答对这道"看似简单,实则有深意"的J ...

  7. OpenJDK源码研究笔记(四)-编写和组织可复用的工具类和方法

    本篇主要讲解java.util.Arrays这个针对数组的工具类. 1.可复用的工具类和方法.  这个工具类里,包含很多针对数组的工具方法,如 排序.交换.二分查找.比较.填充.复制.hashcode ...

  8. OpenJDK源码研究笔记(二)-Comparable和Comparator2个接口的作用和区别(一道经典的Java笔试面试题)

    Comparable和Comparator是JDK中定义的2个比较接口,很相似,但又有所不同. 这2个接口的作用和区别也是Java中的常见经典面试题. 下面我们就来详细介绍下这2个接口的定义.作用.区 ...

  9. OpenJDK源码研究笔记(一)-参数检查&抛出带关键错误提示信息的异常

    OpenJDK源码研究笔记系列文章,是我在阅读OpenJDK7源码的过程中的一些体会.收获.看法. 把研究过程中的成长和收获一点点地整理出来,是对自己研究学习的一个小结,也有可能给学习Java的一些同 ...

随机推荐

  1. bzoj1800: [Ahoi2009]fly 飞行棋(乱搞)

    1800: [Ahoi2009]fly 飞行棋 题目:传送门 题解: 大水题,早上签个到 没什么好说的...搞个前缀和,算个周长... 周长为奇数肯定误解啊废话QWQ 那么看到n<=20,还不暴 ...

  2. [poj 2480] Longge's problem 解题报告 (欧拉函数)

    题目链接:http://poj.org/problem?id=2480 题目大意: 题解: 我一直很欣赏数学题完美的复杂度 #include<cstring> #include<al ...

  3. 2015合肥网络赛 HDU 5489 Removed Interval LIS+线段树(树状数组)

    HDU 5489 Removed Interval 题意: 求序列中切掉连续的L长度后的最长上升序列 思路: 从前到后求一遍LIS,从后往前求一遍LDS,然后枚举切开的位置i,用线段树维护区间最大值, ...

  4. RMAN备份脚本--DataGuard primary

    单机环境全备   export ORACLE_BASE=/oracle export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1 export ORACL ...

  5. Functor& Monad解读

    整体上代表封装的概念,重点是函数的封装,及函数运行的上下文环境.trait Functor[F[_]] Functor:代表整体封装: F[_]:代表封装后的目标域. A.B:代表普通的对象:f:代表 ...

  6. 洛谷P2408 不同子串个数 后缀数组 + Height数组

    ## 题目描述: 给你一个长为 $N$ $(N<=10^5)$ 的字符串,求不同的子串的个数我们定义两个子串不同,当且仅当有这两个子串长度不一样 或者长度一样且有任意一位不一样.子串的定义:原字 ...

  7. NodeJS学习笔记 进阶 (1)Nodejs进阶:服务端字符编解码&乱码处理(ok)

    个人总结:这篇文章主要讲解了Nodejs处理服务器乱码及编码的知识,读完这篇文章需要10分钟. 摘选自网络 写在前面 在web服务端开发中,字符的编解码几乎每天都要打交道.编解码一旦处理不当,就会出现 ...

  8. 紫书 例题 10-9 UVa 1636 (概率计算)

    小学数学问题 记得分数比较的时候可以交叉相乘(同号) #include<cstdio> #include<cstring> #define REP(i, a, b) for(i ...

  9. Java基础学习总结(11)——重载与重写

    首先我们来讲讲:重载(Overloading) 一.方法的重载 方法名一样,但参数不一样,这就是重载(overload). 所谓的参数不一样,主要有两点:第一是参数的个数不一样,第二是参数的类型不一样 ...

  10. javaweb——登陆权限过滤器的编写

    http://blog.csdn.net/lzc4869/article/details/50935858