编译原理-程序设计语言及其文法【笔记】

(一) 字母表(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. img
  • B. img
  • C. img
  • D. img

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. img

  • B. img

  • C. img

  • D. img

16、文法G:S → xS | y 所识别的语言是( ) 正确答案(D)

  • A. img

  • B. img

  • C. img

  • D. img

(十) 结尾

如果文章中有什么不足,欢迎大家留言交流,感谢朋友们的支持!

如果能帮到你的话,那就来关注我吧!如果您更喜欢微信文章的阅读方式,可以关注我的公众号

在这里的我们素不相识,却都在为了自己的梦而努力 ❤

一个坚持推送原创开发技术文章的公众号:理想二旬不止

posted @ 2020-04-21 12:15  BWH_Steven  阅读(1535)  评论(0编辑  收藏  举报