编译原理:四种文法的比较

编译原理:四种文法的比较

img

0型文法-短语文法

表示方法:四元式 ( V T , V N , S , P ) (V_T,V_N,S,P) (VT,VN,S,P)

  • (终结符集合,非终结符集合,开始符号,产生式集合)

这四个文法都是采用的四元式,有区别的地方在于产生式 α → β \alpha\rightarrow\beta αβ

对于0型文法 α → β \alpha\rightarrow\beta αβ

  • α ∈ ( V T ∪ V N ) ∗ \alpha\in(V_T \cup V_N)^* α(VTVN) α \alpha α必含有至少一个非终结符

  • β ∈ ( V T ∪ V N ) ∗ \beta\in(V_T \cup V_N)^* β(VTVN)

1型文法-上下文有关文法

对于1型文法 α → β \alpha\rightarrow\beta αβ

  • α ∈ ( V T ∪ V N ) ∗ \alpha\in(V_T \cup V_N)^* α(VTVN) α \alpha α必含有至少一个非终结符

  • β ∈ ( V T ∪ V N ) ∗ \beta\in(V_T \cup V_N)^* β(VTVN)

  • ∣ α ∣ < ∣ β ∣ |\alpha|<|\beta| α<β

    • 绝对值代表长度
    • S → ε S\rightarrow\varepsilon Sε除外

2型文法-上下文无关文法

对于2型文法 A → β A\rightarrow\beta Aβ

  • A ∈ V N A\in V_N AVN

  • β ∈ ( V T ∪ V N ) ∗ \beta\in(V_T \cup V_N)^* β(VTVN)

  • ∣ α ∣ < ∣ β ∣ |\alpha|<|\beta| α<β

    • 绝对值代表长度
    • S → ε S\rightarrow\varepsilon Sε除外

最左推导

任何一步 α ⇒ β \alpha\Rightarrow\beta αβ都是对 α \alpha α中的最左非终结符进行替换

最右推导

任何一步 α ⇒ β \alpha\Rightarrow\beta αβ都是对 α \alpha α中的最右非终结符进行替换

3型文法-正规文法

对于3型文法

  • 左线性文法$A\rightarrow B \alpha 或 或 A\rightarrow\alpha$

  • 右线性文法 A → α B A\rightarrow \alpha B AαB A → α A\rightarrow\alpha Aα

  • α ∈ ( V T ) ∗ \alpha\in (V_T)^* α(VT)

  • A , B ∈ V N A,B\in V_N A,BVN

对四种文法的总结

0型文法限制最少,只要产生式左边存在非终结符即可。

1型文法在0型文法的基础上要求产生式左边的长度小于右边的长度。

2型文法在1型文法的基础上要求产生式左边全是非终结符

3型文法的限制最多,在2型文法的基础上对产生式右边也进行了限制,要求右边是一个终结符或者一个终结符+一个非终结符这样子的形式

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 为了判断该文法是否是 SLR(1) 文法,我们需要进行以下步骤: 1. 构造该文法的 LR(0) 项集族 2. 构造该文法的 SLR(1) 分析表 3. 判断该分析表是否符合 SLR(1) 文法的定义 下面分别进行说明。 1. 构造 LR(0) 项集族 首先,我们需要将该文法转化为 LR(0) 项目。一个 LR(0) 项目包括一个产生式和一个“·”,表示产生式中哪个位置已经被识别。对于该文法,我们得到以下 LR(0) 项目: ``` A → ·fAa A → ·fAg A → ·b ``` 然后,我们需要构造该文法的 LR(0) 项集族。项集族的构造过程可以参考其他资料,这里不再赘述。最终得到的 LR(0) 项集族为: ``` I0: A → ·fAa A → ·fAg A → ·b I1: A → f·Aa A → f·Ag I2: A → fA·a I3: A → fA·g I4: A → ·fAa A → ·fAg A → ·b A → fA·a A → fA·g I5: A → b· ``` 2. 构造 SLR(1) 分析表 接下来,我们需要根据 LR(0) 项集族构造 SLR(1) 分析表。SLR(1) 分析表包括状态转移表和动作表。状态转移表表示在当前状态下读入某个终结符或非终结符后转移到的下一个状态,动作表表示在当前状态下应该进行的动作,包括移进和规约。 状态转移表的构造方法是:对于每个项集,找到其可以转移到的项集,并在表格中填入相应的状态编号。具体的,对于每个项集 I,以及每个终结符 a 和非终结符 A,如果存在一条形如 A → α·aβ 的项目在 I 中,那么在状态转移表中将 I 转移到 I',其中 I' 包含所有形如 A → αa·β 的项目。 根据上述方法,我们得到以下状态转移表: ``` f g a b $ ------------------------------- 0 | 1 1 2 3 - 1 | - - - - acc 2 | - - - - r2 3 | 4 5 - - r3 4 | - - - 6 - 5 | - - - 7 - 6 | - - 2 3 - 7 | - - 2 3 - ``` 动作表的构造方法是:对于每个项集 I,如果存在一条形如 A → α· 的项目在 I 中,那么在动作表中将 I 中所有终结符 a 的动作设为“移进”,并将 a 移进到下一个状态。如果存在一条形如 A → α· 的项目在 I 中,且 $ 在 FOLLOW(A) 中,那么将 I 中所有终结符 a 的动作设为“规约 A → α”,并将栈顶的符号弹出,将 A 压入栈中。如果同时存在移进和规约动作,那么该文法不是 SLR(1) 文法。 根据上述方法,我们得到以下动作表: ``` f g a b $ ------------------------------- 0 | s1 s1 s2 s3 - 1 | r2 r2 r2 r2 r2 2 | r1 r1 r1 r1 r1 3 | s4 s5 r3 r3 r3 4 | r3 r3 r3 s6 r3 5 | r3 r3 r3 s7 r3 6 | s2 s3 - - r2 7 | s2 s3 - - r1 ``` 3. 判断 SLR(1) 文法条件 SLR(1) 文法有以下条件: 1. 所有的规约动作都不会产生移进-规约冲突。 2. 对于每个状态 I 和每个终结符 a,最多只有一种移进或规约动作。 3. 对于每个状态 I 和每个终结符 a,如果存在一种规约动作 A → α,那么 FOLLOW(A) ∩ {a, $} ≠ ∅。 根据上述条件,我们可以发现该文法不是 SLR(1) 文法。具体的,项集 I1 和 I2 存在移进-规约冲突,项集 I0 中的 a 和 b 存在移进-规约冲突,项集 I3 中的 a 和 b 存在移进-规约冲突,项集 I4 中的 a 和 b 存在移进-规约冲突,项集 I5 中的 $ 存在规约-规约冲突。因此,该文法不是 SLR(1) 文法。 ### 回答2: 要判断一个文法是否为SLR(1)文法,我们需要检查三个要素:项目集族、LR(0)项目和预测分析表。 首先,构造该文法的项目集族。假设该文法的产生式为:A→fAa|fAg|b。根据该产生式,我们可以构造出如下的项目集族: I0: A→•fAa A→•fAg A→•b I1: A→f•Aa A→f•Ag I2: A→fA•a I3: A→fA•g I4: A→b• 接下来,我们需要构造该文法的LR(0)项目。对于每个项目集Ii中的每个项目,我们可以通过将·移动到下一个符号前来构造一个LR(0)项目。一个项目的闭包是指从该项目中的每个产生式的右部的开始符号开始构造项目的集合,其中包含了所有可能的项目。为了构造该文法的LR(0)项目,我们需要按照以下步骤进行: 1. 初始化I0为文法的闭包。 2. 对于每个项目集Ii和每个项目A→α•Bβ(其中B为非终结符),将B→•γ添加到Ii中,其中γ是包含B→γ的产生式的右部。 得到的LR(0)项目如下: I0: A→•fAa A→•fAg A→•b I1: A→f•Aa A→f•Ag I2: A→fA•a I3: A→fA•g I4: A→b• 最后,我们需要构造该文法的预测分析表。预测分析表的行表示项目集族中的项目集,列表示文法的终结符和非终结符。对于每个项目集Ii中的项目A→α•Bβ,预测分析表中的M[Ii, B]应该填上A→αB•β的编号。 根据上述步骤得到的项目集族和LR(0)项目,我们可以构造出预测分析表如下: 预测分析表: f a b g $ I0:I0 1 - - - - I0:I2 - - - - acc I0:I4 - - - - - I1:I1 - 2 3 - - I2:I0 - - - 4 - I3:I0 - - - 5 - I4:I0 - - - - r4 从预测分析表中可以看出,该文法的预测分析表中某些入口有多个冲突(如I0:I0和I0:I4对应的入口1),因此该文法不是SLR(1)文法。 ### 回答3: 编译原理:已知文法 A→fAa|fAg|b,要判断该文法是否是SLR(1)文法。 首先,我们需要构造该文法的LR(0)和SLR(1)的分析表,再进行判断。 根据该文法的产生式,可以列出所有可能的项集和转移关系: 项集I0: A'→·A A→·fAa|·fAg|·b A→·fAa A→·fAg A→·b 项集I1: A'→A· 项集I2: A→f·Aa A→f·Ag 项集I3: A→fA·a 项集I4: A→fAa· 项集I5: A→fA·g 项集I6: A→fAg· 项集I7: A→b· 接下来,我们需要确定每个项集的项目集规范族的转移关系的依赖关系。 I0经过f的转移可以到达I2、I5和I6。 I2经过A的转移可以到达I3。 I3经过a的转移可以到达I4。 I0通过b的转移可以到达I7。 再根据计算Follow集,可以得到: Follow(A) = {a, g} 根据SLR(1)的判断准则,如果相同状态的不同项的前缀在相同的后缀终结符上都有reduce动作,则不是SLR(1)文法。 我们对每个项集进行检查: 对于项集I2和I6,它们的前缀为fA,后缀终结符分别为a和g。 Follow(A)中有a和g,所以这两个项集都不能使用reduce动作。 综上所述,该文法不是SLR(1)文法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值