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

文章目录

  • 程序设计语言及其文法
    • 00. 字母表 (`Alphabet`)与字母表的运算
    • 01. 串(String)
    • 02. 自然语言的例子——句子的构成规则
    • 03. 文法的形式化定义
    • 04. 产生式的简写
    • 06. 符号约定
    • 07. 语言的定义
      • 7.1 推导 (Derivations)和归约(Reductions)
      • 7.2 句型和句子
      • 7.3 语言的形式化定义
      • 7.4 语言上的运算
    • 08. 文法的分类
      • 8.1 0型文法 (Type-0 Grammar)
      • 8.2 1型文法 (Type-1 Grammar)
      • 8.3 2型文法 (Type-2 Grammar)
      • 8.4 3型文法 (Type-3 Grammar)
      • 8.5 四种文法之间的关系
    • 09. CFG的分析树
      • 9.1 CFG 的分析树
      • 9.2 分析树是推导的图形化表示
      • 9.3 (句型的)短语
      • 9.4 二义性文法 (Ambiguous Grammar)
      • 9.5 二义性文法的判定


程序设计语言及其文法

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

  • 如果 xy是串,那么xy的连接(concatenation) 是把y附加到x后面而形成的串,记作xy

    • 例如,如果 x=dogy=house,那么xy=doghouse
    • 空串是连接运算的单位元identity,即对于任何串s都有,εs = sε = s
  • x,y,z是三个字符串,如果x=yz, 则称yx的前缀,zx的后缀


  • 串上的运算——幂

  • 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

sn次幂:将ns连接起来


02. 自然语言的例子——句子的构成规则

  • <句子> -> <名词短语> <动词短语>
  • <名词短语> -> <形容词> <名词短语>
  • <名词短语> -> <名词>
  • <动词短语>-> <动词> <名词短语>
  • <形容词> ->
  • <名词> ->
  • 名词
  • 动词

  • 未用尖括号括起来部分表示 语言的基本符号
  • 尖括号括起来部分称为语法成分

03. 文法的形式化定义

  • G = (VT , VN , P , S )
  • VT:终结符集合
  • 终结符(terminal symbol)是文法所定义的语言的基本符号,有时也称为token
  • 例: VT = { apple, boy, eat, little }
  • VN:非终结符集合
    • 非终结符nonterminal 是用来表示语法成分的符号, 有时也称为语法变量
    • 例: VN = { <句子>, <名词短语>, <动词短语>, <名词>, … }

编译原理笔记 —— 程序设计语言及其文法_第1张图片

  • 产生式production描述了将终结符和非终结符组合成串的方法 产生式的一般形式:
    • α→β
  • 读作:α定义为β
    • α∈(VT∪VN ) + ,且α中至少包含VN中的一个元素:称为产生式的头 (head )或左部(left side)
  • β∈(VT∪VN ) * :称为产生式的体body或右部right side

  • G = (VT , VN , P , S )

  • P:产生式集合

  • 产生式production描述了将终结符和非终结符组合成串的方法产生式的一般形式:

    • α→β

编译原理笔记 —— 程序设计语言及其文法_第2张图片


  • S :开始符号

编译原理笔记 —— 程序设计语言及其文法_第3张图片

编译原理笔记 —— 程序设计语言及其文法_第4张图片


04. 产生式的简写

  • 对一组有相同左部的α产生式

    • α→β1 , α→β2 , … , α→βn
    • 可以简记为:
      • α→β1 | β2 | … | βn
  • 读作:α定义为β1,或者β2,…,或者βn

  • β1β2,…,βn称为α的候选式Candidate

编译原理笔记 —— 程序设计语言及其文法_第5张图片


06. 符号约定

  • 下述符号是终结符:
    • 字母表中排在前面的小写字母,如 a、b、c
    • 运算符,如 +*
    • 标点符号,如括号、逗号等
    • 数字 0、1、. . . 、9
    • 粗体字符串,如idif

  • 下述符号是非终结符
    • 字母表中排在前面的大写字母,如A、B、 C
    • 字母S。通常表示开始符号
    • 小写、斜体的名字,如 exprstmt
    • 代表程序构造的大写字母。如E(表达式)T(项)F(因子)

编译原理笔记 —— 程序设计语言及其文法_第6张图片


  • 字母表中排在后面的大写字母(如XYZ) 表示文法符号(即终结符或非终结符)
  • 字母表中排在后面的小写字母(主要是uv、. . . 、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张图片


编译原理笔记 —— 程序设计语言及其文法_第8张图片


7.2 句型和句子

编译原理笔记 —— 程序设计语言及其文法_第9张图片


7.3 语言的形式化定义

  • 由文法G的开始符号S推导出的所有句子构成的集合称为文法G生成的语言,记为L(G )。 即

在这里插入图片描述

  • 例子:
  1. S → L | LT
  2. T → L | D | TL | TD
  3. L → a | b | c | … | z
  4. D → 0 | 1 | 2 | 3 |…| 9

该文法生成的语言是:标识符


7.4 语言上的运算

编译原理笔记 —— 程序设计语言及其文法_第10张图片

令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 )

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→wBA→w
    • 左线性(Left Linear) 文法: A→BwA→w
    • 左线性文法和右线性文法都称为正则文法
  • 正则语言(3型语言)

  • 由正则文法 (3型文法) G生成的语言L(G )

正则文法能描述程序设计语言的多数单词


8.5 四种文法之间的关系

  • 逐级限制
    • 0型文法:α中至少包含1个非终结符
    • 1型文法CSG|α|≤|β|
    • 2型文法CFGα ∈ VN
    • 3型文法(RG):A→wBA→w(A→Bw 或A→w)

  • 逐级包含

编译原理笔记 —— 程序设计语言及其文法_第11张图片


09. CFG的分析树

9.1 CFG 的分析树

  • 例子
G:
1. E → E + E
2. E → E * E
3. E → - E
4. E → ( E )
5. E → id

编译原理笔记 —— 程序设计语言及其文法_第12张图片

  • 根节点的标号为文法开始符号
  • 内部结点表示对一个产生式A→β的应用,该结点的标号是此产生式左部A 。该结点的子结点的标号从左到右构成了产生式的右部β
  • 叶结点的标号既可以是非终结符,也可以是终结符。从左到右排列叶节点得到的符号串称为是这棵树的产出( yield )或边缘(frontier)

9.2 分析树是推导的图形化表示

  • 给定一个推导 S -> α1-> α2 ->… -> αn ,对于推导过程中得到的每一个句型αi,都可以构造出一个边缘为αi的分析树

  • 推导过程:E -> -E -> - ( E ) -> - ( E+E ) -> - ( id+E ) -> - ( id+id )

编译原理笔记 —— 程序设计语言及其文法_第13张图片


9.3 (句型的)短语

  • 给定一个句型,其分析树中的每一棵子树的边缘称为该句型的一个短语phrase

  • 如果子树只有父子两代结点,那么这棵子树的边缘称为该句型的一个直接短语immediate phrase

编译原理笔记 —— 程序设计语言及其文法_第14张图片


9.4 二义性文法 (Ambiguous Grammar)

  • 如果一个文法可以为某个句子生成多棵分析树, 则称这个文法是二义性

9.5 二义性文法的判定

  • 对于任意一个上下文无关文法,不存在一个算法, 判定它是无二义性的;但能给出一组充分条件, 满足这组充分条件的文法是无二义性的
    • 满足,肯定无二义性
    • 不满足,也未必就是有二义性的

你可能感兴趣的:(编译原理,编译原理)