无用符号和无用产生式的消除

在上下文无关文法(CFG)的简化中,算法2.1算法2.2 通常分别指的是消除不可生成符号不可到达符号的过程。下面是这两个算法的详细说明:

算法2.1:消除不可生成符号

不可生成符号是指那些无法推导出终结符串的符号。该算法通过确定哪些非终结符能够推导出终结符串来消除这些不可生成符号。

步骤:

  1. 初始集合:建立一个集合 G,初始为空。G 将存储所有能够生成终结符串的非终结符。
  2. 扫描文法:检查每个产生式:
    • 如果产生式的右部只包含终结符或已经在 G 中的非终结符(例如,A → w,其中 w 是终结符串),那么左部的非终结符(例如 A)可以生成终结符串,将 A 加入 G。
  3. 重复检查:重复扫描所有产生式,直到不能再将任何新的非终结符加入 G。
  4. 删除不可生成符号:文法中所有不在 G 中的非终结符是不可生成符号,将它们以及相关的产生式删除。

在此文法中:

  • A 可以推导出终结符串,因为 A → ε 和 A → aA。
  • B 不能推导出终结符串,因为它依赖于 D,而 D 无法推导出终结符串。
  • D 也不能生成终结符串,因为它的产生式右部是递归的 dD,无法终止。

因此,D 是不可生成符号,应该被删除。


算法2.2:消除不可到达符号

不可到达符号是指那些从起始符号不能通过一系列产生式推导出的符号。该算法用于找出文法中哪些非终结符是不可到达的,并将其删除。

步骤:

  1. 初始集合:建立一个集合 R,初始只包含起始符号 S。
  2. 扫描文法:检查每个产生式:
    • 如果产生式的左部非终结符已经在 R 中(表示它可以从起始符号推导出来),那么将右部所有非终结符加入 R,表示这些非终结符也是可到达的。
  3. 重复检查:重复扫描所有产生式,直到不能再将任何新的非终结符加入 R。
  4. 删除不可到达符号:文法中所有不在 R 中的非终结符是不可到达符号,将它们以及相关的产生式删除。

示例:

在此文法中:

  • S 是起始符号,所以可到达。
  • A 和 B 是 S 的产生式右部符号,因此也可到达。
  • C 是 B 的产生式右部符号,因此也可到达。

假设有一个额外的非终结符 D,其产生式为D→dD,但是 D 既不在 S 的产生式右部,也没有通过任何其他规则连接到 S。因此,D 是不可到达的,应该被删除。


总结:

  • 算法2.1(消除不可生成符号):通过找出哪些非终结符能够推导出终结符串,消除无法生成终结符串的符号。
  • 算法2.2(消除不可到达符号):通过追踪哪些非终结符可以从起始符号推导出,消除从起始符号无法到达的符号。

这两个算法共同作用,可以有效简化文法,减少不必要的产生式和符号。

算法2.6:消除单产生式

旨在消除形如 A→B的单产生式(其中 A 和 B 都是非终结符),使得上下文无关文法(CFG)变得更为简洁。单产生式的存在没有直接贡献终结符,因此消除它们能够简化文法结构。

定义:

单产生式是形如 A→B 的产生式,其中 A 和 B 都是非终结符。消除单产生式的目标是通过替换来避免直接的非终结符到非终结符的转换。

算法步骤:

  1. 构建单产生式链
    • 对于每个非终结符 A,构建一个集合 Single(A),其中包含所有可以通过一系列单产生式从 A 推导到的非终结符。
    • 初始化 Single(A) 包含 A 自身。然后,反复检查文法中的单产生式 A→B,并将 BBB 加入 Single(A)。重复此操作,直到所有可能的单产生式都被处理。
  2. 扩展产生式
    • 对于文法中的每个单产生式 A→B,如果 B∈Single(A),则对于所有 B 的非单产生式 B→α(其中 α 是非终结符和终结符的混合),我们都在 A 中引入 A→α 作为新的产生式。
  3. 删除单产生式
    • 一旦完成了对所有单产生式的替换,删除文法中所有的单产生式,即形如 A→B 的规则。

·

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值