编译原理 第二章(程序设计语言及其文法)

文章目录

  • 字母表(Alphabet)
    • 字母表上的运算
      • 字母表 ∑1和∑2的乘积 ( product)
      • 字母表 ∑的n次幂 ( power)
      • 字母表∑的正闭包(positive closure)
      • 字母表 ∑的克林闭包(Kleene closure)
      • 串上的运算-连接
      • 串上的运算-幂
  • 文法
    • 文法的形式化定义
      • 产生式的简写
      • 符号约定
        • 终结符
        • 非终结符
        • 文法符号
        • 终结符号串
        • 文法符号串
  • 语言
    • 推导和归约
    • 句型和句子
    • 语言的形式化定义
    • 语言的运算
    • 文法的分类
      • 四种文法的关系
  • 上下文无关文法分析树
    • 分析树是推导的图形化表示
    • (句型的)短语
    • 二义性文法

字母表(Alphabet)

字母表∑是一个有穷符号集合

符号: 字 母、数符号:字 母、数、标点符号、 标点符号、 …
编译原理 第二章(程序设计语言及其文法)_第1张图片

字母表上的运算

字母表 ∑1和∑2的乘积 ( product)

∑1∑2={ ab | a∈ ∑1, b∈ ∑2}
例: { 0, 1} {a, b} ={0a, 0b, 1a, 1b}

字母表 ∑的n次幂 ( power)

编译原理 第二章(程序设计语言及其文法)_第2张图片
例:

{0,1}^3 = {0,1}{0,1}{0,1} = 
{000,001,010,011,100,101,110,111}

字母表的n次幂:长度为n的符号串构成的集合

字母表∑的正闭包(positive closure)

长度为正数的符号串构成的集合:
在这里插入图片描述
编译原理 第二章(程序设计语言及其文法)_第3张图片

字母表 ∑的克林闭包(Kleene closure)

在这里插入图片描述
编译原理 第二章(程序设计语言及其文法)_第4张图片

设∑是一个字母表,任意x∈∑,x称为是 ∑上的一个串*

串是字母表中符号的一个有穷序列

串s的长度,通常记作**|s|**,是指s中符号的个数

例:|aab| = 3

空串是长度为0的串,用 ε (spsilon) 表示

|ε| = 0

串上的运算-连接

如果x和y是串,那么x和y的连接把y附加到x后面形成的串,记作xy

例: x = dog, y = house =>> xy = doghouse

空串是连接运算分单位元

对于任意串s都有,εs = sε = s

设x,y,z,是三个字符串,如果x = yz,则称y是x的前缀,z是x的后缀

串上的运算-幂

串s的n次幂:将n个s连接起来
在这里插入图片描述
在这里插入图片描述

例:s = ba,则s1 = ba,s2 = baba,s3 = bababa,

文法

文法的形式化定义

G = (VT, VN, P, S)
编译原理 第二章(程序设计语言及其文法)_第5张图片

在这里插入图片描述

编译原理 第二章(程序设计语言及其文法)_第6张图片

在这里插入图片描述

编译原理 第二章(程序设计语言及其文法)_第7张图片

编译原理 第二章(程序设计语言及其文法)_第8张图片
编译原理 第二章(程序设计语言及其文法)_第9张图片

编译原理 第二章(程序设计语言及其文法)_第10张图片

这里是引用

编译原理 第二章(程序设计语言及其文法)_第11张图片

产生式的简写

编译原理 第二章(程序设计语言及其文法)_第12张图片
编译原理 第二章(程序设计语言及其文法)_第13张图片

符号约定

终结符

  • 字母表中排在前面的小写字母,如a,b,c
  • 运算符,如 +、*等
  • 标点符号,如括号,逗号等
  • 数字0,1、…、9
  • 粗体字符串,如id,if等

非终结符

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

文法符号

字母表中排在后面的大写字母(如X、Y、Z)

终结符号串

字母表中排在后面的小写字母(u、v、…、z)

包括空串

文法符号串

小写希腊字母,如α、β、γ

包括空串

第一个产生式的左部就是开始符号

语言

推导和归约

编译原理 第二章(程序设计语言及其文法)_第14张图片

用产生式的右部替换产生式的左部

编译原理 第二章(程序设计语言及其文法)_第15张图片

编译原理 第二章(程序设计语言及其文法)_第16张图片

推导和归约例子:
编译原理 第二章(程序设计语言及其文法)_第17张图片

如何判断某一词串是否是某文法的句子???

句子的推导(派生) - 从生成语言的角度
句子的归约 - 从识别语言的角度

句型和句子

在这里插入图片描述

一个句型中既可以包含终结符,又可以包含非终结符,也可能是空串。

在这里插入图片描述

句子是不包含非终结符的句型

例子:
编译原理 第二章(程序设计语言及其文法)_第18张图片

语言的形式化定义

编译原理 第二章(程序设计语言及其文法)_第19张图片
例子:
编译原理 第二章(程序设计语言及其文法)_第20张图片

语言的运算

编译原理 第二章(程序设计语言及其文法)_第21张图片

例:令 L={ A,B,…,Z,a,b,…,z},D={0 ,1, …,9} 。则 L(L∪D)*表示的语言是标识符

文法的分类

α --> β

  • 0型文法

  • 无限制文法

    • ∀ α --> β ∈ P,α中至少包含一个非终结符
  • 0型语言
    由0型文法G生成的语言L(G)

  • 1型文法

  • 上下文有关文法

    • ∀ α --> β ∈ P,|α|≤|β|
    • 产生式的一般形式:
      α1 A α2 --> α1 β α2
    • 上下文有关语言
      由上下文有关文法G构成的语言L(G)

不包含 ε-产生式

  • 2型文法
  • 上下文无关文法
    • ∀α → β ∈P,α ∈ 非终结符
    • 产生式的一般形式:A --> β
  • 上下文无关语言
    • 由上下文无关文法G构成的语言L
  • 3型文法
  • 正则文法
    • 右线性文法:A --> wB 或 A --> w
    • 左线性文法:A --> Bw 或 A --> w
      编译原理 第二章(程序设计语言及其文法)_第22张图片

四种文法的关系

编译原理 第二章(程序设计语言及其文法)_第23张图片
编译原理 第二章(程序设计语言及其文法)_第24张图片

上下文无关文法分析树

编译原理 第二章(程序设计语言及其文法)_第25张图片

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

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

编译原理 第二章(程序设计语言及其文法)_第26张图片

编译原理 第二章(程序设计语言及其文法)_第27张图片

(句型的)短语

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

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

编译原理 第二章(程序设计语言及其文法)_第28张图片
编译原理 第二章(程序设计语言及其文法)_第29张图片

直接短语一定是某产生式的右部
产生式的右部不一定是句型的直接短语

例子:
编译原理 第二章(程序设计语言及其文法)_第30张图片

二义性文法

如果一个文法可以为某个句子生成多棵分析树,则称这个文法是二义性的
例子:
编译原理 第二章(程序设计语言及其文法)_第31张图片
编译原理 第二章(程序设计语言及其文法)_第32张图片

消歧规则:每个 else 和最近的未匹配的if 匹配
编译原理 第二章(程序设计语言及其文法)_第33张图片

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