OpenJDK源码研究笔记(十一):浅析Javac编译过程中的抽象语法树(IfElse,While,Switch等语句的抽象和封装)
2013-11-03 08:47
597 查看
浅析OpenJDK源码编译器Javac的语法树包com.sun.source.tree。
抽象语法树,是编译原理中的经典问题,有点难,本文只是随便写写。
0.赋值语句
一个赋值语句的表达式,variable = expression,例如 a = a+1。
按照AssignmentTree 接口中的抽象,一个赋值语句的抽象语法树可以拆分成2个部分:左边的变量和右边的表达式。
变量和表达式也都是一个语法树。
更多语句
1.块语句
语法:{ }, { statements }, static { statements }
抽象语法树定义
2.类的定义
语法:modifiers class simpleName typeParameters extends extendsClause implements implementsClause {
members
}
抽象语法树定义
3.Do-While循环
语法:do
statement
while ( expression );
抽象语法树定义
4.For-each循环
语法:for ( variable : expression )
statement
抽象语法树定义
5.传统的for循环
语法:for ( initializer ; condition ; update )
statement
抽象语法树定义
6.Switch语句
语法:switch ( expression ) {
cases
}
抽象语法树定义
更多语句的语法定义和抽象语法树,与上面的类似,不再赘述。
编译器的编译过程和抽象语法树等概念,是比较难的。
大部分的同学,只需要了解即可。
原文参见:http://FansUnion.cn/articles/3086(小雷网-FansUnion.cn)
抽象语法树,是编译原理中的经典问题,有点难,本文只是随便写写。
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编译过程中的抽象语法树(IfElse,While,Switch等语句的抽象和封装)
- OpenJDK源码研究笔记(十三):Javac编译过程中的上下文容器(Context)、单例(Singleton)和延迟创建(LazyCreation)3种模式
- OpenJDK源码研究笔记(十三):Javac编译过程中的上下文容器(Context)、单例(Singleton)和延迟创建(LazyCreation)3种模式
- OpenJDK源码研究笔记(十三):Javac编译过程中的上下文容器(Context)、单例(Singleton)和延迟创建(LazyCreation)3种模式
- OpenJDK源码研究笔记(十三):Javac编译过程中的上下文容器(Context)、单例(Singleton)和延迟创建(LazyCreation)3种模式
- 不用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)求1+2+…+n
- 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)
- 求1+2+…+n, 要求不能使用乘除法、for、while、if、else、switch、case和条件语句
- 每天学习一算法系列(12) (求1+2+…+n,不能使用乘除法,for、while、if 、else、switch、case 等关键字以及条件判断语句)
- C语言奇思妙想:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case 等关键字以及条件判断语句(A?B:C)
- 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
- 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)
- 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。Java实现
- 求1+2+3+...+n,要求不能使用乘除法,for,while,if,else,switch,case等关键字以及条件判断语句
- 不使用乘除法,for,while,if,else,switch,case,条件判断语句(A?B:C) 实现:1+2+....+n
- 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
- 【练习】题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case 等关键字以及条件判断语句
- 剑指Offer(Java版): 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
- 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)