📜  LALR 1解析

📅  最后修改于: 2020-12-06 07:12:54             🧑  作者: Mango

LALR(1)解析:

LALR是指先行LR。为了构造LALR(1)解析表,我们使用LR(1)项的规范集合。

LALR(1)解析与CLR(1)解析相同,只是解析表不同。

S → AA
A  → aA
A → b

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

S` → •S, $
S  → •AA, $
A  → •aA, a/b 
A  → •b, a/b

I0状态:

将增产添加到I0状态并计算ClosureL

I0 =闭合(S`→•S)

将所有以S开头的产品添加到I0状态,因为“•”后跟非终结符。因此,I0状态变为

I0 = S`→•S,$
S→•AA,$

在修改后的I0状态下添加所有以A开头的产品,因为“•”后跟非终结符。因此,I0状态变为。

I0 = S`→•S,$
S→•AA,$
A→•aA,a / b
A→•b,a / b

I1 =转到(I0,S)=闭包(S`→S•,$)= S`→S•,$
I2 =转到(I0,A)=闭包(S→A•A,$)

在I2状态下添加所有以A开头的产品,因为“•”后跟非终结符。因此,I2状态变为

I2 = S→A•A,$
A→•aA,$
A→•b,$

I3 =转到(I0,a)=闭包(A→a•A,a / b)

在I3状态下添加所有以A开头的产品,因为“•”后跟非终结符。因此,I3状态变为

I3 = A→a•A,a / b
A→•aA,a / b
A→•b,a / b

转到(I3,a)=闭包(A→a•A,a / b)=(与I3相同)
转到(i3,b)=闭包(a→b•,a b)="(与I4相同)

I4 =转到(I0,b)=闭包(A→b•,a / b)= A→b•,a / b
I5 =转到(I2,A)=闭包(S→AA•,$)= S→AA•,$
I6 =转到(I2,a)=闭包(A→a•A,$)

在I6州添加所有以A开头的产品,因为“•”后跟非终结符。因此,I6状态变为

I6 = A→a•A,$
A→•aA,$
A→•b,$

转到(I6,a)=闭包(A→a•A,$)=(与I6相同)
转到(i6,b)=闭包(a→b•,$)=(与i7相同)< p="">

I7 =转到(I2,b)=闭包(A→b•,$)= A→b•,$
I8 =转到(I3,A)=闭包(A→aA•,a / b)= A→aA•,a / b
I9 =转到(I6,A)=闭包(A→aA•,$)A→aA•,$

如果我们分析,则I3和I6的LR(0)项相同,但是它们的前瞻性不同。

I3 = {A→a•A,a / b
A→•aA,a / b
A→•b,a / b
}

I6 = {A→a•A,$
A→•aA,$
A→•b,$
}

显然,I3和I6的LR(0)项相同,但前瞻性不同,因此我们可以将它们组合在一起并称为I36。

I36 = {A→a•A,a / b / $
A→•aA,a / b / $
A→•b,a / b / $
}

I4和I7相同,但是它们的区别仅在于它们的前瞻性,因此我们可以将它们组合起来并称为I47。

I47 = {A→b•,a / b / $}

I8和I9相同,但是它们的区别仅在于它们的前瞻性,因此我们可以将它们组合在一起,称为I89。

I89 = {A→aA•,a / b / $}

绘图DFA:

LALR(1)解析表:


转到(i6,b)=闭包(a→b•,$)=(与i7相同)<>


转到(i3,b)=闭包(a→b•,a>