什么是 CLR(1) 解析器?


CLR 定义规范前瞻。CLR 解析使用规范的 LR(1) 项目集合来构建 CLR(1) 解析表。与 SLR(1) 解析相比,CLR(1) 解析表具有更多状态。在 CLR(1) 中,它只能在先行符号中定位归约节点。

CLR 解析器的运行方式


为语法构建 LR(1) 项目集合

它需要三样东西

  • 扩充语法
  • 闭包函数
  • goto 函数

扩充语法 这是一个新的语法 G′,它包含一个新的产生式

S′ → S,以及给定语法 G 的所有其他产生式。

闭包

过程 closure (I)

begin
Repeat
for each item A → α ∙ B β, a in I,
   each production B → γ and
      each terminal b ∈ FIRST (β a)
If B → ∙ γ is not in I
Add B → ∙ γ, b to I
Until no more elements can be joined to I;
end

𝐠𝐨𝐭𝐨(𝐈, 𝐗): 如果在 I 中存在产生式 𝐀 → 𝛂 ∙ 𝐗 𝛃,𝐚,则 𝐠𝐨𝐭𝐨(𝐈, 𝐗) 是 𝐀 → 𝛂 𝐗 ∙ 𝛃,𝐚 的项目集的闭包。

LR(1) 项目集构建算法

begin
C = {closure(S′→∙S,$)}
Repeat
for each set of items 𝐈 in C and each grammar symbol X (terminal or non-terminal)
   Add 𝐠𝐨𝐭𝐨(𝐈, 𝐗) 𝐭𝐨 𝐂
Until no more sets of elements can be added to C.
end.

规范 LR 解析表构建算法

输入 − 扩充语法 G′

输出 − CLR 解析表

方法

  • 首先构建项目集 C = {I0, I1, I2 … … In},其中 C 是 G 的 LR(1) 项目的集合。

  • 解析操作基于每个项目或状态 I1

各种操作:

  • 如果 A → α ∙ a β 位于 Ii 中,并且 goto(Ii, a) = Ij,则在 Action 表中创建条目 Action[i, a] = shift j。
  • 如果 A → α ∙ 位于 Ii 中,则在 Action 表中将 Action[i, a] 设置为 reduce A→α。“此处,A 不应为 S′。
  • 如果 S′ → S ∙ 位于 Ii 中,则 Action[i, $] = accept。
  • SLR 表的 goto 部分可以填充为:
  • 如果 goto(Ii, A) = Ij,则 goto[i, A] = j


  • 规则 2 和 3 未定义的所有条目都被认为是“错误”。

更新于:2021年11月2日

5K+ 次浏览

启动你的职业生涯

通过完成课程获得认证

开始
广告