SLR(1)是指简单的LR解析。与LR(0)解析相同。唯一的区别在于解析表。要构造SLR(1)解析表, 我们使用LR(0)项的规范集合。
在SLR(1)解析中, 我们仅在左手侧跟随放置减少移动。
SLR(1)解析涉及的各个步骤:
- 对于给定的输入字符串, 编写上下文无关的语法
- 检查语法的歧义
- 在给定的语法中添加增值产生
- 创建LR(0)个项目的规范集合
- 绘制数据流程图(DFA)
- 构造一个SLR(1)解析表
单反(1)桌子的构造
下面列出了用于构建SLR(1)表的步骤:
如果状态(Ii)即将在终端上变为某个其他状态(Ij), 则它对应于动作部分中的换档。
如果状态(Ii)即将变为变量上的其他状态(Ij), 则它对应于go移至go零件中的go。
如果状态(Ii)包含最终项(如A→ab•), 但没有转换到下一个状态, 则该生产称为减少生产。对于“跟随”(A)中的所有端子X, 都写上减少条目及其生产编号。
例
S -> •Aa
A->αβ•
Follow(S) = {$}
Follow (A) = {a}
单反(1)语法
S→E E→E + T | T T→T * F | F F→id
添加增广产品并在G的每个产品的第一个位置插入“•”符号
S`→•E E→•E + T E→•T T→•T * F T→•F F→•id
I0状态:
将增产增加到I0状态并计算关闭
I0 =闭合(S`→•E)
将所有以E开头的产品添加到I0状态, 因为“。”其次是非终结符。因此, I0状态变为
I0 = S`→•E E→•E + T E→•T
在修改后的I0状态中添加所有以T和F开头的产生, 因为“。”其次是非终结符。因此, I0状态变为。
I0 = S`→•E E→•E + T E→•T T→•T * F T→•F F→•id
I1 =转到(I0, E)=闭包(S`→E•, E→E•+ T)I2 =转到(I0, T)=闭包(E→T•T, T•→* F)I3 =转到(I0, F)=闭包(T→F•)= T→F•I4 =转到(I0, id)=闭包(F→id•)= F→id•I5 =转到(I1, +)=闭包(E→E +•T)
在I5州添加所有以T和F开头的产品, 因为“。”其次是非终结符。因此, I5状态变为
I5 = E→E +•T T→•T * F T→•F F→•id
转到(I5, F)=闭合(T→F•)=(与I3相同)转到(I5, id)=闭合(F→id•)=(与I4相同)
I6 =转到(I2, *)=闭包(T→T *•F)
在I6州添加所有以F开头的产品, 因为“。”其次是非终结符。因此, I6状态变为
I6 = T→T *•F F→•id
转到(I6, id)=闭包(F→id•)=(与I4相同)
I7 =转到(I5, T)=闭包(E→E + T•)= E→E + T•I8 =转到(I6, F)=闭包(T→T * F•)= T→T * F•
绘图DFA:
单反(1)表
说明:
第一(E)=第一(E + T)∪第一(T)第一(T)=第一(T * F)∪第一(F)第一(F)= {id}第一(T)= {id}第一( E)= {id}跟随(E)=开头(+ T)∪{$} = {+, $}跟随(T)=开头(* F)∪开头(F)= {*, +, $}跟随[F)= {*, +, $}
- I1包含驱动S→E•并跟随(S)= {$}的最后一项, 因此动作{I1, $} =接受
- I2包含驱动E→T•并跟随(E)= {+, $}的最后一项, 因此动作{I2, +} = R2, 动作{I2, $} = R2
- I3包含驱动T→F•并跟随(T)= {+, *, $}的最后一项, 因此动作{I3, +} = R4, 动作{I3, *} = R4, 动作{I3, $} = R4
- I4包含驱动F→id•并跟随(F)= {+, *, $}的最后一项, 因此动作{I4, +} = R5, 动作{I4, *} = R5, 动作{I4, $} = R5
- I7包含驱动E→E + T•并跟随(E)= {+, $}的最后一项, 因此动作{I7, +} = R1, 动作{I7, $} = R1
- I8包含驱动T→T * F•并跟随(T)= {+, *, $}的最后一项, 因此动作{I8, +} = R3, 动作{I8, *} = R3, 动作{I8, $} = R3。
评论前必须登录!
注册