第三章-词法分析

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Char string
扫描器
Token string
分析器
Parse tree
❖ 作为独立的子程序
Get next token
start
Char Char string
扫描器
Token 语法分析器 Tree
符号表
3.2 词法分析器的设计……问题
❖ 语言对程序格式的要求
▪ 自由格式
大部分语言不规定某个单词必须出现在程序行中的什么位置
2020/6/17
1
Contents
1 词法分析器的手工构造
2
正规表达式
3
有限自动机
4 词法分析器的自动生成
2020/6/17
2
编译阶段……词法分析
2020/6/17
3
编译阶段……词法分析
❖ 将源程序分解为单词符号串
词法分析器
❖ 词法分析的任务
▪ 自左至右逐个字符地对源程序进行扫描,产生一个个 的单词符号,把作为字符串的源程序改造成为单词符 号串的中间程序。
▪ 二元式 (单词种别,单词符号的属性值)
单词种别:通常用整数编码表示,不能唯一确定单词时,需用
属性值:通常是指向符号表的指针(入口地址)
▪ 实现上,如何划分单词种别和编码纯属技术性考虑
2020/6/17
如关键字、运算符和界符通常作为一符一种处理
关键字、运算符和界符由语言定义,个数是固定的 种别的整数编码可唯一确定该单词,无须属性值
▪ 固定格式
如早期的FORTRAN语言规定输入行的前6个字符是标号,最 后的字符(72-80列)是注释,以C开头的是注释行,等等
▪ 空白(空格和tab)
大多数PL,空白是有意义的 FORTRAN和Algቤተ መጻሕፍቲ ባይዱl60,空白可以加在任何地方提高可读性
2020/6/17
12
词法分析器的设计……问题
❖ 缓冲区
2020/6/17
13
词法分析器的设计……错误处理
❖ 词法分析中遇到了错误怎么处理?
▪ 应急式(panic)-跳过字符,直到发现一个结构良好 的单词符号
▪ 替换-替换一个不正确的字符 ▪ 删除-删除一个不正确的字符 ▪ 插入-插入一个缺失的字符 ▪ 调换-调换两个字符的位置
2020/6/17
14
3.2.1 输入、预处理
2020/6/17
6
对词法分析器的要求……输出形式
❖ 单词符号的种类
▪ 关键字-由语言定义、具有固定含义的标识符
如,main, if, while, for 等 通常不作为程序员自定义的名字使用(保留字,基本字)
▪ 标识符-用于表示各种名字
如,变量名、数组名、类名,函数名和过程名等
▪ 常数-具有某种数据类型的不变量
▪ 有些PL将一个或相继多个空格用作单词之间的界符
此时应事先将相继多个空格合并为一个空格
▪ 预处理即在识别开始前,删去输入缓冲区中的无用字符
2020/6/17
15
输入、预处理……
❖ 预处理子程序
▪ 可设计一个由扫描器调用的子程序
当调用时,处理出长度为 N 的字符串,并装入扫描缓冲区 使识别工作可在此缓冲区上直接进行
标识符常作为一种来处理,常数则可按类型分种
需用属性值来区分不同单词的特征 这些特征信息存放于相关的符号表项或常数表项中单词种别:用
整数编码
8
词法分析器的输出示例
❖例,C++代码段:while (i >= j) i--; 将被转换

< while, > < (, >
Name Type
Scope … …
❖ 输入缓冲区
▪ 为了提高效率,扫描器并非直接逐个字符地读源文件
每次从源文件中读出一定长度的字符串 将输入的字符串放入一个输入缓冲区中
❖ 预处理
▪ 对多数PL,用于正文编辑的字符一般没有实际意义
如,空格、跳格、回车和换行符只是在文字常数中有意义 注解的出现对程序的功能也无任何意义 为了方便识别工作,编辑性字符和注解应事先删除
❖ 词法分析器的构造
▪ 手工构造 ▪ 自动生成
Lex:词法规则(正规式)—有限自动机
2020/6/17
5
3.1 对词法分析器的要求……功能
❖ 词法分析器的功能
▪ 功能
从数据输入到输出的一个变换过程或函数 说明该过程(或函数)需要做什么,而非如何做
▪ 扫描器的输入是代表源程序的字符串 ▪ 输出是单词符号(token)的内部中间表示 ▪ 过程是扫描输入的字符流,按词法规则识别出单词
概述
❖ 本章引入词法分析器(扫描器)的构造原理和实现技术 ❖ 扫描器的任务
源程序字符串
扫描并识别
单词符号串的中间表示
“main( ) È{…
字符流
单词流
… }”
扫描器
<main, -> <{, -> < }, ->
❖ 讨论扫描器的设计需求和实现机制 ❖ 介绍单词的内部表示,引入单词的描述工具—正规式 ❖ 描述识别单词的转换图和有限自动机的概念和应用 ❖ 先讨论扫描器的手工构造,然后引入自动构造原理
常见的类型有整型、实型、布尔型、文字型等 如,100、3.14159、TRUE 、 ‘example’
▪ 运算符,用于表示操作
如,+、-、*、/ 等
▪ 界符,用于区分各种不同的语法单位
如,“,”、“;”、“(”、“)”、“/*”、“*/” 等
2020/6/17
7
对词法分析器的要求……输出形式
❖ 单词符号的输出形式
结构简洁、清晰、条理化
❖ 是否将词法分析器作为独立的一遍?
▪ 没有必要,而且低效
❖ 与语法分析器通信的其他方式
▪ 最常用的:作为一个子程序,由语法分析器在需要单 词符号时调用
▪ 词法分析器和语法分析器作为两个并发的过程通过 pipe通信
2020/6/17
10
词法分析器的组织示例
❖ 作为独立阶段(一遍)
▪ 是编译器中唯一需要处理每个字符的阶段 ▪ 设计不合理会成为最费时和低效的阶段 ▪ 不能从输入文件中逐个字符读入,一次读入大块文本
放入一个缓冲区,由缓冲区给词法分析器提供字符 ▪ 词法分析器需要向前扫描时,缓冲区也有用处
❖ 关键字
▪ 保留字:用户不能使用关键字作为标识符 ▪ PL/l 的关键字不是保留字,词法分析器要区分
< id, 指向i的符号表项指针 > < >=, >
‘i’
int
< id, 指向j的符号表项指针 >
<), > < id, 指向i的符号表项指针 >
‘j’
int
< --, > <;, >
2020/6/17
9
词法分析器的组织
❖ 将词法分析器作为一个独立阶段
▪ 任务相对独立、简单,有高效的工具进行处理 ▪ 与编译过程的其它工作分开造就良设计的软件架构
相关文档
最新文档