首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【计算理论】上下文无关语法 CFG ( CFG 设计示例 | CFG 歧义性 | Chomsky 范式 | 上下文无关语法 转为 Chomsky 范式 )

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

作者头像
韩曙亮
发布于 2023-03-27 20:16:17
发布于 2023-03-27 20:16:17
1.8K0
举报

文章目录

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


1 . 上下文无关语法 设计要求 : 设计一个语法 , 使用该语法生成语言

w

, 该

w

语言的字符串的开始和结尾的字符是相同的 ;

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

3 . 语法设计要求分析 :

  • 开始字符 要么是
0

, 要么就是

1

;

  • 如果开始字符是
0

, 对应的结尾字符也是

0

;

  • 如果开始字符是
1

, 对应的结尾字符也是

1

;

4 . 初始状态

S

规则 : 上述语法描述转为规则 如下 , 其中

S

为初始状态 ;

S \to 0S'0 | 1S'1

5 .

S'

规则 :

S'

表示中间的字符串 , 这个

S'

字符串可以是任意字符串 , 根据下面的规则可以生成任意的

0,1

组成的字符串 ;

S' \to 0S' | 1S' | \varepsilon

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


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

Expression \to Expression + Expression | Expression \times Expression | Expression | a

语法的含义是 :

Expression

可以被

Expression + Expression

替换 ;

Expression

可以被

Expression \times Expression

替换 ;

Expression

可以被

Expression

替换 ;

Expression

可以被

a

替换 ;

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

① 语法分析树 1 :

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

② 语法分析树 2 :

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

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

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

① 代数表达式语法 :

Expression \to Expression + Term \quad | \quad Term
Term \to Term \times Factor \quad | \quad Factor
Factor \to Expression \quad | \quad a

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

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

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

三、Chomsky 范式


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

①

A \to BC

:

A

是 变元 ,

B,C

也是变元 ;

②

A \to a

:

A

是 变元 ,

a

是常元 ,

A

可以被终端字符替换 ;

③

B ,C

变元要求 :

B, C

变元一定不能是开始变元 ;

④

S \to \varepsilon

:

S

开始变元可以为空 ;

⑤ 不能出现

变元 \to 变元

单个变元 到 单个变元不允许出现 ;

2 .

S \to \varepsilon

规则 说明 :

① 语言包含空字符串 : 如果上下文无关语法包含空字符串时 , 一定需要

S \to \varepsilon

规则 ;

② 语言不包含空字符串 : 如果上下文无关语法不包含空字符串时 , 一定不需要

S \to \varepsilon

规则 ;

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

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


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

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

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

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

1 . 添加开始变元及规则 : 添加一个新的开始变元

S_0

, 以及配套的规则

S_0 \to S

,

S

是旧的开始变元 ;

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

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

③ 对应 Chomsky 范式 规则 :

A \to BC

规则 ,

A

是 变元 ,

B,C

也是变元 , 并且

B,C

不允许是开始变元 ;

2 . 消除所有的

\varepsilon

规则 : 消除所有从 变元 到 空字符 的规则 ;

3 . 消除所有的

A \to B

规则 : 消除所有从 单个变元 到 单个变元的 单条规则 , 允许从 单个变元 到 多个变元或常元 ;

如

A \to B

是需要删除的 ,

A \to BS

可以保留 ;

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


将 上下文无关语法

G6

转为 Chomsky 范式 :

S \to ASA | aB
A \to B|S
B \to b|\varepsilon

转换过程如下 :

1 . 添加新的开始变元 :

S_0

, 旧的开始变元

S

就不是开始变元了 ;

当前的语法格式如下 :

S_0 \to S
S \to ASA | aB
A \to B|S
B \to b|\varepsilon

2 . 消除

\varepsilon

规则 :

消除

\varepsilon

规则 原则 : 假设有规则

C \to \varepsilon

,

D \to uCv

, 如果要删除

\varepsilon

规则 , 需要实现 消除前后具有 相同的替换效果 , 将规则改为

D \to uv

即可删除

\varepsilon

相关规则 ; ( 消除前后 , 替换效果必须一致 )

3 . 消除

B \to b|\varepsilon

中的

\varepsilon

: 会影响

S \to ASA | aB

和

A \to B|S

两条规则中涉及到了

B

变元 , 消除的原则是 " 消除前后 , 替换效果必须一致 " ;

3.1 .

S \to ASA | aB

规则消除

\varepsilon

分析 : 这里讨论 消除

B \to b|\varepsilon

规则中的

B \to \varepsilon

规则 对

aB

的影响 ;

① 消除

B \to \varepsilon

规则前分析 : 使用

B \to b|\varepsilon

规则 对

aB

进行替换 有两种情况 , 分别是

ab

,

a

, 两种情况 ;

② 消除

B \to \varepsilon

规则后分析 : 如果要消除

B \to \varepsilon

规则 , 那么消除后的规则是

B \to b

, 使用

B \to b

规则对

aB

进行替换 , 其替换 结果必须是

ab

,

a

, 两种情况 ;

分析

ab

,

a

两种结果 :

aB

使用

B \to b

规则替换 , 可以得到

ab

;

a

替换结果无法获取 , 此时需要在

aB

的平级 , 再次添加

a

即可达到上述效果 ;

aB

最终修改方案 : 将

aB

改为

aB|a

, 使用

B \to b

规则替换

aB|a

的结果是

ab

,

a

, 与上述消除

B \to \varepsilon

规则 前的结果一致 ;

③

S \to ASA | aB

规则对应的消除

B \to \varepsilon

规则后的结果为

S \to ASA | aB | a

④ 当前的语法格式如下 : 注意 还没有讨论

A \to B|S

规则中的

B

,

B \to b|\varepsilon

规则中的

\varepsilon

还不能删除 ;

S_0 \to S
S \to ASA | aB | a
A \to B|S

: 注意此时该规则不完善 , 还没有删除

\varepsilon

;

B \to b

3.2 .

A \to B|S

规则消除

\varepsilon

分析 : 这里讨论 消除

B \to b|\varepsilon

规则中的

B \to \varepsilon

规则 对

B

的影响 ;

① 消除

B \to \varepsilon

规则前分析 : 使用

B \to b|\varepsilon

规则 对

B

进行替换 有两种情况 , 分别是

b

,

\varepsilon

, 两种情况 ;

② 消除

B \to \varepsilon

规则后分析 : 如果要消除

B \to \varepsilon

规则 , 那么消除后的规则是

B \to b

, 使用

B \to b

规则对

B

进行替换 , 其替换 结果必须是

b

,

\varepsilon

, 两种情况 ;

分析

b

,

\varepsilon

两种结果 :

B

使用

B \to b

规则替换 , 可以得到

b

;

\varepsilon

替换结果无法获取 , 此时需要在

B

的平级 , 再次添加

\varepsilon

即可达到上述效果 ;

B

最终修改方案 : 将

B

改为

B|\varepsilon

, 使用

B \to b

规则替换

B|\varepsilon

的结果是

b

,

\varepsilon

, 与上述消除

B \to \varepsilon

规则 前的结果一致 ;

③

A \to B|S

规则对应的消除

B \to \varepsilon

规则后的结果为

A \to B| \varepsilon|S

④ 当前的语法格式如下 : 注意 还没有讨论

A \to B|S

规则中的

B

,

B \to b|\varepsilon

规则中的

\varepsilon

还不能删除 ;

S_0 \to S
S \to ASA | aB | a
A \to B| \varepsilon |S
B \to b

4 . 消除

A \to B| \varepsilon |S

中的

\varepsilon

: 会影响

S \to ASA | aB | a

规则中涉及到了

A

变元 , 消除的原则是 " 消除前后 , 替换效果必须一致 " ;

① 消除

ASA

中的

\varepsilon

, 添加以下项即可 :

  • 第一个
A

通过

\varepsilon

代替 : 添加

SA

项 ;

  • 第二个
A

通过

\varepsilon

代替 : 添加

AS

项 ;

  • 两个
A

都通过

\varepsilon

代替 : 是

S

, 可以不同写 ,

S \to S

没啥意义 ;

②

S \to ASA | aB | a

规则对应的消除

A \to \varepsilon

规则后的结果为 :

S \to ASA | AS | SA | aB | a

③ 当前的语法格式如下 :

S_0 \to S
S \to ASA | AS | SA | aB | a
A \to B| S
B \to b

5 . 消除

A \to B

规则 :

假设要消除

C \to D

规则 : 如果语法中有

D \to W

规则 , 那么如果消除

C \to D

, 需要将

C \to W

体现出来 ;

消除

A \to B

规则 , 检查

B

出现在规则左边的情况 , 这里有

B \to b

规则 , 需要 添加

A\to b

规则后 , 即可删除

A \to B

规则 ;

删除前规则 :

S_0 \to S
S \to ASA | AS | SA | aB | a
A \to B| S
B \to b

删除后规则如下 :

S_0 \to S
S \to ASA | AS | SA | aB | a
A \to b| S

6 . 消除

A \to S

规则 :

① 消除

A \to S

规则 , 检查

S

出现在规则左边的情况 , 这里有

S \to ASA | AS | SA | aB | a

规则 , 需要 添加

A\to ASA | AS | SA | aB | a

规则后 , 即可删除

A \to S

规则 ;

② 删除前规则 :

S_0 \to S
S \to ASA | AS | SA | aB | a
A \to b | S

③ 删除后规则如下 :

S_0 \to S
S \to ASA | AS | SA | aB | a
A \to b| ASA | AS | SA | aB | a

7 . 分解规则 :

① 分解示例 :

S \to ASA

可以分解为

S \to R

,

R \to SA

② 分解前的规则 :

S_0 \to S
S \to ASA | AS | SA | aB | a
A \to b| ASA | AS | SA | aB | a

③ 分解后的规则 :

S_0 \to S

下面的规则 是

S \to ASA | AS | SA | aB | a

分解后的规则 :

S \to R
R \to SA
S \to AS
S \to SA
S \to aB
S \to a

下面的规则 是

A \to b| ASA | AS | SA | aB | a

分解后的规则 :

A \to b
A \to R
A \to SA
A \to AS
A \to SA
A \to aB
A \to a
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-05-19,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 文章目录
  • 一、上下文无关语法 设计 示例
  • 二、上下文无关语法 的歧义性
  • 三、Chomsky 范式
  • 四、上下文无关语法 转为 Chomsky 范式
  • 五、上下文无关语法 转为 Chomsky 范式 示例
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档