📅  最后修改于: 2020-12-06 06:47:34             🧑  作者: Mango
SLR(1)是指简单的LR解析。与LR(0)解析相同。唯一的区别在于解析表。要构造SLR(1)解析表,我们使用LR(0)项的规范集合。
在SLR(1)解析中,我们仅在左手侧跟随放置减少移动。
SLR(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}
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•
第一(E)=第一(E + T)∪第一(T)
第一(t)=第一(t *="" f)∪第一(f)
="{*,+,$}
跟随(F)=" f)∪第一(f)
第一(f)="{id}
第一(T)=" p="" t)∪{$}="{+,$}
跟随(T)=第一(*" {*,+,$}<="" {id}
第一(e)="{id}
跟随(E)=第一(+">