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

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

  • 相关阅读:
    在ASP.NET MVC中使用DropDownList引用。呵呵。
    获取泛型对象
    Tomcat JVM 初始化加大内存
    Tomcat6.0 连接池的配置
    @ResponseBody与Ajax
    c3po数据库连接池中取出连接
    SpringMVC
    JQuery发送Ajax请求
    Java生成验证码
    Spring初学
  • 原文地址:https://www.cnblogs.com/qitian1/p/6463480.html
Copyright © 2011-2022 走看看