文章目录

  • 一、上下文无关语法 设计 示例
  • 二、上下文无关语法 的歧义性
  • 三、Chomsky 范式
  • 四、上下文无关语法 转为 Chomsky 范式
  • 五、上下文无关语法 转为 Chomsky 范式 示例

一、上下文无关语法 设计 示例


1 . 上下文无关语法 设计要求 : 设计一个语法 , 使用该语法生成语言 w w w , 该 w w w 语言的字符串的开始和结尾的字符是相同的 ;

2 . 设计方法 : 非确定性优先自动机 ( NFA ) 识别某语言 , 将 NFA 转为 确定性优先自动机 ( DFA ) , 然后将 DFA 转为 上下文无关语法 ;

3 . 语法设计要求分析 :

  • 开始字符 要么是 0 0 0 , 要么就是 1 1 1 ;

  • 如果开始字符是 0 0 0 , 对应的结尾字符也是 0 0 0 ;

  • 如果开始字符是 1 1 1 , 对应的结尾字符也是 1 1 1 ;

4 . 初始状态 S S S 规则 : 上述语法描述转为规则 如下 , 其中 S S S 为初始状态 ;

S → 0 S ′ 0 ∣ 1 S ′ 1 S \to 0S'0 | 1S'1 S→0S′0∣1S′1

5 . S ′ S' S′ 规则 : S ′ S' S′ 表示中间的字符串 , 这个 S ′ S' S′ 字符串可以是任意字符串 , 根据下面的规则可以生成任意的 0 , 1 0,1 0,1 组成的字符串 ;

S ′ → 0 S ′ ∣ 1 S ′ ∣ ε S' \to 0S' | 1S' | \varepsilon S′→0S′∣1S′∣ε

二、上下文无关语法 的歧义性


给出如下上下文无关语法 ( CFG ) :

E x p r e s s i o n → E x p r e s s i o n + E x p r e s s i o n ∣ E x p r e s s i o n × E x p r e s s i o n ∣ E x p r e s s i o n ∣ a Expression \to Expression + Expression | Expression \times Expression | Expression | a Expression→Expression+Expression∣Expression×Expression∣Expression∣a

语法的含义是 :

  • E x p r e s s i o n Expression Expression 可以被 E x p r e s s i o n + E x p r e s s i o n Expression + Expression Expression+Expression 替换 ;
  • E x p r e s s i o n Expression Expression 可以被 E x p r e s s i o n × E x p r e s s i o n Expression \times Expression Expression×Expression 替换 ;
  • E x p r e s s i o n Expression Expression 可以被 E x p r e s s i o n Expression Expression 替换 ;
  • E x p r e s s i o n Expression Expression 可以被 a a a 替换 ;

1 . 语法的有歧义性 : 同样的一个字符串 , 可以有不同的语法分析树 ;

① 语法分析树 1 :

2 . 在上述的 语法分析树中 , 加法优先级高于乘法 , 这是错误的分析 ;

② 语法分析树 2 :

在上述的 语法分析树中 , 乘法优先级高于加法 , 这是正确的分析 ;

3 . 语法歧义性分析 : 上述语法中是无法区分 加法 和 乘法的优先级的 , 因此这里得到两个完全不一致得我语法分析树 , 那么该语法是有歧义的 ;

4 . 与代数表达式语法对比 : 之前讲的代数表达式是好的语法 , 乘法 和 加法的优先级 也体现出来 , 乘法优先级高于加法 , 括号的优先级高于乘法 ;

① 代数表达式语法 :

  • E x p r e s s i o n → E x p r e s s i o n + T e r m ∣ T e r m Expression \to Expression + Term \quad | \quad Term Expression→Expression+Term∣Term
  • T e r m → T e r m × F a c t o r ∣ F a c t o r Term \to Term \times Factor \quad | \quad Factor Term→Term×Factor∣Factor
  • F a c t o r → E x p r e s s i o n ∣ a Factor \to Expression \quad | \quad a Factor→Expression∣a

② 代数表达式语法分析树 : 这个语法分析树是唯一的 , 没有其它的形式 , 该语法是没有歧义的 ;

③ 有歧义的语法 : 在本节的语法中 , 无法区分 加法 和 乘法的优先级 , 该语法是有歧义的 ;

5 . 总结 : 如果语法有歧义 , 那么中间的字符串有歧义 ; 没有算法 可以判定 上下文无关语法 是否有歧义 ; 有些语法天生就是有歧义的 , 但可以通过某种方法去掉语法中的歧义性 ;

三、Chomsky 范式


1 . Chomsky 范式 : 上下文无关语法中的任何规则都是如下格式 ;

① A → B C A \to BC A→BC : A A A 是 变元 , B , C B,C B,C 也是变元 ;

② A → a A \to a A→a : A A A 是 变元 , a a a 是常元 , A A A 可以被终端字符替换 ;

③ B , C B ,C B,C 变元要求 : B , C B, C B,C 变元一定不能是开始变元 ;

④ S → ε S \to \varepsilon S→ε : S S S 开始变元可以为空 ;

⑤ 不能出现 变 元 → 变 元 变元 \to 变元 变元→变元 单个变元 到 单个变元不允许出现 ;

2 . S → ε S \to \varepsilon S→ε 规则 说明 :

① 语言包含空字符串 : 如果上下文无关语法包含空字符串时 , 一定需要 S → ε S \to \varepsilon S→ε 规则 ;

② 语言不包含空字符串 : 如果上下文无关语法不包含空字符串时 , 一定不需要 S → ε S \to \varepsilon S→ε 规则 ;

③ 规则总结 : 该规则决定 上下文无关语法 所生成的语言 是否包含 空字符串 , 如果包含必须要这个规则 , 如果不包含空字符串一定不要这个规则 ;

四、上下文无关语法 转为 Chomsky 范式


Chomsky 范式规则 的 上下文无关语法 生成的语言 的语法分析树 除叶子节点之外 都 是二叉树 , 叶子节点 与 上一层都是 一对一的节点 ;

任何 上下文无关语法 , 都可以找到一个 Chomsky 范式 与其等价 ;

任何 上下文无关语法 的语法分析树 都可以进行修剪 , 修剪后的树都是二叉树 ;

上下文无关语法 转为 Chomsky 范式 步骤 :

1 . 添加开始变元及规则 : 添加一个新的开始变元 S 0 S_0 S0​ , 以及配套的规则 S 0 → S S_0 \to S S0​→S , S S S 是旧的开始变元 ;

① 目的 : 添加开始变元的目的是 开始变元 永远出现在左边 ;

② Chomsky 范式 中 , 开始变元始终在规则的左边 , 不允许开始变元在规则的右侧 ;

③ 对应 Chomsky 范式 规则 : A → B C A \to BC A→BC 规则 , A A A 是 变元 , B , C B,C B,C 也是变元 , 并且 B , C B,C B,C 不允许是开始变元 ;

2 . 消除所有的 ε \varepsilon ε 规则 : 消除所有从 变元 到 空字符 的规则 ;

3 . 消除所有的 A → B A \to B A→B 规则 : 消除所有从 单个变元 到 单个变元的 单条规则 , 允许从 单个变元 到 多个变元或常元 ;

如 A → B A \to B A→B 是需要删除的 , A → B S A \to BS A→BS 可以保留 ;

五、上下文无关语法 转为 Chomsky 范式 示例


将 上下文无关语法 G 6 G6 G6 转为 Chomsky 范式 :

  • S → A S A ∣ a B S \to ASA | aB S→ASA∣aB
  • A → B ∣ S A \to B|S A→B∣S
  • B → b ∣ ε B \to b|\varepsilon B→b∣ε

转换过程如下 :

1 . 添加新的开始变元 : S 0 S_0 S0​ , 旧的开始变元 S S S 就不是开始变元了 ;

当前的语法格式如下 :

  • S 0 → S S_0 \to S S0​→S
  • S → A S A ∣ a B S \to ASA | aB S→ASA∣aB
  • A → B ∣ S A \to B|S A→B∣S
  • B → b ∣ ε B \to b|\varepsilon B→b∣ε

2 . 消除 ε \varepsilon ε 规则 :

消除 ε \varepsilon ε 规则 原则 : 假设有规则 C → ε C \to \varepsilon C→ε , D → u C v D \to uCv D→uCv , 如果要删除 ε \varepsilon ε 规则 , 需要实现 消除前后具有 相同的替换效果 , 将规则改为 D → u v D \to uv D→uv 即可删除 ε \varepsilon ε 相关规则 ;
( 消除前后 , 替换效果必须一致 )

3 . 消除 B → b ∣ ε B \to b|\varepsilon B→b∣ε 中的 ε \varepsilon ε : 会影响 S → A S A ∣ a B S \to ASA | aB S→ASA∣aB 和 A → B ∣ S A \to B|S A→B∣S 两条规则中涉及到了 B B B 变元 , 消除的原则是 " 消除前后 , 替换效果必须一致 " ;

3.1 . S → A S A ∣ a B S \to ASA | aB S→ASA∣aB 规则消除 ε \varepsilon ε 分析 : 这里讨论 消除 B → b ∣ ε B \to b|\varepsilon B→b∣ε 规则中的 B → ε B \to \varepsilon B→ε 规则 对 a B aB aB 的影响 ;

① 消除 B → ε B \to \varepsilon B→ε 规则前分析 : 使用 B → b ∣ ε B \to b|\varepsilon B→b∣ε 规则 对 a B aB aB 进行替换 有两种情况 , 分别是 a b ab ab , a a a , 两种情况 ;

② 消除 B → ε B \to \varepsilon B→ε 规则后分析 : 如果要消除 B → ε B \to \varepsilon B→ε 规则 , 那么消除后的规则是 B → b B \to b B→b , 使用 B → b B \to b B→b 规则对 a B aB aB 进行替换 , 其替换 结果必须是 a b ab ab , a a a , 两种情况 ;

分析 a b ab ab , a a a 两种结果 :

  • a B aB aB 使用 B → b B \to b B→b 规则替换 , 可以得到 a b ab ab ;

  • a a a 替换结果无法获取 , 此时需要在 a B aB aB 的平级 , 再次添加 a a a 即可达到上述效果 ;

a B aB aB 最终修改方案 : 将 a B aB aB 改为 a B ∣ a aB|a aB∣a , 使用 B → b B \to b B→b 规则替换 a B ∣ a aB|a aB∣a 的结果是 a b ab ab , a a a , 与上述消除 B → ε B \to \varepsilon B→ε 规则 前的结果一致 ;

③ S → A S A ∣ a B S \to ASA | aB S→ASA∣aB 规则对应的消除 B → ε B \to \varepsilon B→ε 规则后的结果为

S → A S A ∣ a B ∣ a S \to ASA | aB | a S→ASA∣aB∣a

④ 当前的语法格式如下 : 注意 还没有讨论 A → B ∣ S A \to B|S A→B∣S 规则中的 B B B , B → b ∣ ε B \to b|\varepsilon B→b∣ε 规则中的 ε \varepsilon ε 还不能删除 ;

  • S 0 → S S_0 \to S S0​→S
  • S → A S A ∣ a B ∣ a S \to ASA | aB | a S→ASA∣aB∣a
  • A → B ∣ S A \to B|S A→B∣S : 注意此时该规则不完善 , 还没有删除 ε \varepsilon ε ;
  • B → b B \to b B→b

3.2 . A → B ∣ S A \to B|S A→B∣S 规则消除 ε \varepsilon ε 分析 : 这里讨论 消除 B → b ∣ ε B \to b|\varepsilon B→b∣ε 规则中的 B → ε B \to \varepsilon B→ε 规则 对 B B B 的影响 ;

① 消除 B → ε B \to \varepsilon B→ε 规则前分析 : 使用 B → b ∣ ε B \to b|\varepsilon B→b∣ε 规则 对 B B B 进行替换 有两种情况 , 分别是 b b b , ε \varepsilon ε , 两种情况 ;

② 消除 B → ε B \to \varepsilon B→ε 规则后分析 : 如果要消除 B → ε B \to \varepsilon B→ε 规则 , 那么消除后的规则是 B → b B \to b B→b , 使用 B → b B \to b B→b 规则对 B B B 进行替换 , 其替换 结果必须是 b b b , ε \varepsilon ε , 两种情况 ;

分析 b b b , ε \varepsilon ε 两种结果 :

  • B B B 使用 B → b B \to b B→b 规则替换 , 可以得到 b b b ;

  • ε \varepsilon ε 替换结果无法获取 , 此时需要在 B B B 的平级 , 再次添加 ε \varepsilon ε 即可达到上述效果 ;

B B B 最终修改方案 : 将 B B B 改为 B ∣ ε B|\varepsilon B∣ε , 使用 B → b B \to b B→b 规则替换 B ∣ ε B|\varepsilon B∣ε 的结果是 b b b , ε \varepsilon ε , 与上述消除 B → ε B \to \varepsilon B→ε 规则 前的结果一致 ;

③ A → B ∣ S A \to B|S A→B∣S 规则对应的消除 B → ε B \to \varepsilon B→ε 规则后的结果为

A → B ∣ ε ∣ S A \to B| \varepsilon|S A→B∣ε∣S

④ 当前的语法格式如下 : 注意 还没有讨论 A → B ∣ S A \to B|S A→B∣S 规则中的 B B B , B → b ∣ ε B \to b|\varepsilon B→b∣ε 规则中的 ε \varepsilon ε 还不能删除 ;

  • S 0 → S S_0 \to S S0​→S
  • S → A S A ∣ a B ∣ a S \to ASA | aB | a S→ASA∣aB∣a
  • A → B ∣ ε ∣ S A \to B| \varepsilon |S A→B∣ε∣S
  • B → b B \to b B→b

4 . 消除 A → B ∣ ε ∣ S A \to B| \varepsilon |S A→B∣ε∣S 中的 ε \varepsilon ε : 会影响 S → A S A ∣ a B ∣ a S \to ASA | aB | a S→ASA∣aB∣a 规则中涉及到了 A A A 变元 , 消除的原则是 " 消除前后 , 替换效果必须一致 " ;

① 消除 A S A ASA ASA 中的 ε \varepsilon ε , 添加以下项即可 :

  • 第一个 A A A 通过 ε \varepsilon ε 代替 : 添加 S A SA SA 项 ;

  • 第二个 A A A 通过 ε \varepsilon ε 代替 : 添加 A S AS AS 项 ;

  • 两个 A A A 都通过 ε \varepsilon ε 代替 : 是 S S S , 可以不同写 , S → S S \to S S→S 没啥意义 ;

② S → A S A ∣ a B ∣ a S \to ASA | aB | a S→ASA∣aB∣a 规则对应的消除 A → ε A \to \varepsilon A→ε 规则后的结果为 :

S → A S A ∣ A S ∣ S A ∣ a B ∣ a S \to ASA | AS | SA | aB | a S→ASA∣AS∣SA∣aB∣a

③ 当前的语法格式如下 :

  • S 0 → S S_0 \to S S0​→S
  • S → A S A ∣ A S ∣ S A ∣ a B ∣ a S \to ASA | AS | SA | aB | a S→ASA∣AS∣SA∣aB∣a
  • A → B ∣ S A \to B| S A→B∣S
  • B → b B \to b B→b

5 . 消除 A → B A \to B A→B 规则 :

假设要消除 C → D C \to D C→D 规则 : 如果语法中有 D → W D \to W D→W 规则 , 那么如果消除 C → D C \to D C→D , 需要将 C → W C \to W C→W 体现出来 ;

消除 A → B A \to B A→B 规则 , 检查 B B B 出现在规则左边的情况 , 这里有 B → b B \to b B→b 规则 , 需要 添加 A → b A\to b A→b 规则后 , 即可删除 A → B A \to B A→B 规则 ;

删除前规则 :

  • S 0 → S S_0 \to S S0​→S
  • S → A S A ∣ A S ∣ S A ∣ a B ∣ a S \to ASA | AS | SA | aB | a S→ASA∣AS∣SA∣aB∣a
  • A → B ∣ S A \to B| S A→B∣S
  • B → b B \to b B→b

删除后规则如下 :

  • S 0 → S S_0 \to S S0​→S
  • S → A S A ∣ A S ∣ S A ∣ a B ∣ a S \to ASA | AS | SA | aB | a S→ASA∣AS∣SA∣aB∣a
  • A → b ∣ S A \to b| S A→b∣S

6 . 消除 A → S A \to S A→S 规则 :

① 消除 A → S A \to S A→S 规则 , 检查 S S S 出现在规则左边的情况 , 这里有 S → A S A ∣ A S ∣ S A ∣ a B ∣ a S \to ASA | AS | SA | aB | a S→ASA∣AS∣SA∣aB∣a 规则 , 需要 添加 A → A S A ∣ A S ∣ S A ∣ a B ∣ a A\to ASA | AS | SA | aB | a A→ASA∣AS∣SA∣aB∣a 规则后 , 即可删除 A → S A \to S A→S 规则 ;

② 删除前规则 :

  • S 0 → S S_0 \to S S0​→S
  • S → A S A ∣ A S ∣ S A ∣ a B ∣ a S \to ASA | AS | SA | aB | a S→ASA∣AS∣SA∣aB∣a
  • A → b ∣ S A \to b | S A→b∣S

③ 删除后规则如下 :

  • S 0 → S S_0 \to S S0​→S
  • S → A S A ∣ A S ∣ S A ∣ a B ∣ a S \to ASA | AS | SA | aB | a S→ASA∣AS∣SA∣aB∣a
  • A → b ∣ A S A ∣ A S ∣ S A ∣ a B ∣ a A \to b| ASA | AS | SA | aB | a A→b∣ASA∣AS∣SA∣aB∣a

7 . 分解规则 :

① 分解示例 : S → A S A S \to ASA S→ASA 可以分解为 S → R S \to R S→R , R → S A R \to SA R→SA

② 分解前的规则 :

  • S 0 → S S_0 \to S S0​→S
  • S → A S A ∣ A S ∣ S A ∣ a B ∣ a S \to ASA | AS | SA | aB | a S→ASA∣AS∣SA∣aB∣a
  • A → b ∣ A S A ∣ A S ∣ S A ∣ a B ∣ a A \to b| ASA | AS | SA | aB | a A→b∣ASA∣AS∣SA∣aB∣a

③ 分解后的规则 :

  • S 0 → S S_0 \to S S0​→S

下面的规则 是 S → A S A ∣ A S ∣ S A ∣ a B ∣ a S \to ASA | AS | SA | aB | a S→ASA∣AS∣SA∣aB∣a 分解后的规则 :

  • S → R S \to R S→R
  • R → S A R \to SA R→SA
  • S → A S S \to AS S→AS
  • S → S A S \to SA S→SA
  • S → a B S \to aB S→aB
  • S → a S \to a S→a

下面的规则 是 A → b ∣ A S A ∣ A S ∣ S A ∣ a B ∣ a A \to b| ASA | AS | SA | aB | a A→b∣ASA∣AS∣SA∣aB∣a 分解后的规则 :

  • A → b A \to b A→b
  • A → R A \to R A→R
  • A → S A A \to SA A→SA
  • A → A S A \to AS A→AS
  • A → S A A \to SA A→SA
  • A → a B A \to aB A→aB
  • A → a A \to a A→a

【计算理论】上下文无关语法 CFG ( CFG 设计示例 | CFG 歧义性 | Chomsky 范式 | 上下文无关语法 转为 Chomsky 范式 )相关推荐

  1. 【计算理论】计算理论总结 ( 上下文无关文法 CFG 转为下推自动机 PDA 示例 2 ) ★★

    文章目录 一.上下文无关文法 CFG 转为下推自动机 PDA 流程 二.上下文无关文法 CFG 转为下推自动机 PDA 示例 2 参考博客 : [计算理论]上下文无关语法 ( 语法组成 | 规则 | ...

  2. 【计算理论】计算理论总结 ( 上下文无关文法 CFG 转为下推自动机 PDA 示例 1 ) ★★

    文章目录 一.上下文无关文法 CFG 转为下推自动机 PDA 流程 二.上下文无关文法 CFG 转为下推自动机 PDA 示例 1 参考博客 : [计算理论]上下文无关语法 ( 语法组成 | 规则 | ...

  3. 【计算理论】计算理论总结 ( 下推自动机计算过程 | 上下文无关文法 CFG 转为下推自动机 PDA ) ★★

    文章目录 一.下推自动机计算过程 二.上下文无关文法 CFG 转为下推自动机 PDA 流程 参考博客 : [计算理论]上下文无关语法 ( 语法组成 | 规则 | 语法 | 语法示例 | 约定的简写形式 ...

  4. 【计算理论】下推自动机 PDA ( 设计下推自动机 | 上下文无关语法 CFG 等价于 下推自动机 PDA )

    文章目录 I . 下推自动机 设计 II . 上下文无关语法 ( CFG ) 等价于 下推自动机 ( PDA ) I . 下推自动机 设计 设计下推自动机 , 可以识别 {wwR:w∈{0,1}∗}\ ...

  5. 【计算理论】上下文无关语法 ( 代数表达式 | 代数表达式示例 | 确定性有限自动机 DFA 转为 上下文无关语法 )

    文章目录 I . 代数表达式 语法 II . 代数表达式 语法 示例 III . 设计 上下文无关语法 IV . 确定性有限自动机 DFA 转为 上下文无关语法 I . 代数表达式 语法 1 . 代数 ...

  6. 【计算理论】下推自动机 PDA ( 上下文无关语言 CFL 的 泵引理 | 泵引理反证示例 | 自动机扩展 )

    文章目录 I . 上下文无关语言 ( CFL ) 的 泵引理 ( Pumping Lemma ) II . 上下文无关语言 ( CFL ) 的 泵引理 ( Pumping Lemma ) 示例 III ...

  7. 计算理论——正则语言,上下文无关文法,图灵机,可判定性,可规约性

    目录 第一章 正则语言 状态图 自动机的形式化定义 非确定性 正则表达式 泵引理 使用泵引理证明某个语言非正则的方法 第二章 上下文无关文法 上下文无关文法概述 1.上下文无关文法形式化定义 2.上下 ...

  8. 【计算理论】计算理论总结 ( 自动机设计 ) ★★

    文章目录 一.自动机设计 二.自动机设计 1 三.自动机设计 2 四.自动机设计 3 五.自动机设计技巧 一.自动机设计 设计自动机 : 之前是根据给定的自动机 , 找到自动机所能识别的语言 ; 现在 ...

  9. 【计算理论】计算理论总结 ( 图灵机设计示例 ) ★★

    文章目录 一.图灵机设计示例 2 二.图灵机设计示例 3 三.图灵机设计示例 4 一.图灵机设计示例 2 给定语言 : A={w∣w包含相同个数的0和1}\rm A = \{w | w 包含相同个数的 ...

最新文章

  1. R语言officer、flextable包生成word报告
  2. lftp 4.4.0 发布,命令行的FTP工具
  3. ASP.NET MVC
  4. 可编辑选择、删除条目的ListView
  5. bzoj 4898: [Apio2017]商旅【Floyd+分数规划+二分】
  6. 将Java Flight Recorder与OpenJDK 11结合使用
  7. 前端学习(2580):提升开发效率的工具
  8. 【51nod-1289】大鱼吃小鱼
  9. 405 Method Not Allowed
  10. Floyd Warshall算法
  11. Nagios监控HP硬件状态
  12. c# 如何抓微信把柄_抓住把柄表情包 - 抓住把柄微信表情包 - 抓住把柄QQ表情包 - 发表情 fabiaoqing.com...
  13. 网站性能工具-YSlow的23个规则-网站性能优化
  14. Go全栈面试题(3) -微服务面试题
  15. spring切点表达式提取jdk版本与aspectjweaver版本不匹配
  16. 模拟电子技术基础_常用半导体器件
  17. wps怎么把ppt里的字体一起保存_WPS怎样将PPT中的文字导出为Word文档?
  18. DOTA模式命令详解 及 DotA英雄英文名字和简称
  19. 【遥感科学】第二章 电磁辐射和地物光谱特性
  20. matlab 2013至2016 32bit、64bit破解版集合 百度云盘下载

热门文章

  1. 神秘海域:失落的遗产 - 概念艺术
  2. 梯度下降(批量梯度下降)
  3. 来培训的理由和小目标
  4. watching memory
  5. python如何安装Dlib库(超简单的方法,亲测有效)
  6. 【Bleak】七、使能通知
  7. 阿里云 OSS 云存储 文件上传
  8. react项目中px转rem
  9. 零基础入门必备:搞懂压力测试和负载测试
  10. LT8619C中文简介