编译原理-程序设计语言及其文法【笔记】
(一) 字母表(Alphabet)
定义:字母表∑是一个有穷符号集合
符号:字 母、数符号:字 母、数、标点符号、 标点符号、 …
说明:为保证排版兼容问题,未使用 MD,HTML 等语法,本文中上标使用 ^ 下标使用 _ 例如:2^3 , X_n
(1) 字母表上的运算
下面的几种运算,可以先看例子,再回过头看上面的定义,就其实很简单了
A:字母表 ∑1 和 ∑2 的乘积 ( product)
∑1∑2={ ab | a∈ ∑1, b∈ ∑2}
例: { 0, 1} {a, b} = {0a, 0b, 1a, 1b}
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}
通过举例看到字母表(数字)的3次方,最后的结果,就是一些长度为3的数字串的集合
结论:字母表的n次幂:长度为n的符号串构成的集合
C:字母表 ∑ 的正闭包(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, …...}
结论:字母表的正闭包:长度正数的符号串构成的集合
D:字母表 ∑ 的克林闭包(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, …...}
注:∑0 ={ ε }
总结:字母表的克林闭包:任意符号串(长度可以为零)构成的集合
(2) 串
设∑是一个字母表,任意x∈∑*,x称为是 ∑上的一个串
- 串是字母表中符号的一个有穷序列
串s的长度,通常记作|s|,是指s中符号的个数
- 例:|aab| = 3
空串是长度为0的串,用 ε (spsilon) 表示
- |ε| = 0
A:串上的运算-连接
如果 x 和 y 是串,那么 x 和 y 的连接是把 y 附加到 x 后面形成的串,记作 xy
例: x = dog ,y = house ,xy = doghouse
空串是连接运算的单位元( identity),即,对于任何串 s 都有,εs = sε = s
设x,y,z,是三个字符串,如果x = yz,则称y是x的前缀,z是x的后缀
B:串上的运算-幂
s0= ε
sn = s^(n-1)s, n ≥1
s1 = s0 s = εs = s,s2 = ss,s3 = sss,…
例:如果 s =ba,那么s1= ba,s2=baba, s3=bababa,…
结论:串s的n次幂:将n个s连接起来
(二) 文法
(1) 文法的形式化定义
G = (V_T , V_N , P , S )
A:V_T:终结符集合
终结符(terminal symbol)是文法所定义的语言的基本符号,有时也称为token
例: V_T = { apple, boy, eat, little }
B:V_N:非终结符集合
非终结符(nonterminal) 是用来表示语法成分的符号,有时也称为“ 语法变量”
➢例:V_N = { <句子>, <名词短语>, <动词短语>, <名 词>, … }
C:P :产生式集合
产生式( production)描述了将终结符和非终结符组合成串的方法
产生式的一般形式:α→β 读作:α 定义为 β
α∈(V_T∪V_N)+:且α中至少包含V_N中的一个元素:称为产生式的头 (head )或左部(left side)
β∈(V_T∪V_N)* :称为产生式的体(body)或右部(right side)
D:S :开始符号
S∈VN
开始符号(start symbol)表示的是该文法中最大的语法成分
E:例子
例: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
F:产生式的简写
对一组有相同左部的α产生式
α→β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
(2) 符号约定
A:终结符
① 字母表中排在前面的小写字母,如a,b,c
② 运算符,如 +、*等
③ 标点符号,如括号,逗号等
④ 数字0,1、…、9
⑤ 粗体字符串,如id,if等
B:非终结符
① 字母表中排在前面的大写字母,如A、B、C
② 字母S,通常表示开始符号
③ 小写、斜体的名字、如expr、stmt等
④ 代表程序构造的大写字母。如E(表达式)、T(项)、F(因子)
C:文法符号
① 字母表中排在后面的大写字母(如X、Y、Z)
D:终结符号串
① 字母表中排在后面的小写字母(u、v、…、z) (包括空串)
E:文法符号串
小写希腊字母,如α、β、γ (包括空串)
第一个产生式的左部就是开始符号
(三) 语言
(1) 推导和规约
给定文法G=(VT , VN , P , S ),如果 α→β ∈ P,那么可以将符号串γαδ中的α替换为β,也就是说,将γαδ,重写(rewrite)为γβδ,记作 γαδ ==> γβδ
此时,称文法中的符号串 γαδ 直接推导(directly derive)出 γβδ
简而言之,就是用产生式的右部替换产生式的左部
(2) 句型和句子
一个开始符号 S 通过若干步,可以推导出 α,则称 α 是G的一个句型
- α 是一个文法符号串
如果 α 中的每一个 都是终结符,经过若干部可以推导出一个终结符号串 w,称 w 是 G 的一个句子
(3) 语言的形式化定义
例如下面的例子: D 可以是0或1或2... 说明其定义为数字,同理L为字母
而T的定义,可以是 L(字母)、D(数字)、TL、TD,通过右侧的推导(一直替代T)可得,最后的形式是一个字母数字串
而 S 可推出,是一个字母开头的字母数字串
(4) 文法的分类
A:0型文法
α --> β
- 无限制文法
- ∀ α --> β ∈ P,α中至少包含一个非终结符
- 0型语言
- 由0型文法G生成的语言L(G)
B:1型文法
上下文有关文法
- ∀ α --> β ∈ P,|α|≤|β|
- 产生式的一般形式:α1 A α2 --> α1 β α2
- 上下文有关语言
- 由上下文有关文法G构成的语言L(G)
- 不包含 ε-产生式
C:2型文法
上下文无关文法
-
∀α → β ∈P,α ∈ 非终结符
-
产生式的一般形式:A --> β
-
上下文无关语言
-
由上下文无关文法G构成的语言L
D:3型文法
正则文法
- 右线性文法:A --> wB 或 A --> w
- 左线性文法:A --> Bw 或 A --> w
(5) 四种文法的关系
(四) CFG 的分析树
- 根节点的标号为文法开始符号
- 内部节点表示对一个产生式 A–> β 的应用,该节点的标号是此产生式左部A。该节点的子节点的标号从左到右构成了产生式的右部 β
- 叶节点的标号既可以是非终结符,也可以是终结符。从左到右排列叶节点得到的符号串称为这棵树的产出或边缘
(1) 分析树是推导的图形化表示
(2) (句型的)短语
给定一个句型,其分析树中的每一棵子树的边缘称为该句型的一个短语
- 如果子树只有父子两代结点,那么这棵子树的边缘称为该句型的一个直接短语
举个例子:
(3) 二义性文法
如果一个文法可以为某个句子生成多棵分析树,则称这个文法是二义性的
(4) 二义性文法的判定
(五) 例题
1、文法G[S]:S→xSx|y所描述的语言是()(n≥0)正确答案(D)
- A.(xux)n
- B.xyxn
- C.xynx
- D.xnyxn
2、给定文法A→bA|ca,为该文法句子的是( ) 正确答案(C)
- A. bba
- B. cab
- C. bca
- D. cba
3、设有文法G[S]:S®S1|S0|Sa|Sc|a|b|c,下列符号串中是该文法的句子有( ) 正确答案(D)
- A. ab0
- B. a0b01
- C. a0b0a
- D. bc10
4、文法G产生的( )的全体是该文法描述的语言 正确答案(D)
- A. 句型
- B. 终结符集
- C. 非终结符集
- D. 句子
5、若文法G定义的语言是无限集,则文法必然是( ) 正确答案(A)
- A. 递归的
- B. 上下文无关的
- C. 二义性的
- D. 无二义性的
6、乔姆斯基(Chomsky)把文法分为四种类型,即0型、1型、2型、3型。其中3型文法是( ) 正确答案(B)
- A. 非限制文法
- B. 正则文法
- C. 上下文有关文法
- D. 上下文无关文法
7、一个上下文无关文法G包括四个组成部分,它们是一组非终结符号,一组终结符号,一个开始符号,以及一组( ) 正确答案(B)
- A. 句子
- B. 产生式
- C. 单词
- D. 句型
8、若一个文法是递归的,则它所产生的语言的句子( ) 正确答案(A)
- A. 是无穷多个
- B. 是有穷多个
- C. 是可枚举的
- D. 个数是常量
9、给定文法A→bA|cc,则符号串①cc ②bcbc ③bcbcc ④bccbcc ⑤bbbcc中,是该文法句子的是( ) 正确答案(D)
- A. ①
- B. ③④⑤
- C. ②④
- D. ①⑤
10、文法E→E+E|EE|i的句子ii+i*i有( )棵不同的语法树 正确答案(C)
- A. 1
- B. 3
- C. 5
- D. 7
11、文法 S→aaS|abc 定义的语言是( ) 正确答案(C)
-
A.
-
B.
-
C .
-
D . {a(k)a(k)bc|k>0}
12、文法G:S→xSx| xS|y所识别的语言是() 正确答案(A)
- A.
- B.
- C.
- D.
13、由文法的开始符号出发经过若干步(包括0步)推导产生的文法符号序列称为( ) 正确答案(B)
- A. 语言
- B. 句型
- C. 句子
- D. 句柄
14、下列符号串不可以由符号集S={a,b}上的正闭包运算产生的是( ) 正确答案(A)
- A. ε
- B. a
- C. aa
- D. ab
15、文法G:S → x xS | y 所识别的语言是( ) 正确答案(D)
-
A.
-
B.
-
C.
-
D.
16、文法G:S → xS | y 所识别的语言是( ) 正确答案(D)
-
A.
-
B.
-
C.
-
D.
(十) 结尾
如果文章中有什么不足,欢迎大家留言交流,感谢朋友们的支持!
如果能帮到你的话,那就来关注我吧!如果您更喜欢微信文章的阅读方式,可以关注我的公众号
在这里的我们素不相识,却都在为了自己的梦而努力 ❤
一个坚持推送原创开发技术文章的公众号:理想二旬不止