编译原理--语法分析:LR,LALR
作者:互联网
归约
可将自底向上语法分析过程看成将一个串ω"归约"为文法开始符号的过程.
在每个归约步骤中,
一个与某产生式体相匹配的特定子串被替换为该产生式头部的非终结符号.
句柄剪枝
如有S=>^{*}_{rm} αAω =>_{rm} αβω,
则A->β是αβω的一个句柄.
最右句型γ的一个句柄是满足下叙条件的产生式A->β及β在γ出现的位置:
将此位置的β替换为A后得到的串是γ的某个最右推导序列位于γ之前的最右句型.
ω只含终结符号.
从被分析的终结符号串ω开始,
如ω是当前文法的句子,令ω=γ_{n},是某个最右推导的第n个最右句型.
在γ_{n}寻找β_{n},将其替换为对应产生式头部.
得到前一最右句型.直到得到S.
移入-归约语法分析
句柄总是在栈的顶端.
考虑任意最右推导两个连续步骤所有可能
反向考虑1,
一个移入-归约语法分析器刚刚到达
栈 输入
$αβγ yz$
将γ归约为B
$αβB yz$
多次移入
$αβBy z$
βBy归约为A
$αA z$
反向考虑2,类似.
两种情况下句柄都在栈顶.[k之前按假设句柄都在栈顶.考察k步,[移入/归约]证明k步处理后,句柄仍在栈顶.]
项和LR(0)自动机
一个LR语法分析器通过维护一些状态,
用这些状态表明我们在语法分析过程中所处的位置,
进而做出移入-归约决定.
这些状态代表了"项"集合.
一个文法G的一个LR(0)项是G的一个产生式再加上一个位于它的体中某处的点.
故,产生式A->XYZ产生了四个项.
A->.XYZ
A->X.YZ
A->XY.Z
A->XYZ.
产生式A->ε只有一个A->.
一个称为规范LR(0)项集族的一组项集提供了构建一个确定有穷自动机的基础.
这个LR(0)自动机的每个状态代表了规范LR(0)项集族中的一个项集.
表达式文法4-1对应的自动机显示在图4-31.
为构造一个文法的规范LR(0)项集族,
定义一个增广文法,两个函数CLOSURE和GOTO.
如G是一个以S为开始符号的文法,
则G的增广文法G'是在G中加上新开始符号S'和产生式S'->S得到的.
项集的闭包
如I是文法G的一个项集,
则CLOSURE(I)是根据下面两个规则从I构造得到的项集
1.一开始,将I中的各个项加入到CLOSURE(I)中.
2.对CLOSURE(I)中的A->α.Bβ.
B->γ是B的一个产生式,
项B->.γ加入CLOSURE(I).
在这里插入代码片
标签:文法,语法分析,句柄,最右,归约,LR,LALR 来源: https://blog.csdn.net/x13262608581/article/details/123591872