LALR是指先行LR。为了构造LALR(1)解析表, 我们使用LR(1)项的规范集合。
在LALR(1)解析中, 将具有相同产量但前瞻不同的LR(1)项组合在一起, 以形成一组项
LALR(1)解析与CLR(1)解析相同, 只是解析表不同。
例
LALR(1)语法
S → AAA→ aAA → 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, $
【LALR(1)解析】转到(I6, a)=闭包(A→a?A, $)=(与I6相同)转到(I6, b)=闭包(A→b?, $)=(与I7相同)
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)解析表
文章图片