目录
语言及其文法
基本概念
字母表
字母表 ∑是一个有穷符号集合
符号:字母,数字,标点符号
例:
二进制字母表: 二进制字母表: 二进制字母表: 二进制字母表: { 0,1 }
ASCII字符集
Unicode字符集
字母表上的运算
字母表 ∑1和∑2的乘积 (product)
∑1∑2={ ab |a∈ ∑1, b∈ ∑2}
例: { 0, 1} { 0, 1} a, b} ={0 a, 0 b, 1 a, 1 b}
字母表 ∑的n次幂 ( power)
∑0 ={ ={ ε }
∑n=∑n-1 ∑
n ≥ 1
例子:
{0, 1}3={0, 1} ,{0, 1} ,{0, 1}
={000,001,010,011,100,101,110,111}
字母表的 n次幂:长度为 n的符号串构成的集合
字母表 ∑的正闭包
∑+ = ∑ ∪ ∑2 ∪ ∑3 ∪ …
例: {a, b, c, d }+== {a, b, c, d,
aa , ab , ac, ad, ba , bb, bc , bd …, , …
,
aaa , aab , aac , aad , aba , abb , abc , …}
字母表的正闭包:长度正数的符号串构成的集合
字母表 ∑的克林闭包
∑*= ∑0 ∪ ∑+ = ∑0 ∪ ∑ ∪ ∑2 ∪ ∑3 ∪ …
例: {a, b, c, d }+== { ε,a, b, c, d,
aa , ab , ac, ad, ba , bb, bc , bd …, , …
,
aaa , aab , aac , aad , aba , abb , abc , …}
字母表的克林闭包:任意符号串(长度可以为零)构成的集合
串
设∑是一个字母表,对于任意一个 x∈∑*,x称为是 ∑上的一个 上的一个 串
串是 字母表中 符号的 一个 有穷 序列
串s的长度 ,通常记作 ,通常记作 |s|,是指 s中符号的个数
例: |aab |=3 |=3
空串 是长度为 0的串 用 ε(epsilon )表示
|ε|= 0
串上的运算--连接
如果 x和y是串,那么 x和y的连接 (concatenation )
是把 y附加到 x后面而形成的串,记作 xy
例如,如果 x=dog 且 y=house ,那么 xy =doghouse
空串 是连接运算的 单位元 ( identity ),即对于任
何串 s都有, εs = sε =s
设x,y,z 是三个字符串,如果 x= yz , 则称 y是x的前缀 ,z是x的后缀
串上的运算-幂
串s的幂运算
s0= ε = ε ,
sn= s n-1s, n ≥ 1
s1= s0s=εs = s s = ,s2(s的平方)= ss ,s3(s的三次方)= sss ,…
例:如果 s =ba ,那么 s1= ba ,s2=baba , s3=bababa ,
串s的n次幂:将 n个s连接起来
文法的定义
自然语言的例子--句子的构成规则
<句子> ----> <名词短语> <动词短语>动词短语> 名词短语> 句子>
<名词短语> ----> <形容词> <名词短语>名词短语> 形容词> 名词短语>
<名词短语> -----> <名词>名词> 名词短语>
<动词短语> ----> <动词> <名词短语>名词短语> 动词> 动词短语>
<形容词> ----> little 形容词>
<名词> ---> boy 名词>
<名词> ----> apple 名词>
<动词> ----> eat 动词>
未用尖括号起来部分表示语言的基本符号
尖括号起来部分称为语法成分
文法的形式会定义
G=(VT,VN,P,S)
VT:终结符集合
终结符 (terminal symbol)是文法所定义的 语言基本 符号
有时也称为 有时也称为 有时也称为 token
例:VT={apple, boy, eat, little}
VN:非终结符集合
非终结符 (nontermina )是用来表示语法成分的符号, 有时也称为“ 语法变量”
例: VN= { = { <句子> , <名词短语> , <动词短语> <名 词> , … , … } 名> 动词短语> 名词短语> 句子>
P:产生式集合
产生式 (production )描述了将终结符和非组合成串的方法
产生式的一般形: 产生式的一般形: 产生式的一般形式:
α→β
读作: α定义为 定义为 β
α∈(VT∪VN)+,且α中至少包含 中至少包含 VN中的 一个元素:称为产生式头 (hea d)或左部 (left side)
β∈(VT∪VN)*:称为产生式的 :称为产生式的 :称为产生式的 体(body )或右部 (right side)
例: P= <句子> ----> <名词短语> <动词短>动词短> 名词短语> 句子>
<名词短语>
---->
<形容词>
<名词短语>
,
… … … … …
名词短语>
形容词>
名词短语>
S:开始符号
S∈VN。开始符号 (start symbo l)表示的 是该文法中最大语法成分
例: S= <句子>句子>
例: G=( {id, +, **, (, )}, {E}, P,E)*
P={E→ E+E,
E→ E*E,
E→ (E),
E→ id }
G:E→ E+E
E→ E*E
E→ (E)
E→ id
约定:
不引起歧义的 前提下,可以 只写产生式 只写产生式
产生式的简写
对一组有 相同左部 相同左部 的产生式
α→β1, α→β2, … , , … α→βn
可以简记为:
α→β1| β2| … | | … | … | … βn
读作: α定义为 β1,或者 β2,…,或者 βn
β1,β2,…,βn称为 α的候选式 (Candidate )
例子
E→ E+E
E→ E*E
E→ (E)
E→ id
转化为
E → E+ E| E * E |( E) | id ) | id)
符号约定
下述符号是 终结符
(a) 字母表中 排在前面的小写字母 排在前面的小写字母 排在前面的小写字母 排在前面的小写字母 ,如 a、b、c
(b) 运算符 ,如 +、*等
(c) 标点符号 ,如 括号、逗号等
(d) 数字 0、1、. . . . . 、9
(e) 粗体字符串 ,如 id 、if 等
下述符号是非终结符
(a) 字母表中 排在前面的大写字母 排在前面的大写字母 排在前面的大写字母 排在前面的大写字母 ,如 A、B、C
(b) 字母 S。通常表示开始符号 。通常表示开始符号 。通常表示开始符号 。通常表示开始符号 。通常表示开始符号
(c) 小写、斜体的名字 小写、斜体的名字 小写、斜体的名字 小写、斜体的名字 小写、斜体的名字 小写、斜体的名字 小写、斜体的名字 ,如 expr 、stmt 等
(d) 代表程序构造的大写字母 代表程序构造的大写字母 代表程序构造的大写字母 代表程序构造的大写字母 代表程序构造的大写字母 代表程序构造的大写字母 。如 E(表达式 表达式 )、T(项)和F(因子 )
字母表中 排在后面的大写字母 (如 X、Y、Z) 表示 文法符号 (即终结符或非终结符)
字母表中 排在后面的小写字母 (主要是 (主要是 u、v、. . . 、z) 表示 终结符号串 (包括 (包括 空串 )
小写希腊字母 ,如 α、β、γ,表示 文法符号串 (包括 (包括 空串 )
除非特别说明 第一个产生式的左部 就是 开始符号 开始符号
语言的定义
自然语言的例子
<句子> ----> <名词短语> <动词短语>动词短语> 名词短语> 句子>
<名词短语> ----> <形容词> <名词短语>名词短语> 形容词> 名词短语>
<名词短语> -----> <名词>名词> 名词短语>
<动词短语> ----> <动词> <名词短语>名词短语> 动词> 动词短语>
<形容词> ----> little 形容词>
<名词> ---> boy 名词>
<名词> ----> apple 名词>
<动词> ----> eat 动词>
单词串:little boy eats apple
推导 和归约
给定文法 G= (VT , V N , P S , P S , P S , P S ),如果 α→β ∈ P,那么 可以将符号串 γαδ中的 α替换 为β,也就是说,将 ,也就是说将 γαδ 重写 (rewrite rewrite )为γβδ,记作 γαδ --> γβδ。此时,称文法 中的符号串 γαδ 直接推导 (directly derive directly derive directly derive directly derivedirectly derive )出 γβδ
简而言之,就是产生式的右部替换产生式的左部
如果 α0-->α1,α1-->α2,α2-->α3,…,αn-1-->αn,则 可以记作 α0-->α1--->α2-->α3-- …---> αn-1--->αn,称符 号串 α0经过 n步推导 出αn,可简记为 ,可简记为 α0-->n αn(n倍的an)
α -->0α
-->+表示“经过正数步推导” 表示“经过正数步推导” 表示“经过正数步推导” 表示“经过正数步推导” 表示“经过正数步推导”
-->*表示“经过若干(可以是 表示“经过若干(可以是 表示“经过若干(可以是 表示“经过若干(可以是 表示“经过若干(可以是 表示“经过若干(可以是 表示“经过若干(可以是 0)步推导” )
句型和句子
如果 S--->* α,α∈(VT∪VN)*,则称 α是G的一个 句型
一个句型中既可以包含 终结符,又可以包含 非终 结符 ,也可能是 空串
如果 S-->* w,w ∈VT*,则称 w是G的一个 句子 (sentence)
句子是不包含非终结符 的句型
语言的形式化定义
由文法 G的开始符号 S推导出的所有句子构成 的集合称为 的集合称为 的集合称为 的集合称为 文法 G生成的语言 ,记为 L(G )。 即
L(G )={w | S -->* w, w∈ VT* }
语言上的运算
文法的分类
Chomsky文法分类体系
0型文法 (TypeType -0 Grammar Grammar )
1型文法 (TypeType -1Grammar Grammar )
2型文法 (TypeType -2Grammar )
3型文法 (TypeType -3Grammar Grammar )
0型文法
α → β
无限制文法 /短语结构文法
∀α → β∈P, α中至少包含1个非终结符
0型语言
由0型文法 G生成的语言 生成的语言 生成的语言 L(G )
1型文法
α → β
上下文有关文法(Context-Sensitive Grammar , CSG )
∀α → β∈P,|α|≤|β |
产生式的一般形式: α1Aα2 → α1βα2 ( β≠ε )
上下文有关语言(1型语言)
由上下文有关文法 (1型文法) G生成的语言L(G )
CSG 中不包含 ε-产
2型文法
α → β
上下文无关文法 (Context-Free Grammar, CFG )
∀α → β∈P,α ∈ VN
产生式的一般形式:A→β
上下文无关语言( 2型语言)
由上下文无关法 (2型文法 ) G生成的语言 L(G )
3型文法
α → β
正则文法(Regular Grammar, RG )
➢ 右线性(Right Linear)文法: A→wB 或 A→w
➢ 左线性(Left Linear) 文法: A→Bw 或 A→w
➢左线性文法和右线性文法都称为正则文法
正则语言(3型语言)
➢由正则文法 (3型文法) G生成的语言L(G )
正则文法能描述程序设计语言的多数单词
四种文法之间的关系
逐级限制
➢ 0型文法:α中至少包含1个非终结符
➢ 1型文法(CSG) :|α|≤|β|
➢ 2型文法(CFG) :α ∈ VN
➢ 3型文法(RG):A→wB 或 A→w (A→Bw 或A→w)
逐级包含
CFG的分析树
CFG的分析树
➢ 根节点的标号为文法开始符号
➢ 内部结点表示对一个产生式A→β的应用,该结点的标号是此产生式左部A 。该结点的子结点的标号从左到右构成了产生式的右部β
➢ 叶结点的标号既可以是非终结符,也可以是终结符。从左到右排列叶
节点得到的符号串称为是这棵树的产出( yield )或边缘(f rontier)
分析树是推导的图形化表示
给定一个推导 S --> α1--> α2--->…--> αn ,对于推导过程中得到的每一个句型αi,都可以构造出一个边缘为αi的分析树
推导过程:E
---> -E ---> - ( E ) ---> - ( E+E ) ---> - ( id+E )---->( id+id )
(句型的)短语
给定一个句型,其分析树中的每一棵子树的边缘称为该句型的一个短语(phrase)
➢ 如果子树只有父子两代结点,那么这棵子树的边缘称为该句型的一个直接短语(immediate phrase)
二义性文法
如果一个文法可以为某句子生成 多棵分析树 , 则称这个文法是 则称这个文法是 则称这个文法是 则称这个文法是 二义性 的
二义性文法的判定
对于任意一个上下文无关文法,不存在一个算法,
判定它是无二义性的;但能给出一组充分条件,
满足这组充分条件的文法是无二义性的
满足,肯定无二义性
不满足,也未必就是有二义性的