浅析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等语句的抽象和封装)的更多相关文章

  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. PHP str_replace() 和str_ireplace()函数

    PHP str_replace() 和str_ireplace()函数 实例 把字符串 "Hello world!" 中的字符 "world" 替换为 &quo ...

  2. 85.Mongoose指南 - Schema

    转自:https://www.bbsmax.com/A/pRdBnKpPdn/ 定义schema 用mongoose的第一件事情就应该是定义schema. schema是什么呢? 它类似于关系数据库的 ...

  3. AngularJs轻松入门(六)表单校验

    表单数据的校验对于提高WEB安全性意义不大,因为服务器接收到的请求不一定来自我们的前端页面,有可能来自别的站点,黑客可以自己做一个表单,把数据提交到我们的服务器(即跨站伪造请求),这样就绕过了前端页面 ...

  4. 《剑指offer》变态跳台阶

    一.题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 二.输入描述 n级台阶 三.输出描述 一共有多少种不同的跳法 四.牛客网提 ...

  5. 洛谷1019 单词接龙 字符串dfs

    问题描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...

  6. HDU-1032 The 3n+1 problem 模拟问题(水题)

    题目链接:https://cn.vjudge.net/problem/HDU-1032 水题 代码 #include <cstdio> #include <algorithm> ...

  7. oracle 12c 关于wm_concat 的替换;LISTAGG

    之所以用到了wm_concat函数.是想到达这样的结果集. 转为这样的===========> 返回这样的数据,易与配合echarts的数据准备. 看上去十分的方便,但是遗憾的是,oracle极 ...

  8. iptables指南

    在了解iptables之前我们先了解一下 防火墙 的概念防火墙是由Check Point创立者Gil Shwed于1993年发明并引入国际互联网,防火墙也是一种位于内部网络与外部网络之间的网络安全系统 ...

  9. 解决Python 插查 MySQL 时中文乱码问题

    首先找到这里的解决方法, count = cursor.fetchall() for i in count: idc_a = i[0] if isinstance(idc_a, unicode): i ...

  10. Android Studio的Signature Versions选择,分别是什么意思

    转自原文 Android Studio的Signature Versions选择,分别是什么意思 打包一个文件的签名版本, 选V1打包出来的app是jar的(一般这种就是当做第三方导入项目来用的), ...