zoukankan      html  css  js  c++  java
  • 编译原理-程序设计语言及其文法【笔记】

    (一) 字母表(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. {a^(2k)bc|k>0}

    • B. {a^(k)bc|k>0}

    • C . {a^(2k-1)bc|k>0}

    • 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

    (十) 结尾

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

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

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

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

  • 相关阅读:
    Ubuntu18.04+CUDA+CUDNN+Pytorch环境配置
    VIM入门必读(转)
    简述C和C++的学习历程(转)
    队列
    排序实现
    十进制转二进制
    北邮1467二叉树题引起的思考
    计算机是如何启动的?
    c语言字符串操作实现
    北邮机试——huffman权值问题
  • 原文地址:https://www.cnblogs.com/ideal-20/p/12743674.html
Copyright © 2011-2022 走看看