欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-11 11:57:40
...



程序设计语言及其文法

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. 自然语言的例子——句子的构成规则

  • <句子> -> <名词短语> <动词短语>
  • <名词短语> -> <形容词> <名词短语>
  • <名词短语> -> <名词>
  • <动词短语>-> <动词> <名词短语>
  • <形容词> -> <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
    • 粗体字符串,如idif

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

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


  • 字母表中排在后面的大写字母(如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.2 句型和句子

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


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 语言上的运算

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

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

  • 逐级包含

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


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 二义性文法的判定

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