📜  SLR 1解析

📅  最后修改于: 2020-12-06 06:47:34             🧑  作者: Mango

单反(1)解析

SLR(1)是指简单的LR解析。与LR(0)解析相同。唯一的区别在于解析表。要构造SLR(1)解析表,我们使用LR(0)项的规范集合。

在SLR(1)解析中,我们仅在左手侧跟随放置减少移动。

SLR(1)解析涉及的各个步骤:

  • 对于给定的输入字符串,编写上下文无关的语法
  • 检查语法的歧义
  • 在给定的语法中添加增值产生
  • 创建LR(0)个项目的规范集合
  • 绘制数据流程图(DFA)
  • 构造一个SLR(1)解析表

单反(1)桌子的构造

下面列出了用于构造SLR(1)表的步骤:

如果状态(I i )即将在终端上变为其他状态(I j ),则它对应于动作部分中的换档。

如果状态(I i )即将变为某个变量的其他状态(I j ),则它对应于go to part中的go移动。

如果状态(I i )包含最终项,例如A→ab•,但没有转换到下一个状态,则该生产称为还原生产。对于“跟随”(A)中的所有端子X,都写上减少条目及其生产编号。

S -> •Aa 
  A->αβ• 
            Follow(S) = {$}
            Follow (A) = {a}

单反(1)语法

S→E
*="" +="" e→e="" f="" f
="" f→id<="" p="" t="" t→t="" |="" ť
="">

添加增广产品并在G的每个产品的第一个位置插入“•”符号

S`→•E
*="" +="" e→•e="" e→•t
="" f
="" f→•id<="" p="" t
="" t→•f
="" t→•t="">

I0状态:

将增产增加到I0状态并计算关闭

I0 =闭合(S`→•E)

将所有以E开头的产品添加到I0状态,因为“。”其次是非终结符。因此,I0状态变为

I0 = S`→•E
E→•E + T
E→•T

将所有以T和F开头的产品添加到修改的I0状态,因为“。”其次是非终结符。因此,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相同)< p="">

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)=" f)∪第一(f)
第一(f)="{id}
第一(T)=" p="" t)∪{$}="{+,$}
跟随(T)=第一(*" {*,+,$}<="" {id}
第一(e)="{id}
跟随(E)=第一(+">

  • 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。

第一(t)=第一(t>


转到(i5,id)=闭包(f→id•)=(与i4相同)<>


>


>