语法分析之LL(1)、LR(0)、SLR(1)、LR(1)、LALR(1)

语法分析之LL(1)、LR(0)、SLR(1)、LR(1)、LALR(1)_第1张图片

一、自顶向下

从根开始,按先根次序的创建语法分析树的各个节点,可以看作最左推导。使用自顶向下语法分析的前提是无左递归、无左公因子,如果存在,需要消除左递归以及彻底提取左公因子。

1. 递归下降

自顶向下,递归分析。

2. LL(1)文法分析

使用递归下降分析会存在回溯,所以LL(1)文法随之诞生。使用LL(1)文法来构建预测分析表可以解决选择哪个产生式的问题。构建预测分析表的关键就是准确求出FIRST() 和 FOLLOW() 集合。然后按以下步骤填充分析表M。
步骤:

  • 有左递归或者是左公因子,先消除左递归,提取左公因子。

  • 计算每个文法符号的FIRST 和 FOLLOW集合。 https://blog.csdn.net/weixin_44142279/article/details/89365277

  • 构建预测分析表

    对于每一个产生式 A -> α

    • 对FIRST(α)中的每个终结符 a , 将 A -> α 加入到 M[A, a]
    • 如果 ε ∈ FIRST(α), 则对FOLLOW(A)中的每个符号 b , 将 A -> α 加入到 M[A, b]
      (其实就是 A -> ε)

如课上讲的例子
语法分析之LL(1)、LR(0)、SLR(1)、LR(1)、LALR(1)_第2张图片语法分析之LL(1)、LR(0)、SLR(1)、LR(1)、LALR(1)_第3张图片
语法分析之LL(1)、LR(0)、SLR(1)、LR(1)、LALR(1)_第4张图片
因为表中每个格子只有一条产生式,所以此文法是LL(1)文法。

二、自底向上

从叶子节点往上直至到达根,可以看作是最右推导的逆过程。
PS:LR(0) 和 SLR 都是基于LR(0)自动机的,LR(1)和 LALR(1)是基于LR(1)自动机。LR(1)自动机比LR(0)多了向前看符号(第二分量)。

1. LR(0)
解决何时移入、何时规约的问题。

(1)关键点:

  • 求LR(0)项目的闭包—项目集
  • 求项目集I 的 GOTO()函数
    (2)步骤:
  • 使用增广文法对原文法进行增广,如:S’ -> S;目的是告诉语法分析器何时停止语法分析并宣称接受输入符号串。
  • 计算I0项集, 加入S’ -> S 项,用函数CLOSURE()计算闭包
  • 使GOTO() 函数产生新的状态,如有需要,还要计算闭包。
2. SLR(1)
 LR(0)会产生移进-归约等问题,SLR可以解决 移进-归约、部分 归约-归约 问题。当某状态的项要归约时,要求出此项(最左边的非终结符,假如是 A -> α)的FOLLOW(A)集合,在SLR表该状态中FOLLOW(A)的符号下写上归约。

(1)关键点
计算归约项目的FOLLOW集合。
(2)步骤:

  • 对原文法进行拓广,目的是为了使接受项目唯一(S’ -> S)
  • 写出LR(0)自动机
  • 填写SLR(1)分析表,状态I3下的归约项目(比如:A -> aBc. ),计算相应的FOLLOW集合在FOLLOW(A)中的符号下填入R2或者r2。非归约项根据GOTO 填,比如状态I2(比如:A -> aB.c)下的c填I3(A -> aBc. )
3. LR(1)
SLR会存在 部分归约 - 归约 冲突,LR(1)就是把FOLLOW集合具体化,解决归约-归约冲突。所谓具体化其实就是求LR(1)自动机的第二分量a,也就是说当下一输入符号是a时,准确的选择产生式执行归约动作。
LR(1)使用的是LR(1)自动机。

(1) 关键:
求第二分量。(具体化FOLLOW集合)
(2) 步骤:

  • 拓广(增广文法)

  • 写出LR(1)自动机

  • 计算第二分量。

    • 明确开始项 S’ -> S 的第二分量为 $。

    • 接着运用规则,计算其他的第二分量,如果项目集I 是 【A -> α.Bβ,a】a是第二分量,因为B是非终结符,所以计算B的闭包,同时计算B产生式的第二分量为 FIRST(βa) = { a
      (假设是a)}。假设B的产生式是 B ->β,则有【B -> .β,a】

      PS:注意由谁进行闭包得到的产生式,第二分量就由谁计算,比如:
      A -> α.Bβ,a
      C -> .αBβ,c
      那么我们在计算产生式 B ->β的第二分量时看的是 A -> α.Bβ 这条式子

  • 使用GOTO函数,进行状态转换时,如果第二分量有更新,则用新的第二分量,如果没有沿用前一个状态的第二分量。

4. LALR(1)
 在3的基础上合并同心集,减少状态数量。为了简化提出来的
 同样用的是LR(1)自动机

你可能感兴趣的:(编译原理)