• 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)

  • 相关阅读:
    location 匹配规则
    nginx+keepalived 高可用方案
    Nginx 静态文件服务
    web服务器-nginx优化
    Oracle 修改字符集(AL32UTF8 转换成UTF8字符集)
    xshell复制粘贴
    关于mysql中的DDL,DML,DQL和DCL
    LVS实现Kubernetes集群高可用
    k8s实践(一):Centos7.6部署k8s(v1.14.2)集群
    Centos7.6部署k8s v1.16.4高可用集群(主备模式)
  • 原文地址:https://www.cnblogs.com/qitian1/p/6463480.html
Copyright © 2020-2023  润新知