- 4
- 0
- 约1.06万字
- 约 31页
- 2018-10-19 发布于山东
- 举报
第2章 词法分析
主要内容
扫描处理
正则表达式
有穷自动机
从正则表达式到DFA
TINY扫描程序的实现
利用Lex 自动生成扫描程序
• 编译器的扫描或词法分析(lexical
analysis )从源代码中读取字符并形成记号
(token )用于编译器的后续部分处理。记
号表示源程序中信息单元的字符序列。将
字符组合成记号与在英语句子中将字母构
成单词并确定含义很像,扫描任务类似拼
写。
• 扫描程序问题分为以下部分:
给出扫描程序操作概貌以及涉及的结构和概念
正则表达式(用于表示构成程序设计语言的词法
结构的串格式的标准表示法)
有穷状态机器或称有穷自动机(对由正则表达式
给出的串格式的识别算法)
用正则表达式构造有穷自动机
编写有穷自动机表示识别过程的程序
TINY语言扫描程序的完整实现过程
自动产生扫描器生成器的过程和方法(使用Lex
实现TINY的扫描程序,适用于Unix和其他系统的
标准扫描生成器)
主要内容
扫描处理
正则表达式
有穷自动机
从正则表达式到DFA
TINY扫描程序的实现
利用Lex 自动生成扫描程序
• 一、记号的数据结构:
• 第1类:保留字(reserved word )、关键字(key
word ),是字母的固定串,如IF和THEN,表示字符串
“ if”和“ then”;特点是某种具体语句的保留字是已知的且
一个单词就只有一个词义。因此可以采用一个单词一个
码。
• 第2类是特殊符号(special symbol ),如算术符号加
(PLUS )和减(MINUS ),它们表示字符“ +”和“-” 。
一些多字符符号,如 = 和 。这类记号的特点类似第
类。也可采用一个单词一个码。
• 第3类是表示多字符串的记号,如456和var1 、number,
它们分别表示数字和标识符(identifier )。这类记号的
点是未知的,只给出组成规则(例如标识符是由用户定义
的串,字母开头,后面可跟若干个字母或数字符号),一
个单词在不同的程序中其词义可以不同。只能采用统一编
码,即多个单词采用同一个编码。
• 记号的编码可定义为枚举类型的逻辑项。记号在C中可被定义为:
typedef enum
{ IF, THEN, ELSE,PLUS, MINUS, NUM, ID, ... }
TokenType ;
• 为了区分作为逻辑项的记号与对应的字符串,方便确定具体的单词值(即串
值属性),通常在C中定义这样的记号记录(token record )说明为:
typedef struct
{ TokenType tokenval;
char * stringval;
int numval;
} TokenRecord;
或可能作为一个联合
typedef struct
{ TokenType tokenval;
union
{ char * stringval;
int numval;
} attribute;
} TokenRecord; (以上假设只有标识符需要串值属性,只有数字需要数值属
性)。
• 二、扫描程序的主控函数
扫描程序任务将整个源程序转换为记号序列,很少一次性
地完成。实际是在分析程序的控制下操作的,通过函数从
输入中返回有关命令的下一个记号,该函数有与C说明相
似的说明:
TokenType getToken( void );
getToken函数在调用时从输入中返回下一个记号并计算诸
如记号串值这样的附加属性。输入字符串通常不给这个函
数提供参数,但参数却被保存在缓冲区中或由系统输入设
备提供。例如:分析代码:a [ index ] = 4 + 2
• 假定将这个代码行放在一个输入缓冲区中,它的下一个输
入字符由箭头指出,如下所示:
• 一个对getToken的调用现在需要跳过下面的4个空格,识
别由单个字符a 组成的串“
原创力文档

文档评论(0)