第二章:程序设计语言及其文法
2.1 词法语法分析基本概念
2.1.1 字母表
定义 字母表(Alphabet)是一个有穷符号集合,表示为 。符号可以是:字母、数字、标点……
例如,二进制字母表 、ASCII 字符集、Unicode 字符集。
2.1.2 字母表上的运算
定义 字母表的 乘积(Product)定义为:
例如:
定义 字母表的 次幂(Power)定义为:
其中 为空串。
例如:
即字母表的 次幂是长度为 的符号串构成的集合。
定义 字母表的 正闭包(Positive Closure)定义为:
定义 字母表的 克林闭包(Kleene Closure)定义为:
定义 设 是一个字母表,, 称为 上的一个 串(String)。
串是字母表中符号的一个有穷序列。串 的长度,通常记作 ,指 中符号的个数。
例如:
空串用 (Epsilon)表示,
2.1.3 串上的运算
定义 与 的 连接(Concatenation),记作 ,例如:
任意字符串 ,有
若 是三个字符串,且 ,则 为 的前缀, 为 的后缀。
定义 串的 次幂(Power)定义为:
克林闭包的幂等性
克林闭包定义:
幂等性:
下面给出证明:
要证明幂等性,需要证明等价的两个结论:
对于式 (1),由定义显然成立。下面证明式 (2):
设 ,这意味着 是 中符号的有限串。
由于 ,我们可以将 表示为: ,其中每个
对于每个 ,由于它属于 ,我们可以将其表示为: ,其中每个 或
因此,我们可以将 重写为:
这个表达式实际上是 中符号的有限串(可能包含空串)。根据 的定义,这正是 中的元素,即 ,证毕。
2.2 文法定义
2.2.1 文法的定义
简化的英文文法举例:
文法的定义:
定义 :终结符(Terminal Symbol)是语言的基本符号,也被称为 token,例如:
定义 :非终结符(Nonterminal)是语法成分,也被称为“语法变量”,例如:
定义 注意 , 是 文法符号集。
定义 :产生式(Production)描述 与 产生串的方式,一般形式:
读作: 定义为 。
定义 至少包含 中的一个元素,称为产生式的 头(Head)或 左部(Left Side)。
产生式的 体(Body)或 右部(Right Side)。
例如:
定义 :开始符号(Start Symbol)是该文法中最大的语法成分
例如:
2.2.2 简化后的算数表达式的文法
约定:不引起歧义的前提下,可以只写产生式。
2.2.3 产生式的简写
对于一组有 相同左部 的 产生式
可以简记为
读作: 定义为 ,或者 ,……,或者 。
定义 称为 的 侯选式(Candidate)。
例如,上面的产生式可以写为
2.2.4 符号约定
下述符号是终结符:
- 字母表排在前面的小写字母,如
- 运算符,如 等
- 标点符号,如
- 数字
- 粗体字符串,如 等
下述符号是非终结符
- 字母表排在前面的大写字母,如
- 字母 ,通常表示开始符号
- 小写,斜体名字,如 等
- 代表程序构造的大写字母,如 (表达式)、(项)、(因子)
定义 字母表中排在后面的大写字母,如 表示 文法符号,既可以表示终结符也可以表示非终结符。
定义 字母表中排在后面的小写字母,如 表示 终结符号串(可能是空串)。
定义 小写希腊字母,如 表示 文法符号串(也包括空串)。
除非特别说明,第一个产生式的左部就是开始符号。
2.3 语言的定义
2.3.1 推导和归约
定义 给定文法 ,如果 ,那么可以将符号串 中的 替换为 ,也就是说,将 重写(Rewrite)为 ,记作 。
定义 此时文法中的符号串 直接推导(Directly Derive)出 。
简而言之,推导就是利用尝试的右部替换产生式的左部。
定义 如果 则可以记作 ,称符号串 经过 部 推导(Derivations)出 ,可简记为
- 没有推导
- 表示经过正数步骤的推导
- 表示经过若干步骤推导
例如,一个英文句子的文法:
定义 自顶向下的过程是推导,自底向上的过程是 归约(Reductions)。
有了文法,如何判定某一个词串是否是该语言的句子。
- 句子的推导,从生成语言的角度
- 句子的归约,从识别语言的角度
2.3.2 句型和句子
定义 如果 ,则称 是 的一个 句型(Sentential Form)。
一个句型既可以包含终结符,也可以包含非终结符,也可以是空串。
定义 如果 ,则称 是 的一个 句子(Sentential)。
句子是不包含非终结符的句型。
定义 由文法 的开始符号 推导出的所有句子构成的集合称为 生成的语言,记为 ,即
例如:
定义 这个文法生成的语言是 标识符,即字母开头的字母数字串。
2.3.3 练习:写出无符号整数和浮点数的文法
使用 正则表达式 表示如下(后续将讨论正则表达式)
- 无符号整数:
[1-9][0-9]*|0
- 浮点数文法:
[1-9][0-9]*|0\.[0-9]*((E|e)(+|-)?[1-9][0-9]*)?
这里只写出无符号整数的文法
2.3.4 语言上的运算
例如,令 ,则 表示的语言是 标识符。
2.4 文法的分类
2.4.1 Chomsky 文法分类体系
Chomsky 文法分类体系的语言分类如下:
- 0 型文法(Type-0 Grammar)
- 1 型文法(Type-1 Grammar)
- 2 型文法(Type-2 Grammar)
- 3 型文法(Type-3 Grammar)
定义 0 型文法(Type-0 Grammar)又称为 无限制文法(Unrestricted Grammar)或 短语结构文法(Phrase Structure Grammar, PSG)。
要求 , 至少包含一个非终结符。
由 0 型文法 生成的语言被称为 0 型语言 。
定义 1 型文法(Type-1 Grammar)是 上下文有关文法(Context-Sensitive Grammar, CSG)。
是在 0 型文法的基础上要求
产生式的一部形式为
CSG 中不包含 产生式。
由上下文有关文法产生的语言叫做 上下文有关语言(1 型语言)。
定义 2 型文法(Type-2 Grammar)又叫做 上下文无关文法(Context-Free Grammar, CFG)。
要求
产生式的一般形式为
定义 3 型文法(Type-3 Grammar)又叫做 正则文法(Regular Grammar, RG)
3 型文法分为两种:
- 定义 右线性(Right Linear)文法: 或者
- 定义 左线性(Left Linear)文法: 或者
左线性文法和右线性文法都称为正则文法。
右线性文法例子
此文法与
等价(这是一个上下文无关文法),另外还存在与此文法等价的左线性文法。
定义 由正则文法 生成的语言称为 正则语言 。
正则文法能描述程序设计语言的多数单词。
2.4.2 四种文法的关系
逐级限制的关系:
- 0 型文法: 至少包含一个非终结符
- 1 型文法(CSG):
- 2 型文法(CFG):
- 3 型文法(RG): 或 或反过来
2.5 CFG 的分析树
2.5.1 举例分析
CFG 的分析树:
- 根节点的标号为文法的开始符号
- 内部节点表示对一个产生式 的应用,该节点的标号是此产生式左部 ,该节点的子节点的标号从左到右构成了产生式的右部
- 定义 叶节点的标号既可以是非终结符,也可以是终结符从左到右排列叶节点得到的符号串称为是这棵树的 产出(Yield)或者 边缘(Frontier)
2.5.2 分析树推导的图形化表示
给定一个推导 ,对于推导过程中得到的每一个句型 ,都可以构造出一个边缘为 的分析树。
例如:
分析树:
推导过程
2.5.3 句型的短语
定义 给定一个句型,其分析树中的每一个子树的边缘称为该句型的一个 短语(Phrase)。
定义 如果子树只有父子两代节点,那么这棵子树的边缘称为该句型的一个 直接短语(Immediate Phrase)。
上述例子的短语为 等,直接短语是 ,直接短语一定是某个产生式的右部,但产生式的右部不一定是给定句型的直接短语。
例如:
句子 "提高人民生活水平"
中,"提高"
、"人民"
是直接短语,"高人"
、"活水"
是产生式的右部,但不是这个句子的直接短语。
2.5.4 二义性文法
定义 如果一个文法可以为某个句子生成多颗分析树,则称这个文法是二义性的。此文法被称为 二义性文法(Ambiguous Grammar)。
例如条件语句:
句型:
可以构造两个分析树:
else
匹配第一个if
else
匹配第二个if
加入消歧规则:每个 else
和最近的尚未匹配的 if
匹配。那么此时选择第二种分析树。
2.5.5 二义性文法的判定
对于任意一个上下文无关文法,不存在一个算法判定它是无二义性的;但是能够给出一组充分条件,满足这组条件的文法是无二义性的。