编译原理 语法分析 LL(1) LR(0) SLR LR(1) LALR

本文的图片来自网易云课堂华保健老师的编译原理

这五种文法都是自动生成的,基于表驱动的语法分析方法。
可以分为两类:LL(1)和其余四种。前者是自顶向下的,从最初的S推导出整个句子。后者是自底向上的,从句子规约为S。(S为代表整个句子的非终止符。)
SLR和LR(1)是在LR(0)基础上,对规约进行了改进,其余部分基本一样。

LL(1)

构造LL(1)表的过程中涉及的概念:
FIRST集:从非终结符N开始推导得出的句子开头的所有可能终结符集合。
FIRST_S(X Y Z):从FIRST推广出的概念,句子XYZ的FIRST集。
NULLABLE集:可能推导出空的非终结符集合。
FOLLOW集:非终结符后可能跟的符号。

编译原理 语法分析 LL(1) LR(0) SLR LR(1) LALR_第1张图片
编译原理 语法分析 LL(1) LR(0) SLR LR(1) LALR_第2张图片编译原理 语法分析 LL(1) LR(0) SLR LR(1) LALR_第3张图片编译原理 语法分析 LL(1) LR(0) SLR LR(1) LALR_第4张图片根据FIRST_S可以构造LL(1)分析表。
编译原理 语法分析 LL(1) LR(0) SLR LR(1) LALR_第5张图片
编译原理 语法分析 LL(1) LR(0) SLR LR(1) LALR_第6张图片

判断LL(1)依据:LL(1)分析表中没有冲突项,即每一格只有一个数字。

LL(1)冲突处理方法:消除左递归、提取公因子

LR(0)

整体过程如下图所示,· 代表当前读到的位置。
编译原理 语法分析 LL(1) LR(0) SLR LR(1) LALR_第7张图片
关键是规约和递进时机的选择,需要创建一张分析表。
编译原理 语法分析 LL(1) LR(0) SLR LR(1) LALR_第8张图片
s代表移进,r代表规约,g是在规约后把非终止符压进栈后移进的位置,比如从1-6,3-5。
编译原理 语法分析 LL(1) LR(0) SLR LR(1) LALR_第9张图片编译原理 语法分析 LL(1) LR(0) SLR LR(1) LALR_第10张图片编译原理 语法分析 LL(1) LR(0) SLR LR(1) LALR_第11张图片LR(0)判断依据:LR(0)分析表中没有规约-规约冲突和规约-移进冲突。

SLR

LR(0)中,当 **·**到某个句子的末尾时,当前状态对应于每个字符都执行规约操作。但有些规约操作是不用进行的,比如action[4,x],action[4,y],因为T的FOLLOW集没有x和y,所以如果字符串后面是x和y,那肯定出错了。
编译原理 语法分析 LL(1) LR(0) SLR LR(1) LALR_第12张图片
这样可以减少冲突,并且及时发现错误。
SLR判断依据:在LR(0)基础上,通过FOLLOW集删去部分规约后,分析表没有冲突。

LR(1)

SLR之后依然存在冲突,比如下面的情况。
编译原理 语法分析 LL(1) LR(0) SLR LR(1) LALR_第13张图片
上面情况2中,=也在R的FOLLOW集中,所以存在规约-移进冲突。
为了进一步减少冲突,引入了前向搜索符号。(下图中的a。)编译原理 语法分析 LL(1) LR(0) SLR LR(1) LALR_第14张图片
LR(1)构造算法:
编译原理 语法分析 LL(1) LR(0) SLR LR(1) LALR_第15张图片
在规约的时候,SLR是只有在FOLLOW集中的才填入ACTION表,其他的为ERROR,LR(1)只有在前向搜索集中的字符才能填入ACTION表。

LALR

编译原理 语法分析 LL(1) LR(0) SLR LR(1) LALR_第16张图片
这是LR(1)的分析表,其中5和11是类似的,只是前向搜索符不同,所以可以合并它们。但有些是不能合并的,比如下图的I9和I10。如果合并的话会产生规约-规约冲突。A->d· , a c B->d· , a c。
编译原理 语法分析 LL(1) LR(0) SLR LR(1) LALR_第17张图片
LR(1)和LALR判别:经过LR(1)后,如果可以合并某些状态,就是LALR,否则就是LR(1)。

二义性处理

不过无论怎样都不可能完全消除冲突,比如下图中的左下角和右下角的状态,遇到* 或者+时,就会有规约-移进冲突。这时就需要指定优先级。比如左下角如果遇到 * 号就移进,遇到+号就规约,因为 * 号的优先级更高。
编译原理 语法分析 LL(1) LR(0) SLR LR(1) LALR_第18张图片

你可能感兴趣的:(编译器)