计算理论基础-2-上下文无关语言

学习资料:

https://blog.csdn.net/happyeveryday62/article/details/103845740

六、上下文无关语言

Conventions 约定规定

  • 字符A,B,C,… : Grammar Variables 文法变量(大写)

  • 字符a, b, c, … : Grammar Terminals 文法终结符 (小写)

    • 一些字符串也可以作为文法终结符,例如num, id等
  • α , β , γ , δ … \alpha,\beta,\gamma,\delta … αβγδ 表示一些符号标志字符串

    • ε \varepsilon ε可以表示变量 和/或 终结符

特定的文法规定:

  • 最左侧的为最高规则
  • 可以简写规则。例如: A → a , A → β , A → γ A\rightarrow a, A \rightarrow \beta, A \rightarrow \gamma Aa,Aβ,Aγ 可以总结为; A → α ∣ β ∣ γ A \rightarrow \alpha | \beta |\gamma Aαβγ
  • 左侧规则(变量) => 右侧规则(变量/终结符)

CFG(Context-free Grammar)上下文无关文法

定义:

FhsyS1

由文法生成的所有字符串的集合称为文法的语言

例子:

  1. { a n b n ∣ n ≥ 0 } \{a^nb^n|n\ge0\} {anbnn0}

    使用CFG表示其规则为: A → a A b ∣ ε A \rightarrow aAb|\varepsilon AaAbε

    解释: A可以递推为 a A b aAb aAb可以为递归为空串 ε \varepsilon ε,当仅递归一次且为空串时,就表示n=1即ab,当递归多次时,例如n=2,对应的推导过程就是: $A \rightarrow aAb \rightarrow aaAbb \rightarrow aabb $

  2. RDtniT

Grammar in Chomsky Normal Form 乔姆斯基范氏

定义:

ZyCjqZ

首先必须是CFG,其次每个规则都满足如上范式那么就是乔姆斯基范式

乔姆斯基范式有两个特点:1. 一分为二 2.终级化.

Normalization of a CFG 标准化上下文无关文法

任意一个上下文无关文法CFG转为乔姆斯基范式的步骤如下:

  1. 引入新的起始变元

    例如:原来为 S → a S \rightarrow a Sa,现在为 S 0 → S , S → a S_0 \rightarrow S, S \rightarrow a S0S,Sa

  2. 从下往上删除 A → ε A \rightarrow \varepsilon Aε规则

    例如: 将$B \rightarrow xAy 和 和 A \rightarrow \varepsilon$改为 B → x A y ∣ x y B \rightarrow xAy | xy BxAyxy

  3. 从上往下删除传递规则

    例如:将 A → B A \rightarrow B AB B → x C y B \rightarrow xCy BxCy改为 A → x C y A \rightarrow xCy AxCy B → x C y B \rightarrow xCy BxCy

  4. 添加新变元,使得所有变量规则都是一分为二

    例如:将 A → B 1 B 2 … B k A\rightarrow B_1B_2…B_k AB1B2Bk 改为 A → B 1 A 1 , A 1 → B 2 A 2 , … , A k − 2 → B k − 1 B k A \rightarrow B_1A_1, A_1 \rightarrow B_2A_2, …,A_{k-2} \rightarrow B_{k-1}B_k AB1A1,A1B2A2,,Ak2Bk1Bk

  5. 添加终结符规则

    例如 : a a a改为 T a → a T_a \rightarrow a Taa

例子
  1. S → a S b ∣ ε S \rightarrow aSb|\varepsilon SaSbε标准化

    1. 第一步:引入新的起始变元

      S 0 → S , S → a S b ∣ ε S_0 \rightarrow S, S \rightarrow aSb|\varepsilon S0S,SaSbε

    2. 第二步:删除 ε \varepsilon ε(从后往前)

      S → a S b ∣ ε S \rightarrow aSb|\varepsilon SaSbε 变为 S → a S b ∣ a b S \rightarrow aSb|ab SaSbab

      初始的不删除, 否则规则改变(没有 ε \varepsilon ε),变为 : S 0 → S ∣ ε S_0 \rightarrow S | \varepsilon S0Sε

    3. 第三步:从上往下删除传递规则

      改变为: S 0 → a S b ∣ a b | ε , S → a S b ∣ a b S_0 \rightarrow aSb|ab|\varepsilon, S \rightarrow aSb|ab S0aSbabε,SaSbab

    4. 第四步:添加新变元,使得所有变量规则都是一分为二

      S 1 = S b S_1= Sb S1=Sb, 则变为 S 0 → a S 1 ∣ a b | ε , S → a S 1 ∣ a b , S 1 → S b S_0 \rightarrow aS_1|ab|\varepsilon, S \rightarrow aS_1|ab, S_1\rightarrow Sb S0aS1abε,SaS1ab,S1Sb

    5. 第五步:添加终结符规则

      T a → a , T b → b T_a \rightarrow a, T_b \rightarrow b Taa,Tbb, 则变为: S 0 → T a S 1 ∣ T a T b | ε , S → T a S 1 ∣ T a T b , S 1 → S T b , T a → a , T b → b S_0 \rightarrow T_aS_1|T_aT_b|\varepsilon, S \rightarrow T_aS_1|T_aT_b, S_1\rightarrow ST_b, T_a\rightarrow a, T_b \rightarrow b S0TaS1TaTbε,STaS1TaTb,S1STb,Taa,Tbb

    至此, S 0 、 S 、 S 1 S_0、S、S_1 S0SS1均符合 A → B C A \rightarrow BC ABC, 且B、C即 T a 、 T b 、 S 1 T_a、T_b、S_1 TaTbS1均不为初始变元; T a 、 T b 符 合 A → a T_a、T_b符合A \rightarrow a TaTbAa

  2. y44Fj1

DFA转换为CFG

因为 R L ⊆ C F G RL \subseteq CFG RLCFG, 所以DFA都可以转换成为CFG

D F A = ( Q , Σ , q 0 , F , δ ) DFA = (Q,\Sigma,q_0,F,\delta) DFA=(Q,Σ,q0,F,δ), C F G = ( V , Σ , R , S ) CFG = (V,\Sigma,R,S) CFG=(V,Σ,R,S)

方法:
  1. V = Q , S = q 0 V = Q, S = q_0 V=Q,S=q0

  2. 求CFG的规则:

    根据转移函数的变换规则: q i → x δ ( q i , x )   f o r   a l l   q i ∈ V a n d   a l l   x ∈ Σ q_i \rightarrow x\delta(q_i,x) \ for \ all \ q_i \in V and \ all \ x\in \Sigma qixδ(qi,x) for all qiVand all xΣ

    根据终态的变换规则: q i → ε   f o r   a l l   q i   i n   F q_i \rightarrow \varepsilon \ for \ all \ q_i \ in \ F qiε for all qi in F

例子

eb38q5

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xxx_undefined

谢谢请博主吃糖

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值