参考博文:
(1)Java的运算符
前几章讲解了将Java源文件分解为Token序列,并且也介绍了组成抽象语法树的各个实现类,那么如何根据Token序列分析出具体的树节点并最终形成一棵抽象语法树是语法分析的重点任务,也是本章着重要讲解的知识点。
语法分析简单来说就是接收词法分析的Token序列,判断他们是否符合JLS中定义的语言的文法产生,并最终生成一个抽象语法树。在具体的实现过程中,可以根据建立语法树的不同方式将语法分析的过程分为自顶向下分析与自底向上分析两大类。顾名思义,自顶向下的语法分析过程就是从树根到叶节点的方向建立语法树,而自底向上的语法分析过程则从叶节点出发来建立语法树的过程。Java主要使用了自顶向下分析的LL(1)方法,而自底向上分析则采用了算符优先分析法。
在前一章我们通过工厂类TreeMaker创建出了抽象语法节点,并最终将它们拼接成了一棵抽象语法树。这一章将着重介绍如何根据Token序列来获取语法树节点信息,并最终转换为一棵完整的抽象语法树。
(1)LL分析法
自顶向下的语法分析过程主要有两种,一种为递归子程序法,而另外一种即是LL分析法。这里不对递归子程序法进行介绍,仅介绍Javac中用到的LL分析法。采用LL分析法,程序将按照从左到右的顺序执行Token序列并在这个过程中产生一个最左推导, 即LL是从左到右扫描、从左到右分析和匹配输入的Token序列。
(2)
(2)算符优先分析法
Javac中采用的算符优先分析法可看做是自底向上分析法的一种,主要用于对表达式的分析。由于在Java中,四则运算的过程也需要保持运算符之间的优先。
(6)抽象语法树的遍历
在后面的语义分析及代码生成阶段将频繁访问甚至修改更改这颗抽象语法树,例如需要添加一个默认的构造函数时需要更改操作,而查找相关的符号定义时就需要扫描语法树来建立符号表。
在遍历像抽象语法树这样由各种类的实例所组成的树形结构时,通常会借助Visitors访问者模式来完成。