[编译原理读书笔记][第2章 一个简单的语法制导程序]
标签(空格分隔): 未分类
本章内容是对本书第3章至第六章中介绍的编译技术的综合介绍.
- 通过将一个语句转换为三地址代码的过程来讲解
- 重点是:词法分析,语法分析和中间代码生成.
- 第7章,第8章将讲述如何将三地址代码转换为机器指令
2.1 引言
2.2:给出一个广泛使用的表示方法来描述语法,叫做
上下文无关法
或者BNF(Backus-Naur范式)
.2.3:面向文法的编译技术:
语法指导翻译
2.4:语法分析
2.5:一个中缀转后缀的过程
2.6:词法分析
2.8:构造语法树
2.2 语法定义
介绍一种用于描述程序设计语言语法的表示方法—"上下文无关法"
或简称文法
.被用于组织编译器前端.
何为上下文无关文法?
- V 总可以被字符w 自由替换,而无需考虑字符V出现的上下文
Java的
if-else
文法
2.2.1 文法定义
一个上下文无关法(context-free grammar)由4个元素组成:
- 一个终结符号集合,有时也称做”词法单元”.
- 一个非终结符号集合,有时也称做”语法变量”
- 每个
非终结符号
表示一个终结符号串
的结合.(后面介绍)
- 每个
- 一个产生式集合:表示某个构造的某种书写形式.
- 产生式头或左部:
非终结符号
. - 一个箭头
- 产生式体或右部: 终结符号与非终结符号组成的序列
- 如果产生式头代表一个构造,那么产生式体代表该构造的一种书写形式.
- 产生式头或左部:
- 指定一个非终结符号为开始符号
2.2.2 推导
根据文法推倒符号串时.首先从开始符号出发,不断地将某个非终结符号替换为该非终结符号的某个产生式的体.直到全部为终结符号.
- 可以从开始符号推倒得到的所有终结符号串的集合称为该文法定义的语言.
语法分析的任务
parsing
的任务是: 接受一个终结符号串作为输入,找出从文法的开始符号推倒出该串的方法.如果不能推倒出,则报告语法错误.
主要语法分析方法,在第四章中介绍
2.2.3 语法分析树
语法分析树
用图形方法展现了从文法的开始符号推倒出对应语言中的符号串的过程.
parse tree
有以下性质
- 根节点的标号为文法的开始字符.
- 叶子节点为一个终结符号或
e
- 内部节点为一个非终结符号
- 如果
非终结符号A
它的子节点从左至右有X1,X2..XN
,那么必然有产生式A->X1X2X3..XN
.
例子
文法:
需要推倒的语句: 9 - 5 + 2
语法树:
一个文法的语言的另一个定义是任何能够由某颗语法分析树生成的符号串的集合.
为一个给点的终结符号串构建一颗语法分析树的过程称为对该符号穿进行语法分析
2.2.4 二义性
某些语法如果不严谨会产生二义性.比如将上述例子的语法改成
那么对之前的终结符号串的解释可以用两种语法树
前者的结果是6, 后者是2
显然有问题.所以一个好的文法不应该有二义性.
2.2.5 运算符结合性
- 左结合运算向左下端延伸
- 右结合运算向右下端延伸
等号的文法:
2.2.6 运算符的优先级
结合性规则只能作用于同一级别的运算
当具有+
,-
,*
,\
,(
,)
时的文法
factor
不可被分开.- 一个(不是因子)的
term
可能被高优先级的运算符*
和/
分开 - 一个
expr
可以被任意优先级分开 - 根据这种思想,我们可以用多个
非终结字符
来确定n个优先级的语法.