【SLR(1)解析】SLR(1)是指简单的LR解析。与LR(0)解析相同。唯一的区别在于解析表。要构造SLR(1)解析表, 我们使用LR(0)项的规范集合。
在SLR(1)解析中, 我们仅在左手侧跟随放置减少移动。
SLR(1)解析涉及的各个步骤:
- 对于给定的输入字符串, 编写上下文无关的语法
- 检查语法的歧义
- 在给定的语法中添加增值产生
- 创建LR(0)个项目的规范集合
- 绘制数据流程图(DFA)
- 构造一个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。