编译原理笔记 —— 程序设计语言及其文法
文章目录
程序设计语言及其文法
00. 字母表 (Alphabet
)与字母表的运算
- 字母表
∑
是一个有穷符号集合- 符号:字母、数字、标点符号、…
- 例:
- 二进制字母表:
{ 0,1 }
-
ASCII
字符集 -
Unicode
字符集
- 二进制字母表:
- 字母表
∑1
和∑2
的乘积product
∑1∑2 ={ab|a ∈ ∑1 , b ∈ ∑2 }
- 例:
{0, 1} {a, b} ={0a, 0b, 1a, 1b}
- 字母表
∑
的n
次幂power
{0, 1}^3 ={0, 1}*{0, 1}*{0, 1} ={000, 001, 010, 011, 100, 101, 110, 111}
字母表的
n
次幂:长度为n
的符号串构成的集合
-
字母表
∑
的正闭包positive closure
-
∑^+ = ∑ ∪ ∑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, …}
字母表的正闭包:长度正数的符号串构成的集合
- 字母表
∑
的克林闭包(Kleene closure)
∑* = ∑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, …}
字母表的克林闭包:任意符号串(长度可以为零)构成的集合
01. 串(String)
-
设
∑
是一个字母表,x∈∑* ,x称为是∑上的一个串- 串是字母表中符号的一个有穷序列
-
串s的长度,通常记作
|s|
,是指s
中符号的个数|aab|=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
的幂运算
s^0= ε,
s^n = s^n-1s, n ≥1
s^1 = s^0*s = εs = s,s^2 = ss,s^3 = sss,…
- 例如
例:如果 s =ba,那么s^1= ba,s^2=baba,
s^3=bababa
串
s
的n
次幂:将n
个s
连接起来
02. 自然语言的例子——句子的构成规则
<句子> -> <名词短语> <动词短语>
<名词短语> -> <形容词> <名词短语>
<名词短语> -> <名词>
<动词短语>-> <动词> <名词短语>
<形容词> -> <little>
<名词> -><boy>
名词 <apple>
动词 <eat>
- 未用尖括号括起来部分表示 语言的基本符号
- 尖括号括起来部分称为语法成分
03. 文法的形式化定义
G = (VT , VN , P , S )
-
VT
:终结符集合 - 终结符(
terminal symbol
)是文法所定义的语言的基本符号,有时也称为token
- 例:
VT = { apple, boy, eat, little }
-
VN:非终结符集合
- 非终结符
nonterminal
是用来表示语法成分的符号, 有时也称为语法变量
- 例:
VN = { <句子>, <名词短语>, <动词短语>, <名词>, … }
- 非终结符
- 产生式
production
描述了将终结符和非终结符组合成串的方法 产生式的一般形式:α→β
- 读作:
α
定义为β
-
α∈(VT∪VN ) +
,且α
中至少包含VN
中的一个元素:称为产生式的头(head )
或左部(left side)
-
-
β∈(VT∪VN ) *
:称为产生式的体body
或右部right side
-
G = (VT , VN , P , S )
-
P
:产生式集合 -
产生式
production
描述了将终结符和非终结符组合成串的方法产生式的一般形式:α→β
-
S
:开始符号
04. 产生式的简写
-
对一组有相同左部的
α
产生式α→β1 , α→β2 , … , α→βn
- 可以简记为:
α→β1 | β2 | … | βn
-
读作:
α
定义为β1
,或者β2
,…,或者βn
。 -
β1
,β2
,…,βn
称为α
的候选式Candidate
06. 符号约定
- 下述符号是终结符:
- 字母表中排在前面的小写字母,如
a、b、c
-
运算符,如
+
、*
等 - 标点符号,如括号、逗号等
-
数字
0、1、. . . 、9
- 粗体字符串,如id、if等
- 字母表中排在前面的小写字母,如
- 下述符号是非终结符
- 字母表中排在前面的大写字母,如
A、B、 C
- 字母
S
。通常表示开始符号 - 小写、斜体的名字,如 expr、stmt等
- 代表程序构造的大写字母。如E(表达式)、T(项) 和F(因子)
- 字母表中排在前面的大写字母,如
- 字母表中排在后面的大写字母(如
X
、Y
、Z
) 表示文法符号(即终结符或非终结符) - 字母表中排在后面的小写字母(主要是
u
、v
、. . . 、z
) 表示终结符号串(包括空串) - 小写希腊字母,如
α
、β
、γ
,表示文法符号串(包括空串) - 除非特别说明,第一个产生式的左部就是开始符号
07. 语言的定义
7.1 推导 (Derivations)和归约(Reductions)
- 给定文法
G=(VT , VN , P , S )
,如果α→β ∈ P
,那么 可以将符号串γαδ
中的α
替换为β
,也就是说,将γαδ
重写(rewrite
)为γβδ
,记作γαδ
->γβδ
。此时,称文法中的符号串γαδ
直接推导(directly derive
)出γβδ
- 简而言之,就是用产生式的右部替换产生式的左部
- 如果
α0 -> α1
,α1 -> α2
,α2->α3
,…,αn-1-> αn
,则可以记作α0->α1->α2->α3-> …-> αn-1->αn,称符号串α0
经过n
步推导出αn
,可简记为α0 ->n αn
7.2 句型和句子
7.3 语言的形式化定义
- 由文法
G
的开始符号S
推导出的所有句子构成的集合称为文法G
生成的语言,记为L(G )
。 即
- 例子:
S → L | LT
T → L | D | TL | TD
L → a | b | c | … | z
D → 0 | 1 | 2 | 3 |…| 9
该文法生成的语言是:标识符
7.4 语言上的运算
令L={A,B,…,Z,a,b,…,z},D={0,1, …,9}。则L(L∪D) *表示的语言是标识符
08. 文法的分类
-
0
型文法 (Type-0 Grammar) -
1
型文法 (Type-1 Grammar) -
2
型文法 (Type-2 Grammar) -
3
型文法 (Type-3 Grammar)
8.1 0型文法 (Type-0 Grammar)
-
α → β
-
无限制文法
Unrestricted Grammar
/ 短语结构文法Phrase Structure Grammar, PSG
-
∀α → β∈P
,α
中至少包含1
个非终结符
-
-
0型语言
- 由0型文法G生成的语言
L(G )
- 由0型文法G生成的语言
8.2 1型文法 (Type-1 Grammar)
α → β
- 上下文有关文法
(Context-Sensitive Grammar , CSG )
∀α → β∈P,|α|≤|β|
- 产生式的一般形式:
α1Aα2 → α1βα2 ( β≠ε )
- 上下文有关语言(
1
型语言) - 由上下文有关文法 (
1
型文法) G生成的语言L(G)
CSG
中不包含ε-产生式
8.3 2型文法 (Type-2 Grammar)
α → β
- 上下文无关文法 (
Context-Free Grammar, CFG
) ∀α → β∈P,α ∈ VN
- 产生式的一般形式:
A→β
例:
S → L | LT
T → L | D | TL | TD
L → a | b | c | d |…| z
D → 0 | 1 | 2 | 3 |…| 9
- 上下文无关语言(2型语言)
- 由上下文无关文法 (2型文法) G生成的语言L(G )
8.4 3型文法 (Type-3 Grammar)
-
α → β
-
正则文法 (Regular Grammar,
RG
)- 右线性(Right Linear)文法:
A→wB
或A→w
- 左线性(Left Linear) 文法:
A→Bw
或A→w
- 左线性文法和右线性文法都称为正则文法
- 右线性(Right Linear)文法:
-
正则语言(3型语言)
-
由正则文法 (3型文法) G生成的语言L(G )
正则文法能描述程序设计语言的多数单词
8.5 四种文法之间的关系
- 逐级限制
-
0
型文法:α
中至少包含1
个非终结符 -
1
型文法CSG
:|α|≤|β|
-
2
型文法CFG
:α ∈ VN
-
3
型文法(RG
):A→wB
或A→w
(A→Bw 或A→w)
-
- 逐级包含
09. CFG的分析树
9.1 CFG 的分析树
- 例子
G:
1. E → E + E
2. E → E * E
3. E → - E
4. E → ( E )
5. E → id
- 根节点的标号为文法开始符号
-
内部结点表示对一个产生式
A→β
的应用,该结点的标号是此产生式左部A 。该结点的子结点的标号从左到右构成了产生式的右部β -
叶结点的标号既可以是非终结符,也可以是终结符。从左到右排列叶节点得到的符号串称为是这棵树的产出(
yield
)或边缘(frontier
)
9.2 分析树是推导的图形化表示
-
给定一个推导 S -> α1-> α2 ->… -> αn ,对于推导过程中得到的每一个句型
αi
,都可以构造出一个边缘为αi
的分析树 -
推导过程:E ->
-E
->- ( E )
->- ( E+E )
->- ( id+E )
->- ( id+id )
9.3 (句型的)短语
-
给定一个句型,其分析树中的每一棵子树的边缘称为该句型的一个短语
phrase
-
如果子树只有父子两代结点,那么这棵子树的边缘称为该句型的一个直接短语
immediate phrase
9.4 二义性文法 (Ambiguous Grammar)
- 如果一个文法可以为某个句子生成多棵分析树, 则称这个文法是二义性的
9.5 二义性文法的判定
- 对于任意一个上下文无关文法,不存在一个算法, 判定它是无二义性的;但能给出一组充分条件, 满足这组充分条件的文法是无二义性的
- 满足,肯定无二义性
- 不满足,也未必就是有二义性的