【编译原理】2—语言构造文法的方法⭐

本文详细介绍了构造语言文法的四种方法:对称法、逐步求精法(分解法)、等价法和电路状态转换法,并通过实例解析了每种方法的运用。对称法适用于对称性语言,逐步求精法则分为自上而下和从左到右两种方式,等价法基于产生式两边的特性,电路状态转换法则针对元素奇偶性要求的语言。通过对这些方法的理解,读者能够更好地理解和构建形式语言的文法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

语言构造文法的方法⭐

⭐⭐⭐⭐⭐⭐
Github主页👉https://github.com/A-BigTree
项目链接👉https://github.com/A-BigTree/college_assignment
⭐⭐⭐⭐⭐⭐

由语言构造文法的常用方法有4个:

  • 对称法
  • 逐步求精法(分解法)
  • 等价法
  • 电路状态转换法

对称法

适用于存在对称性的语言,方法如下:

  1. 找出对称轴
  2. 找出对称性

列题:
L = { a 2 n b n ∣ n > 1   a n d   a , b ∈ V T } L=\{a^{2n}b^n|n>1\ and\ a,b\in V_T\} L={a2nbnn>1 and a,bVT}
观察可得:

  • n = 1 时 , L = a a b n=1时,L=aab n=1L=aab
  • $n=2时,L=aaaab\Rightarrow L=aa\mathbf{aab}b $

我们可以推出以下文法:
( 1 ) S ⇒ a a S b ( 2 ) S ⇒ a a b (1)S\Rightarrow aaSb\\ (2)S\Rightarrow aab (1)SaaSb(2)Saab

逐步求精法(分解法)

  1. 两种方法:自上而下或者从左到右

  2. 使用条件:语言各成分之间没有关联;

例题:
L 2 = { a i b j c k ∣ i , j , k ≥ 1   a n d   a , b ∈ V T } L_2=\{a^ib^jc^k|i,j,k\ge 1\ and\ a,b \in V_T\} L2={aibjcki,j,k1 and a,bVT}

  • 自上而下求精法:

分析:

我们把 a i , b j , c k a^i,b^j,c^k ai,bj,ck各自看成一个整体,由 i ≥ 1 i\ge 1 i1,语言中最少存在一个 a a a,所以可以写成这样的文法: A ⇒ a A ∣ a A\Rightarrow aA|a AaAa。同理可以得到其他两个,推出以下文法:
( 1 ) S ⇒ A B C ( 2 ) A ⇒ a A ∣ a ( 3 ) B ⇒ b B ∣ b ( 4 ) C ⇒ c C ∣ c (1)S\Rightarrow ABC\\ (2)A\Rightarrow aA|a\\ (3)B\Rightarrow bB|b\\ (4)C\Rightarrow cC|c (1)SABC(2)AaAa(3)BbBb(4)CcCc

  • 从左向右求精法:

分析:

a i b j c k = a ∗ a i − 1 b j c k a^ib^jc^k = a^*a^{i-1}b^jc^k aibjck=aai1bjck,其中 i − 1 ≥ 0 i-1\ge 0 i10。当 i − 1 ≥ 1 i-1\ge1 i11时, S ⇒ a S S\Rightarrow aS SaS;当 i − 1 = 0 时 , S ⇒ a A i-1=0时,S\Rightarrow aA i1=0SaA A A A对应语言是 b j c k b^jc^k bjck,同理可以推出以下文法:
( 1 ) S ⇒ a S ∣ a A ( 2 ) A ⇒ b A ∣ b B ( 3 ) B ⇒ c B ∣ c (1)S\Rightarrow aS|aA\\ (2)A\Rightarrow bA|bB\\ (3)B\Rightarrow cB|c (1)SaSaA(2)AbAbB(3)BcBc

等价法

产生式两边具有相同特性

例题:
L 3 = { ω ∣ ω ∈ ( a , b ) ∗   a n d   a , b 数 量 相 同 } L_3 =\{\omega|\omega\in(a,b)^*\ and\ a,b数量相同\} L3={ωω(a,b) and a,b}
分析:

首先我们写出下面三个产生式:

  • 当以 a a a开头时, S ⇒ a A S\Rightarrow aA SaA
  • 当以 b b b开头时, S ⇒ b B S\Rightarrow bB SbB
  • S S S可以为空, S ⇒ ϵ S\Rightarrow \epsilon Sϵ

S 、 A 、 B S、A、B SAB中, a , b a,b ab的数量满足:

  • S :   ∣ a ∣ = ∣ b ∣ S:\ |a|=|b| S: a=b
  • A :   ∣ a ∣ + 1 = ∣ b ∣ A:\ |a|+1=|b| A: a+1=b
  • B :   ∣ b ∣ + 1 = ∣ a ∣ B:\ |b|+1=|a| B: b+1=a

A A A中,若以 b b b开头: A ⇒ b S ∣ b A\Rightarrow bS|b AbSb;若以 a a a开头: A ⇒ a A A A\Rightarrow aAA AaAA

同理推出以下文法:
( 1 ) S ⇒ a A ∣ b B ∣ ϵ ( 2 ) A ⇒ b S ∣ b ∣ a A A ( 3 ) B ⇒ a S ∣ a ∣ b B B (1)S\Rightarrow aA|bB|\epsilon\\ (2)A\Rightarrow bS|b|aAA\\ (3)B\Rightarrow aS|a|bBB (1)SaAbBϵ(2)AbSbaAA(3)BaSabBB

电路状态转换法

语言中对元素有奇偶要求

电路状态概念:0代表偶,1代表奇;

比如000代表语言中a,b,c的个数都是偶数,现在增加一个a,那么电路状态就转换成100,同理b,c如下图:
在这里插入图片描述

结题步骤:

  1. 构造电路状态转换图

    首先确定状态,如果有n个元素,则存在 2 n 2^n 2n个状态,然后链接状态。下图为3个元素的所有状态转换:
    在这里插入图片描述

  2. 确定开始状态和结束状态

    开始状态和结束状态是相对的,视题目具体情况确定:

    • 以全是0作为结束状态,以题目要求作为开始状态;
    • 以题目要求作为结束状态,以全是0作为开始状态;
    • 比如对于某种语言,以a或b开头,以c结尾,abc的数量皆是偶数,那么开始状态就不是唯一的,就不能用全是0作为开始状态。而结束状态是唯一的,所以可以拿全是0作为结束状态;
  3. 命名各个状态

    初始状态用 S S S命名,其他状态用 A , B , C … A,B,C\dots A,B,C命名;

  4. 写出相应的产生式

    每条边的变化都对应一条产生式,对结束状态要增加一条产生式: G ⇒ ϵ G\Rightarrow \epsilon Gϵ,严格来说,最后可以写出 2 n ( n + 1 ) + 1 2^{n}(n+1)+1 2n(n+1)+1条产生式;

例题:
L 4 = { ω ∣ ω ∈ ( 0 , 1 ) ∗ , 1 的 数 量 为 偶 数 } L_4=\{\omega|\omega\in(0,1)^*,1的数量为偶数\} L4={ωω(0,1),1}
电路状态转换图如下所示:

在这里插入图片描述

由题可得,共有两个状态:

  • S S S:1的数量为偶数, A A A:1的数量为奇数;
  • S S S作为终止状态;

根据状态转换图推出以下产生式:
( 1 ) S ⇒ 0 S ∣ 1 A ∣ ϵ ( 2 ) A ⇒ 0 A ∣ 1 S (1)S\Rightarrow 0S|1A|\epsilon\\ (2)A\Rightarrow 0A|1S (1)S0S1Aϵ(2)A0A1S

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一棵___大树

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值