编译原理_第3章_第1节_词法分析、DFA、NFA和其转换
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
起点指针:用来指示正在扫描的单词的起点; 搜索指针:用于向前搜索,寻找单词的结束; 缓冲区结构
假设标识符和常数的最大长度为256
缓冲区长度:512
标识符起 搜索指 点(500) 示器
3.1.2 词法分析器的结构
缓冲区的设计
:设置左右两个缓冲区,当左缓冲区读完后,新读入的字符存 入右缓冲区;反之,存放在左缓冲区;
例:while (i >=j) i--; 输出:
编号 类别
(3, “while”)
1
标识符
(5, “(“)
2
常数
(1, 指向i的符号表入口)
3
保留字
(4, “>=“)
4
算符
(1, 指向j的符号表入口)
5
界符
(5, “)”)
(1, 指向i的符号表入口)
(4, “--”)
(5, “;”)
数据类型 存储地址
❖ 编译程序要分析和翻译源程序,也先要区分一个一个的单词。
❖ 词法分析程序的任务是:从左到右逐个字符对源程序扫描,产生一 个单词序列,把作为字符串的源程序改造为单词符号串的中间程序。
❖ 词法分析程序又称词法分析器或扫描器。
除了识别单词的基本任务外,词法分析还可以完成以下任务: (1)组织源程序的输入 (2)删除注释、空格及无用符号(如回车等) (3)行、列计数 (4)列表打印源程序 (5)发现并定位词法错误 (6)建立、查填符号表
预处理后: int max(int x,int y) {int z; z=(x>y ? x : y); return z;}
3.1.2 词法分析器的结构
缓冲区的设计
扫描缓冲区:从输入缓冲区输入固定长度的字符串到另一个缓冲区(扫 描缓冲区),词法分析可以直接在此缓冲区中进行符号识别。扫描缓冲 区的结构:
3.1.1 单词符号的表示
单词的分类
单词的分类,如:while (i < 10) i++;
❖ 基本字:也称关键字,如C语言中的int, void, if, while等; ❖ 标识符:用来表示各种名字,如变量名、常量名、函数名等; ❖ 常数:如25, 3.1415926, ‘a’, “hello”, TRUE等; ❖ 算符:如+, =, ~等; ❖ 界符:如逗号,分号,括号等。 ❖ 基本字、运算符和界符一般确定; ❖ 标识符和常数的数量一般不加限制。 注: (1)程序设计语言单词的分类纯属技术性问题,可以有不同的方法
单词的表示
单词经常表示为二元组:(单词类别,单词值) 对某些单词来说,不仅需要它们的值,还需要一些其它信息,
这些都记录在符号表中,所以相应表示为:(标识符,指向该标 识符所在符号表中位置的指针)
(单词类别,单词的属性)
区分单词所属的类 (整数编码)
单词的值
3.1.1 单词符号的表示
单词的表示:举例
(1)剔除无用的空白符、跳格符、回车符、换行符。 ‘ ‘, ‘\t’, ‘\r’, ‘\n’
(2)剔除注释:/*…………*/, //
(3)合并空白符。
3.1.2 词法分析器的结构
预处理程序
例:
int max(int x, int y) // 求x,y的最大值 {
int z; z = (x > y ? x : y); return z; }
int
3056
int
3060
3.1.2 词法分析器的结构
词法分析器与语法分析器的联系
(1)词法分析作为单独的一遍
字符
字符串形式的源程序
词法分析器
单词串形式的源程序
3.1.2 词法分析器的结构
词法分析器与语法分析器的联系
(2)词法分析作为子程序
输入串
词法分析器
返
取
回
下
下
一
一
单
单
词
词
将词法分析器分离的考虑
仅由有限次使用上述三步骤得到的表达式才是正规式,仅由这些正规式 所表示的字集才是∑上的正规集。
例3.1 令∑={a,b}
ba*
∑上所有以b为首,后跟任意多个a的字符串;
a(a|b)* ∑上所有以a为首的字符串;
(a|b)*(aa|bb)(a|b)* ∑上含两个连续a或两个连续b的字符串。
3.2.1 正规式与正规集
一个正规式对应一个正规集
3.2.1 正规式与正规集
正规式和正规表达式
对字母表∑:
(1) ε和Φ都是∑上的正规式,它们所表示的正规集分别为{ε}和Φ;
(2) a∈∑,a是∑上的一个正规式,它所表示的正规集为{a};
(3) 假定U和V都是∑上的正规式,它们所表示的正规集分别记为L(U)和L(V), 那么(U|V)、(UV)和(U)*也是正规式,它们所对应的正规集分别为 L(U)∪L(V)、L(U)L(V)和(L(U))*。
例3.1 令∑={a,b}
正规式 a a|b ab (a|b)(a|b) a* (a|b) * (a|b) *(aa|bb) (a|b) *
分类; (2)除上述一般分类方法外,还有一字一类或一符一类等方法
3.1.1 单词符号的表示
单词的分类
单词分类的原则
❖ 保留字(关键字):可以看作一类,也可以一字一类; ❖ 算符和界符:可以一符一类,算符还可以把有一定共性算
符分为一类; ❖ 常数:可以按照数据类型分类; ❖ 标识符:统一归为一类。
3.1.1 单词符号的表示
语法分析器
ຫໍສະໝຸດ Baidu
使整个编译程序的结构更简洁、清晰和条理化; 编译程序效率更高; 增强编译程序的可移植性。
符号表
3.1.2 词法分析器的结构
扫描缓冲区
1.预处理程序:取消注解,剔除无用的空白、 跳格、回车、换行等 2.输入缓冲区:源程序输入缓冲区
3.1.2 词法分析器的结构
预处理程序
❖主要是为方便单词的识别工作:
第三章 词法分析
源程序
词法分析
语法分析
表
格
语义分析
管
理
中间代码生成
错 误 检 测
代码优化
目标代码生成 目标程序
第三章 词法分析
主要内容
1.介绍词法分析的过程 2.讨论词法分析器的设计与实现 3.介绍实现词法分析器的主要工具:状态转换图
3.1 词法分析器的任务
❖ 人们理解一篇文章(或程序)起码是先在单词级别上思考。
缓冲区长度:256
缓冲区长度:256
标识符起 搜索指 点(252) 示器
小结
❖词法分析器的任务; ❖单词符号的分类; ❖单词符号的表示; ❖词法分析预处理; ❖词法分析器的工作方式; ❖扫描缓冲区的双缓冲策略。
3.2.1 正规式与正规集
正规式和正规表达式
正规式(正规表达式):用以描述单词符号的工 具,是说明单词的模式的一种重要的表示法, 是定 义正规集的工具。
假设标识符和常数的最大长度为256
缓冲区长度:512
标识符起 搜索指 点(500) 示器
3.1.2 词法分析器的结构
缓冲区的设计
:设置左右两个缓冲区,当左缓冲区读完后,新读入的字符存 入右缓冲区;反之,存放在左缓冲区;
例:while (i >=j) i--; 输出:
编号 类别
(3, “while”)
1
标识符
(5, “(“)
2
常数
(1, 指向i的符号表入口)
3
保留字
(4, “>=“)
4
算符
(1, 指向j的符号表入口)
5
界符
(5, “)”)
(1, 指向i的符号表入口)
(4, “--”)
(5, “;”)
数据类型 存储地址
❖ 编译程序要分析和翻译源程序,也先要区分一个一个的单词。
❖ 词法分析程序的任务是:从左到右逐个字符对源程序扫描,产生一 个单词序列,把作为字符串的源程序改造为单词符号串的中间程序。
❖ 词法分析程序又称词法分析器或扫描器。
除了识别单词的基本任务外,词法分析还可以完成以下任务: (1)组织源程序的输入 (2)删除注释、空格及无用符号(如回车等) (3)行、列计数 (4)列表打印源程序 (5)发现并定位词法错误 (6)建立、查填符号表
预处理后: int max(int x,int y) {int z; z=(x>y ? x : y); return z;}
3.1.2 词法分析器的结构
缓冲区的设计
扫描缓冲区:从输入缓冲区输入固定长度的字符串到另一个缓冲区(扫 描缓冲区),词法分析可以直接在此缓冲区中进行符号识别。扫描缓冲 区的结构:
3.1.1 单词符号的表示
单词的分类
单词的分类,如:while (i < 10) i++;
❖ 基本字:也称关键字,如C语言中的int, void, if, while等; ❖ 标识符:用来表示各种名字,如变量名、常量名、函数名等; ❖ 常数:如25, 3.1415926, ‘a’, “hello”, TRUE等; ❖ 算符:如+, =, ~等; ❖ 界符:如逗号,分号,括号等。 ❖ 基本字、运算符和界符一般确定; ❖ 标识符和常数的数量一般不加限制。 注: (1)程序设计语言单词的分类纯属技术性问题,可以有不同的方法
单词的表示
单词经常表示为二元组:(单词类别,单词值) 对某些单词来说,不仅需要它们的值,还需要一些其它信息,
这些都记录在符号表中,所以相应表示为:(标识符,指向该标 识符所在符号表中位置的指针)
(单词类别,单词的属性)
区分单词所属的类 (整数编码)
单词的值
3.1.1 单词符号的表示
单词的表示:举例
(1)剔除无用的空白符、跳格符、回车符、换行符。 ‘ ‘, ‘\t’, ‘\r’, ‘\n’
(2)剔除注释:/*…………*/, //
(3)合并空白符。
3.1.2 词法分析器的结构
预处理程序
例:
int max(int x, int y) // 求x,y的最大值 {
int z; z = (x > y ? x : y); return z; }
int
3056
int
3060
3.1.2 词法分析器的结构
词法分析器与语法分析器的联系
(1)词法分析作为单独的一遍
字符
字符串形式的源程序
词法分析器
单词串形式的源程序
3.1.2 词法分析器的结构
词法分析器与语法分析器的联系
(2)词法分析作为子程序
输入串
词法分析器
返
取
回
下
下
一
一
单
单
词
词
将词法分析器分离的考虑
仅由有限次使用上述三步骤得到的表达式才是正规式,仅由这些正规式 所表示的字集才是∑上的正规集。
例3.1 令∑={a,b}
ba*
∑上所有以b为首,后跟任意多个a的字符串;
a(a|b)* ∑上所有以a为首的字符串;
(a|b)*(aa|bb)(a|b)* ∑上含两个连续a或两个连续b的字符串。
3.2.1 正规式与正规集
一个正规式对应一个正规集
3.2.1 正规式与正规集
正规式和正规表达式
对字母表∑:
(1) ε和Φ都是∑上的正规式,它们所表示的正规集分别为{ε}和Φ;
(2) a∈∑,a是∑上的一个正规式,它所表示的正规集为{a};
(3) 假定U和V都是∑上的正规式,它们所表示的正规集分别记为L(U)和L(V), 那么(U|V)、(UV)和(U)*也是正规式,它们所对应的正规集分别为 L(U)∪L(V)、L(U)L(V)和(L(U))*。
例3.1 令∑={a,b}
正规式 a a|b ab (a|b)(a|b) a* (a|b) * (a|b) *(aa|bb) (a|b) *
分类; (2)除上述一般分类方法外,还有一字一类或一符一类等方法
3.1.1 单词符号的表示
单词的分类
单词分类的原则
❖ 保留字(关键字):可以看作一类,也可以一字一类; ❖ 算符和界符:可以一符一类,算符还可以把有一定共性算
符分为一类; ❖ 常数:可以按照数据类型分类; ❖ 标识符:统一归为一类。
3.1.1 单词符号的表示
语法分析器
ຫໍສະໝຸດ Baidu
使整个编译程序的结构更简洁、清晰和条理化; 编译程序效率更高; 增强编译程序的可移植性。
符号表
3.1.2 词法分析器的结构
扫描缓冲区
1.预处理程序:取消注解,剔除无用的空白、 跳格、回车、换行等 2.输入缓冲区:源程序输入缓冲区
3.1.2 词法分析器的结构
预处理程序
❖主要是为方便单词的识别工作:
第三章 词法分析
源程序
词法分析
语法分析
表
格
语义分析
管
理
中间代码生成
错 误 检 测
代码优化
目标代码生成 目标程序
第三章 词法分析
主要内容
1.介绍词法分析的过程 2.讨论词法分析器的设计与实现 3.介绍实现词法分析器的主要工具:状态转换图
3.1 词法分析器的任务
❖ 人们理解一篇文章(或程序)起码是先在单词级别上思考。
缓冲区长度:256
缓冲区长度:256
标识符起 搜索指 点(252) 示器
小结
❖词法分析器的任务; ❖单词符号的分类; ❖单词符号的表示; ❖词法分析预处理; ❖词法分析器的工作方式; ❖扫描缓冲区的双缓冲策略。
3.2.1 正规式与正规集
正规式和正规表达式
正规式(正规表达式):用以描述单词符号的工 具,是说明单词的模式的一种重要的表示法, 是定 义正规集的工具。