语言构造文法的方法⭐
⭐⭐⭐⭐⭐⭐
Github主页👉https://github.com/A-BigTree
项目链接👉https://github.com/A-BigTree/college_assignment
⭐⭐⭐⭐⭐⭐
由语言构造文法的常用方法有4个:
- 对称法
- 逐步求精法(分解法)
- 等价法
- 电路状态转换法
对称法
适用于存在对称性的语言,方法如下:
- 找出对称轴
- 找出对称性
列题:
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={a2nbn∣n>1 and a,b∈VT}
观察可得:
- n = 1 时 , L = a a b n=1时,L=aab n=1时,L=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)S⇒aaSb(2)S⇒aab
逐步求精法(分解法)
-
两种方法:自上而下或者从左到右;
-
使用条件:语言各成分之间没有关联;
例题:
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={aibjck∣i,j,k≥1 and a,b∈VT}
- 自上而下求精法:
分析:
我们把
a
i
,
b
j
,
c
k
a^i,b^j,c^k
ai,bj,ck各自看成一个整体,由
i
≥
1
i\ge 1
i≥1,语言中最少存在一个
a
a
a,所以可以写成这样的文法:
A
⇒
a
A
∣
a
A\Rightarrow aA|a
A⇒aA∣a。同理可以得到其他两个,推出以下文法:
(
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)S⇒ABC(2)A⇒aA∣a(3)B⇒bB∣b(4)C⇒cC∣c
- 从左向右求精法:
分析:
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=a∗ai−1bjck,其中
i
−
1
≥
0
i-1\ge 0
i−1≥0。当
i
−
1
≥
1
i-1\ge1
i−1≥1时,
S
⇒
a
S
S\Rightarrow aS
S⇒aS;当
i
−
1
=
0
时
,
S
⇒
a
A
i-1=0时,S\Rightarrow aA
i−1=0时,S⇒aA。
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)S⇒aS∣aA(2)A⇒bA∣bB(3)B⇒cB∣c
等价法
产生式两边具有相同特性
例题:
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 S⇒aA
- 当以 b b b开头时, S ⇒ b B S\Rightarrow bB S⇒bB
- S S S可以为空, S ⇒ ϵ S\Rightarrow \epsilon S⇒ϵ
在 S 、 A 、 B S、A、B S、A、B中, a , b a,b a,b的数量满足:
- 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 A⇒bS∣b;若以 a a a开头: A ⇒ a A A A\Rightarrow aAA A⇒aAA
同理推出以下文法:
(
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)S⇒aA∣bB∣ϵ(2)A⇒bS∣b∣aAA(3)B⇒aS∣a∣bBB
电路状态转换法
语言中对元素有奇偶要求
电路状态概念:0代表偶,1代表奇;
比如000代表语言中a,b,c的个数都是偶数,现在增加一个a,那么电路状态就转换成100,同理b,c如下图:
结题步骤:
-
构造电路状态转换图
首先确定状态,如果有n个元素,则存在 2 n 2^n 2n个状态,然后链接状态。下图为3个元素的所有状态转换:
-
确定开始状态和结束状态
开始状态和结束状态是相对的,视题目具体情况确定:
- 以全是0作为结束状态,以题目要求作为开始状态;
- 以题目要求作为结束状态,以全是0作为开始状态;
- 比如对于某种语言,以a或b开头,以c结尾,abc的数量皆是偶数,那么开始状态就不是唯一的,就不能用全是0作为开始状态。而结束状态是唯一的,所以可以拿全是0作为结束状态;
-
命名各个状态
初始状态用 S S S命名,其他状态用 A , B , C … A,B,C\dots A,B,C…命名;
-
写出相应的产生式
每条边的变化都对应一条产生式,对结束状态要增加一条产生式: 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)S⇒0S∣1A∣ϵ(2)A⇒0A∣1S