📜  LR(0) 解析器的问题

📅  最后修改于: 2021-09-28 09:29:19             🧑  作者: Mango

先决条件: LR解析器。

LR 解析器是一种高效的自底向上语法分析技术,可用于大类上下文无关文法。该技术也称为 LR(0) 解析。
L 代表从左到右扫描
R 代表逆向的最右推导
0 代表没有。前瞻的输入符号。

增强语法:
如果 P 是一个具有起始符号 S 的文法,那么 G’(G 的增广文法)是一个具有新起始符号 S 和产生式 S-> .S 的文法。这个新的开始产生的目的是指示解析器何时应该停止解析。这 ‘ 。 ‘ 在 S 之前表示 ‘ 的左侧。 ‘ 已被编译器读取,并且 ‘ 的右侧。 ‘ 还没有被编译器读取。

构建LR解析表的步骤:

  1. 编写增强语法
  2. LR(0) 要查找的项目集合
  3. 在解析表中定义 2 个函数:goto(终端列表)和 action(非终端列表)。

Q. 为给定的上下文无关文法构造一个 LR 解析表——

S->AA
A–>aA|b

解决方案 :
步骤 1-查找扩充语法 –

给定文法的增广文法是:-

S’–>.S [第 0 次生产]
S–>.AA [第一次生产]
A–>.aA [第二次生产]
A–>.b [第三次生产]

第 2步 – 查找 LR(0) 项集合
下图显示了 LR(0) 项目集合。我们将一一了解。

这个文法的终结符是 {a,b}
此文法的非终结符是 {S,A}

规则 –如果任何非终端有 ‘ 。 ‘ 在它之前,我们必须编写它的所有产生式并添加 ‘ 。 ‘ 在每个它的生产之前。
规则– 从每个状态到下一个状态, ‘ 。 ‘ 移到右边的一个位置。

  • 图中,I 0由增广文法组成。
  • 当 ‘ 时,I o转到 I 1。第 0 个产生式的 ‘ 向 S(S’->S.) 的右侧移动。这种状态是接受状态。
    S 被编译器看到
  • 当 ‘ 时,I o转到 I 2。 ‘ 1st 产生向右移动 (S->AA)。 A 被编译器看到
  • 当 ‘ 时,I 0变为 I 3。 ‘ 第二个产品的 ‘ 向右移动 (A->aA) 。 a 被编译器看到。
  • 当 ‘ 时,I 0变为 I 4。 ‘ 第三个产生式的右移 (A->b.) 。 b 被编译器看到。
  • 当 ‘ 时,I 2转到 I 5。 ‘ 1st 产生向右移动 (S->AA.)。 A 被编译器看到
  • 当 ‘ 时,I 2转到 I 4。第三次产生的’向右移动 (A->b.)。 b 被编译器看到。
  • 当 ‘ 时,I 2转到 I 3。 ‘ 第二个产品的 ‘ 向右移动 (A->aA) 。 a 被编译器看到。
  • 当 ‘ 时,I 3转到 I 4。 ‘ 第三个产生式的右移 (A->b.) 。 b 被编译器看到。
  • I 3到 I 6时 ‘ 。 ‘ 的第二次产生向右移动 (A->aA.)。 A 被编译器看到
  • 当 ‘ 时,I 3转到 I 3。 ‘ 第二个产品的 ‘ 向右移动 (A->aA) 。 a 被编译器看到。

STEP3——在解析表中定义2个函数:goto[终端列表]和action[非终端列表]

  • $ 默认情况下是一个接受状态的非终端。
  • 0,1,2,3,4,5,6 表示 I 0 ,I 1 ,I 2 ,I 3 ,I 4 ,I 5 ,I 6
  • I 0在 I 2 中给出 A,因此将 2 添加到 A 列和 0 行。
  • I 0在 I1 中给出 S,因此将 1 添加到 S 列和 1 行。
  • 同样5写在A列第2行,6写在A列第3行。
  • I 0将 I 3 中的 a给 .so S3(shift 3) 添加到列和 0 行。
  • I 0在 I4 中给出 b,因此将 S4(shift 4) 添加到 b 列和 0 行。
  • 类似地,将 S3(shift 3) 添加到列和 2,3 行上,在 b 列和 2,3 行上添加 S4(shift 4)。
  • I 4被简化为 ‘ 。 ‘ 在最后。 I 4第三生产语法。所以在终端写 r 3 (reduce 3)。
  • I 5被简化为 ‘ 。 ‘ 在最后。 I 5是第1个生产语法。所以在终端中写 r 1 (reduce 1)。
  • I 6是还原状态为 ‘ 。 ‘ 在最后。 I 6是第2次生产语法。所以写r 2 (减少2) 在终端。

由于每个单元格中只有 1 个值,因此,给定的语法是 LR(0)。