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

本文解析了OpenJDK源码编译器Javac中的语法树包com.sun.source.tree,详细介绍了各种语句如赋值、块、类定义、循环及Switch语句的抽象语法树定义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值