编译原理学习笔记(三)语法分析

语法分析的任务

语法分析接受词法分析产生的记号流,对其进行分析,检查有无语法错误,有错误返回错误信息,无错误则生成抽象语法树。

语法分析还需要知道一组语法规则,利用这些规则来判断输入的记号流有无语法错误。

语法分析实现方式

语法规则用上下文无关文法来描述。

分析过程分为两类,自顶向下分析,自底向上分析。

自顶向下分析

有分析树,递归下降法和LL(1)分析算法。
分析树需要回溯,效率低。而递归下降和LL分析算法都是线性时间复杂度。

递归下降的思想是每个非终结符构造一个分析函数,用一个前看符号来指导产生式规则的选择。
根据FIRST集和FOLLOW集来构造分析表,避免递归回溯

LL(1)分析算法的意思是从左向右读入字符,从左推导,采用一个前看符号,是一种基于表驱动的分析算法。

自底向上分析

LR分析算法。运行高效,有现成工具能用,如YACC,bison等。
LR(0)分析算法,核心思想是移进,归约,利用分析表产生一个逆序的最右推倒。
SLR和LR(1)都是对LR(0)的改进算法。

语法制导翻译

给每条产生式规则附加一个语义动作,当归约时,就执行这个动作进行计算,到所有的计算完成后,就可以得到结果。

抽象语法树

与分析树非常类似,去除了无用的节点,是语法分析的最后一个过程,分析完毕后输出一个抽象语法树。
抽象语法树的数据结构和树类似,可以手工编码或者自动生成。

自动生成的方法是在语法制导翻译时,语义动作就定义为语法树的构造函数,自底向上地构造树。

分享到