国防科技大学 编译原理 第3讲 高级程序设计语言的语法描述
课程主页:
https://www.icourse163.org/course/NUDT-1003101005?tid=1460976445
这次回顾第3讲:高级程序设计语言的语法描述。
第3讲 高级程序设计语言的语法描述
文法
文法:描述语言的语法结构的形式规则
假设我们有如下文法:
```
<句子> -> <主语><谓语><间接宾语><直接宾语>
<主语> -> <代词>
<谓语> -> <动词>
<间接宾语> -> <代词>
<直接宾语> -> <冠词> <名词>
<代词> -> He
<代词> -> me
<名词> -> book
<冠词> -> a
<动词> -> gaveCode- 考虑句子:He gave me a book. - ``` <句子> =><主语><谓语><间接宾语><直接宾语> =><代词><谓语><间接宾语><直接宾语> =>He <谓语><间接宾语><直接宾语> =>He <动词> <间接宾语><直接宾语> =>He gave <间接宾语><直接宾语> =>He gave <代词> <直接宾语> =>He gave me <直接宾语> =>He gave me <冠词><名词> =>He gave me a <名词> =>He gave me a book
语法描述的几个基本概念
字母表:一个有穷字符集,记为
字母表中每个元素称为字符
上的字(也叫字符串) 是指由 中的字符所构成的一个有穷序列不包含任何字符的序列称为空字,记为
用
表示 上的所有字的全体,包含空字- 例如: 设
,则
- 例如: 设
的子集 和 的连接(积)定义为示例:
自身的 次积记为 是 的闭包: 是 的正规闭包:例子:
那么:
上下文无关文法
上下文无关文法
是一个四元组其中
:终结符(Terminal)集合(非空) :非终结符(Noterminal)集合(非空),且 :文法的开始符号, :产生式集合(有限),每个产生式形式为- 开始符
至少必须在某个产生式的左部出现一次
上下文无关文法还有一种描述形式,称为巴科斯范式(BNF)
- “ →”用“::=”表示
例子
定义只含
其中,
一些约定
约定
其中,“
”读成“或”,称 为 的一个候选式- 表示一个文法时,通常只给出开始符号和产生式
之前的文法可以简写为
文法生成语言
推导
定义:称
直接推出 ,即仅当
是一个产生式,且 。如果
,则我们称这个序列是从 到 的一个推导。若存在一个从 到 的推导,则称 可以推导出 。对文法
:从 出发,经过 步或若干步推出 :从 出发,经过 步或若干步推出 :即 或- <句子>
He gave me a book - <句子>
He gave me a book - He gave <间接宾语><直接宾语>
He gave me <冠词> <名词>
- <句子>
之前例子的推导过程:
句型、句子和语言
假定
是一个文法, 是它的开始符号。如果
,则称 是一个句型。仅含终结符号的句型是一个句子。
文法
所产生的句子的全体是一个语言,记为 :
例子
证明
的一个句子。
证明:
所以
从文法到语言
例1
- 设文法
产生的语言是什么?以
开头,后继若干个
例2
设文法
产生的语言是什么?
例3
请给出产生语言为
例4
请给出产生语言为
推导与语法树
最左推导和最右推导
从一个句型到另一个句型的推导往往不唯一
最左推导:任何一步
都是对 中的最左非终结符进行替换最右推导:任何一步
都是对 中的最右非终结符进行替换
语法树
- 用一张图表示一个句型的推导,称为语法树
- 一棵语法树是不同推导过程的共性抽象
语法树与二义性(ambiguity)
具体定义:
文法的二义性:如果一个文法存在某个句子对应两棵不同的语法树,则说这个文法是二义的
语言的二义性:一个语言是二义的,如果对它不存在无二义的文法
- 对于语言
,可能存在 和 ,使得 ,有可能其中一个文法为二义的, 另一个为无二义的 - 例如John saw Mary in a boat.是二义的,因为in a boat可以修饰Mary或者John。
- 对于语言
二义性问题是不可判定问题,即不存在一个算法,它能在有限步骤内,确切地判定一个文法是否是二义的
但可以找到一组无二义文法的充分条件
形式语言鸟瞰
乔姆斯基(Chomsky)是美国当代有重大影响的语言学家
乔姆斯基于1956年建立形式语言体系,他把文法分成四种类型:
型与上下文无关文法一样,它们都由四部分组成,但对产生式的限制有所不同
:终结符(Terminal)集合(非空) :非终结符(Noterminal)集合(非空),且 :文法的开始符号, :产生式集合(有限)
四种文法分别如下:
- 0型(短语文法,图灵机)
- 产生式形如:
- 其中:
且至少含有一个非终结符;
- 产生式形如:
- 1型(上下文有关文法,线性界限自动机)
- 产生式形如:
- 其中:
,仅 例外
- 产生式形如:
- 2型(上下文无关文法,非确定下推自动机)
- 产生式形如:
- 其中:
- 产生式形如:
- 3型(正规文法,有限自动机)
- 产生式形如:
或- 其中:
(右线性文法)
- 其中:
- 产生式形如:
或- 其中:
(左线性文法)
- 其中:
- 产生式形如:
四种类型文法描述能力比较
上下文无关文法与上下文有关文法
例1
例2
推导例子:
小结
- 程序设计语言不是上下文无关语言,甚至不是上下文有关语言
不能由上下文无关文法产生,甚至连上下文有关文法也不能产生,只能由 型文法产生 对应了- 标识符引用
- 过程调用过程中,“形-实参数的对应性”(如个数,顺序和类型一致性)
- 对于现今程序设计语言,在编译程序中,仍然采用上下文无关文法来描述其语言结构
- 这是一种权衡
v1.5.2