文档章节

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

jtn
 jtn
发布于 2015/04/13 15:08
字数 602
阅读 8
收藏 0

浅析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)

© 著作权归作者所有

jtn

jtn

粉丝 12
博文 879
码字总数 879609
作品 0
武汉
程序员
私信 提问
CentOS为OpenJDK设置系统变量

转载著名出处:http://www.crazyphper.com/?p=2328 今天在安装phpstorm时,提示无法找到JAVA_HOME,才想起还没有安装JDK呢!那就来试试linux上的openJDK吧! Centos自带OpenJDK的Runtime(JRE...

konakona
2012/09/22
10.7K
2
[RK3399][Android7.1] 调试笔记 --- java和javac版本不一致问题及修改

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kris_fei/article/details/89377326 Platform: RK3399 OS: Android 7.1 Kernel: v4.4.83 当前版本: build@bui...

KrisFei
04/18
0
0
openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss
2018/06/18
409
0
ubuntu编译并调试OpenJDK8源码实践

最近打算研究一下 jvm 相关的知识,所以想编译 OpenJDK 的源码,一直在Mac上面编译,但是总是出现莫名其妙的error,还找不到有效的解决方式,所以还是进入 Ubuntu 下面进行编译,虽然中间也出...

ostracod
2018/06/29
0
0
openjdk编译出错

大家好,本人刚入Java,想对Java有个深入的了解,因此在看《深入理解Java虚拟机》这本书,想照着书上所写,编译一下openjdk。但是出现了问题,网上搜了很久都没解决问题。 是这样的,我首先从...

竹我
2016/03/21
694
4

没有更多内容

加载失败,请刷新页面

加载更多

75、GridFS

GridFS是MongoDB提供的用于持久化存储文件的模块,CMS使用Mongo DB存储数据,使用FGridFS可以快速集成开发。 工作原理: 在GridFS存储文件是将文件分块存储,文件会按照256KB的大小分割成多个...

lianbang_W
47分钟前
4
0
js bind 绑定this指向

本文转载于:专业的前端网站➱js bind 绑定this指向 1、示例代码 <!DOCTYPE html><html lang="zh"> <head> <meta charset="UTF-8" /> <title>bind函数绑定this指向......

前端老手
50分钟前
4
0
CentOS Linux 7上将ISO映像文件写成可启动U盘

如今,电脑基本上都支持U盘启动,所以,可以将ISO文件写到U盘上,用来启动并安装操作系统。 我想将一个CentOS Linux 7的ISO映像文件写到U盘上,在CentOS Linux 7操作系统上,执行如下命令: ...

大别阿郎
57分钟前
4
0
深入vue-公司分享ppt

组件注册 全局注册 注册组件,传入一个扩展过的构造器 Vue.component('my-component', Vue.extend({/*...*/})) 注册组件,传入一个选项对象(自动调用Vue.extend) Vue.component('my-comp...

莫西摩西
58分钟前
4
0
gitlab重置管理员密码

登录gitlab服务器 [root@localhost bin]# sudo gitlab-rails console productionLoading production environment (Rails 5.2.3)irb(main):001:0> u = User.where(email: 'admin@example.co......

King华仔o0
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部