个性化阅读
专注于IT技术分析

LALR(1)解析

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

在LALR(1)解析中, 将具有相同产量但前瞻不同的LR(1)项组合在一起, 以形成一组项

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

LALR(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相同)

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)解析

LALR(1)解析表

LALR(1)解析1
赞(0)
未经允许不得转载:srcmini » LALR(1)解析

评论 抢沙发

评论前必须登录!