字母表与符号串
在介绍字母表和符号串之前,让我们来看看下面的例子:
A = {a, b, c, …, A, B, C, …}
B = {0, 1}
C = {0, 1, 2, …, 8, 9}
由集合A中的元素任意组合可以得到英文单词, 由集合B中的任意元素组合可以得到二进制数据,由C中的任意元素可以得到非负整数。
上例中, 每个集合就可以看成一个字母表, 集合中的元素就是符号, 字母表通常用大写的字母表示。由字母表中的元素互相组合生成的串就叫符号串, 我们也常称为字符串或串。
下面给出字母表和符号串的相关定义:
- 字母表是符号的非空有穷集合, 符号是语言中最基本的不可再分单位。
- 符号串是字母表中符号组成的有穷序列
不含任何符号的串称为空串, 记作 ε
字母表上的符号以某种规则构成的串称为句子
为了便于研究, 通常我们将大写字母A,B,C等表示集合, a,b,c等表示符号, α,β 等表示符号串, 又是也会加上下标。
联结
联结是符号串集的乘积, 联结还是一个串集。
串集A={α1,α2,…},B={β1,β2,…},则联结AB={αβ| α∈ A且β∈ B},假设A有n个元素, B有m个元素,则联结AB就有n×m个元素。
联结具有以下性质(设A有m个元素):
- 串集自身的乘积称作串集的方幂
- A0={ε} A 0 = { ε } 且 |An|=mn | A n | = m n
- 字母表A的n次方幂是字母表A上所有长度为n的串集
闭包与正闭包
假设有字母表A, 则闭包为
正闭包为:
正闭包即为:
字母表上的语言是字母表正闭包的子集
文法(重点)
文法是用来描述语言的语法成分结构构造的形式规则, 我们通常用G表示。
语法成分由句子和构成句子的单词组成
语言由句子组成
我们首先来看一个文法:
- N→ ND|D
- D→ 0|1
上面的文法中有两条规则(1和2), 由这两条文法规则组成了文法。由文法可以推导出形如1011的二进制句子:
N → ND
→ NDD
→ NDDD
→ 1DDD
→ 10DD
→ 101D
→ 1011
同样, 上面的文法也可以推出句子101111, 10101等二进制数。上例中, N,D只要想推就能推出下一步, 因此我们把N,D叫做非终结符。而0,1不能推出任何东西,我们叫做终结符。推导的过程是从N开始的, N就是开始符号。推导的每一步可以得到一个产生式。从文法推导出句子的过程可以叫做推导,推导的逆过程叫做规约。
看完示例后我们给这些概念相关定义。
非终结符
规则的左部符号, 通常用VN 表示。
终结符
在规则的右部, 它是语言不可再分的单位,组成句子的基本单位, 常用VT 表示。
开始符号
为非终结符,又称为识别符号, 常用S表示。
产生式
定义符号串之间关系的一组规则, 形如A→ α,文法规则是产生式, 产生式不一定是文法规则。
推导
由文法开始符号开始推导, 用产生式的右部取代产生式的左部, 直到推到终结符号为止。
推导分为最左推导和最右推导, 最左推导每次替换式子的最左边, 最右替换每次推导式子的最右边。
规约
规约是句子通过文法规则将产生式的左部取代右部, 直到规约到非中介符为止。
规约也分为最左规约和最右规约。 最左规约和最右推导互为逆过程,同样,最右规约和最左推导互为逆过程。
句型,句子,语言
句型是从文法的开始符号S开始, 每步推导(包括0步推导)所得到的的字符串α ,记作
S⟶∗α,α∈(VN∪VT)
S
⟶
∗
α
,
α
∈
(
V
N
∪
V
T
)
。
句子是仅含有终结符的句型。
语言由S开始通过1步及以上推导所得句子的集合, 记作L(G),
L(G)={S⟶+α,α∈V∗T}
L
(
G
)
=
{
S
⟶
+
α
,
α
∈
V
T
∗
}
文法的递归定义
在文法规则中, 非终结符的定义包含了非终结符本身, 这样的定义称之为递归定义。
在前面所讲的例子中N→ ND|D 就是递归定义,因为在此规则中N还可以推导出N。
若文法中有递归定义, 则一定要有出口, 否则定义的规则就是无效的。加入不定义一个出口,那么就永远推导不完,也就推导不出句子。
还是上面的例子, 虽然N→ ND|D 是递归定义, 但是D→ 0|1 给出了出口, 那么此文法就是有效的。
文法和语言的形式定义(重点)
Chomsky将文法定义为四元组
G=(VN,VT,P,S)
G
=
(
V
N
,
V
T
,
P
,
S
)
, 其中
VN
V
N
表示非终结符的集合,
VT
V
T
表示终结符的集合, P表示产生式的有穷集合, S表示开始符号。
文法具体又可以分为0型文法, 1型文法, 2型文法,3型文法。下面的说明中
V=VN∪VT
V
=
V
N
∪
V
T
。
0型文法
:P中的产生式 α⟶β α ⟶ β , 其中 α∈V+ α ∈ V + 并至少含有一个非终结符, β∈V∗ β ∈ V ∗1型文法
:P中的产生式 α⟶β α ⟶ β , 除可能有 S⟶ε S ⟶ ε 外均有 |β|≥|α| | β | ≥ | α | 。 若有 S⟶ε S ⟶ ε ,规定S不得出现在产生式的右部。
1′ 1 ′ 型文法(等价于1型文法):P中的产生式 α⟶β α ⟶ β , 除可能有 S⟶ε S ⟶ ε 外有 αAβ⟶αRβ α A β ⟶ α R β ,其中 α,β∈V∗ α , β ∈ V ∗ 且 A∈VN,R∈V+ A ∈ V N , R ∈ V +2型文法
:P中的产生式具有形式 A⟶β A ⟶ β , 其中 A∈VN,β∈V∗ A ∈ V N , β ∈ V ∗3型文法
:P中的产生式具有形式 A⟶αβ,A⟶α A ⟶ α β , A ⟶ α 或者 A⟶Bα,A⟶α A ⟶ B α , A ⟶ α , 其中 A,B∈VN,α∈V∗T A , B ∈ V N , α ∈ V T ∗ 。
0型文法又叫做短语文法或无限制文法, 识别0型语言的自动机称为图灵机(TM)。
1型文法又称为上下文有关文法或者长度增加文法, 通过线性界限自动机(LBA)识别。
2型文法称为上下文无关文法,记作CFG(Context-Free Grammar), 通过下推自动机(PDA)识别。
3型文法称为正规文法,记作RG(Regular Grammar), 通过有限状态自动机识别。
我们通常研究上下文无关文法和正规文法, 因为程序设计语言的语法和词法规则主要与2型文法和3型文法有关。
语法树
语法树用来描述句子的结构, 这让我们在语法分析时更直观的感受文法. 语法树还可以用来判断文法二义性, 若一个句子具有二义性, 那么其语法树至少有两个.
假设某二型文法
S→aB,A→a,A→bAA,B→aBB
S
→
a
B
,
A
→
a
,
A
→
b
A
A
,
B
→
a
B
B
S→bA,A→aS,B→bS,B→b
S
→
b
A
,
A
→
a
S
,
B
→
b
S
,
B
→
b
可通过最左推导产生的句子为aabbab:
S→aB→aaBB→aabSB→aabbAB→aabbaB→aabbab
S
→
a
B
→
a
a
B
B
→
a
a
b
S
B
→
a
a
b
b
A
B
→
a
a
b
b
a
B
→
a
a
b
b
a
b
产生如下的语法树,:
由语法树我们引进五个术语:
- 子树:语法树中除了叶子结点以外的任意结点连同它所有的子孙结点构成的一课子树.
- 修剪子树: 剪去除子树根以外的其余部分, 该子树根称为一个新的叶子结点.
- 句型: 树的根节点所能推出的任意串都为句型
- 短语: 子树的叶子结点从左到右连成的串, (短语是相对句型而言的)
4.1 简单短语: 短语是某子树经过一步推导得来的, 称为该子树的简单短语, 也叫直接短语 - 句柄: 句型中的最左边简单短语
在上例中, aabbab的句型, 短语, 简单短语, 句柄分别为:
句型: aabbab (这是一个句子, 句子是特殊的短语, 具体请看上文)
短语: a, ba, bba, abbab, aabbab (共有5个)
简单短语: a, b
句柄: a