什么是 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 未定义的所有条目都被认为是“错误”。
广告