2. 语言及其文法(一个简单的语法制导翻译器)
2.1 引言
龙书上的知识点
(1) 编译器在分析阶段把一个源程序划分成各个组成部分,并生成源程序的内部表示形式(中间代码)。而后,在合成阶段将这个中间代码翻译成目标程序。
(2) 分析阶段是围绕编译语言的“语法”展开的。
(3) 一个程序设计语言的 语法 描述了该语言的程序的正确形式,而该语言的语义则定义了程序的含义。即程序在运行时该做什么事情。
字母表
字母表的定义
- 字母表是一个有穷符号集合
- 符号:字母, 数字,标点符号等
- 例如:二进制字母表{0,1},ASCII
字母表的运算
- 字母表和的乘积
- 字母表的n次幂:长度为n的符号的符号串会构成的集合。
- 字母表的正闭包:长度为正数的符号串构成的集合。
- 字母表的柯林闭包:任意长度(可以为零)的符号串构成的集合。
串
串的基本定义
- 串是字母表中符号的一个有穷序列。
- 串s的长度,通常记作|s|,是指s中符号的个数。
- 空串是长度为0的串,用表示
串上的运算
-
串的连接 : 如果x和y是串,那么x和y的 连接 是把y附加到x后面而形成的串,记作xy.
- 空串是连接运算的 单位元,即,对于任何串s都有,s = s = s .
- 假设x,y,z是三个字符串,如果x = yz,则称y是x的前缀,z是x的后缀。
-
串s的幂运算
- 串s的n次幂:将n个s连接起来.
2.2 语法,文法的定义
2.2.1 文法定义
-
文法用于组织编译器的前端,它自然地描述了大多数程序设计语言的层次化语法结构。
-
一个上下文无关文法的由四个元素构成:
(1)一个终结符号集合,有时也称为“词法单元”。终结符号式该文法所定义的语言的基本符号的集合。
(2)一个非终结符号集合,有时也称为“语法变量”。每个非终结符号串的集合。
(3)一个产生式集合P,其中每个产生式包括一个称为 产生式头部或左部 的非终结符号,一个箭头,和一个称为 产生式体或右部 的终结符号以及非终结符号组成的序列。产生式主要用来表示某个构造的某种书写形式。
(4)指定一个 非终结符号 作为 开始符号S。它表示的是该文法中最大的语法成分。
2.2.2 语言的定义
推导
根据文法推导符号串时,首先从开始符号出发,不断将某个非终结符号替换为该非终结符号的某个产生式的体。可以从开始符号推导得到的所有终结符号串的集合称为该文法定义的语言。
归约为推导的逆过程。
文法分类体系
文法类型
- 0型文法
- 又称无限制文法/短语结构文法
- 要求产生式的左部至少包含一个非终结符
- 1型文法
- 又称上下文有关文法(CSG)
- 要求产生式左部长度小于等于右部的长度
- 不包含空产生式
- 由上下文有关文法G生成的语言称为上下文有关语言L(G)
- 2型文法
- 又称上下文无关文文法(CFG)
- 由上下文无关文法生成的语言G称为上下文无关语言L(G)
- 3型文法
- 正则文法
- 右线性文法:
- 左线性文法:
- 产生式右部至多只有一个终结符号,并且在同一侧 * 正则文法能描述程序设语言的多数单词
- 正则文法
四种文法的关系
- 逐级限制
- 逐级包含
CFG的分析树
定义:
- 根节点 的标号为 文法开始符号
- 内部节点 表示一个产生式A->beita的应用,该节点的标号此产生式左部A。该节点的 子节点的标号 从左到右构成了产生式的右部
- 叶节点 的标号既可以是 非终结符,也可以是 终结符。从左到右排列叶节点得到的符号串称为是这棵树的 产出或边缘
短语
- 给定一个句型,其分析树中的每一棵子树的边缘称为该句型的一个短语。
- 如果子树只有父子两代节点,那么这棵子树的边缘称为该句型的一个 直接短语。
- 直接短语一定是产生式的右部,但是产生式的右部不一定是给定句型的直接短语。
- 如果子树只有父子两代节点,那么这棵子树的边缘称为该句型的一个 直接短语。
二义性文法
- 如果一个文法可以为某个句子生成多颗分析树,则称这个文法是二义性的
- 判定:对于任意一个上下文无关文法吗,不存在一个算法判定它是无二义性的;但是能给出一组充分条件,满足这组充分条件 的文法是无二义性的。
- 满足,肯定无二义性
- 不满足,也未必就是有二义性的
- 存在一些消歧规则:如else与最相近的未匹配的if为一对