国防科大编译原理

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

词法分析程序的输出形式-----单词的内部形式
通常用整数编码, 编码原则:利于处理
单词类别 单词值
单词符号的特征 或特性
几种常用的单词内部形式: 1、按单词种类分类 2、关键字、运算符和界符采用一符一类 3、标识符和常数的单词值又为指示字(指针值)
例1:按单词种类分类,关键字和分界符分别 用公用一个类别编码
单词名称
类别编码
标识符
1
无符号常数(整) 2
无符号浮点数
3
布尔常数
4
字符串常数
5
关键字
6
分界符
7
单词值
内部字符串 整数值 数值 0 或1 内部字符串 关键字字串或内部编码 分界符或内部编码
例2:关键字、运算符和分界符采用一符一类
单词名称
类别编码
单词值
标识符 无符号常数(整) 无符号浮点数 布尔常数 字符串常数
2.词法分析程序作为单独的子程序
S.P.(字符串)
词法分 析程序
取单词 单词
语法分 析程序
3.2 词法分析器的设计
3.2.1 输入、预处理
1、输入源程序文本放入输入缓冲区。 2、预处理----预处理子程序:删除注释和其他一些非程序必要 成分(空白符、跳格符、回车符、换行符)。
将预处理结果放入扫描缓冲区 3、扫描缓冲区的安排:分成两个半区,互补使用 单词定界:起点指示器——开始位置
搜索指示器——终点位置
3.2.2 扫描识别单词
扫描器的实现技术是词法分析器实现的核心技术,后面详细介绍, 本小节只简单介绍其中的一项小技术:超前搜索技术
超前搜索技术在单词识别中的应用: (在某些语言中,单词间可以没有空格或其他分隔符分隔,关键字 也可作为变量名) • 关键字的识别:例IF(5.EQ.M)(对比IF(5)=9) • 标识符的识别:例DO99K=1.10(对比DO99K=1,10) • 常数的识别:例123.34 • 算符和界符的识别:例i++;
3.1 对词法分析器的要求
词法分析器又名扫描器(scanner)。
词法分析的任务是:从左到右逐个字符地对源程序进行扫描, 产生一个个单词符号,把源程序改造成单词符号串表示的中间 程序。
3.1.1 词法分析器的功能和输出形式
词法分析:输入源程序,根据词法规则识别及组合单词。 删去空格字符和注解。
单词符号的类别: 1.关键字(保留字):begin、end、for、do … 2. 标识符:变量名、过程名、数组名等 3. 常数:无符号数、布尔常数、字符串常数等 4.运算符:+、-、*、/等 5.界符: 逗号、分号、括号、/* */、等等
–例如,图3-4(a)的状态i所对应的switch语句如下:
s=getchar ( ); switch (s) { case 'a'- 'z':
… ; /*实现状态j功能的语句*/ case '0'-'9': … ; /*实现状态k功能的语句*/ }
例 如 , 图 2-4(b) 的 状 态 i 所 对 应 的 while语句如下:
实现状态转换表,程序在当前状态和当前输入驱动下进行状态 转化工作
第一种:以输入处理为核心
状态对应一段处理程序,终态一般对应的程序段有一个return 语句,返回识别出来的单词。
不含回路的分支状态子图,对应一个switch( )语句结构或一组 if-else语句结构。
含回路的状态子图,对应一个while语句结构。 例如,图2-4(a)的状态i所对应的switch语句如下:
BEGIN END FOR DO ……… : + * , (
1 2 3 4 5 6 7 8 9 ……. 20 21 22 23 …….
内部字符串 整数值 数值 0或1 内部字符串
….. --
例:词法分析 while (i >= j) i--;
转换为单词序列: <while,-> <(,-> <id,指向i的符号表项的指针> < >=,-> < id,指向j的符号表项的指针> <),-> <id,指向i的符号表项的指针> <--,-> <;,->
标识符 无符号整数
字母、数字
S 字母百度文库标
非字母数字
数字
S 数字 数
非数字
*
出口
*
出口
单字符分界符
S
+*, ()
出口
读字符
字母、数字
S 字母 标
非字母数字
数字
数字 数
非数字
+*, ()
出口
运算符、分界符
查保留字表
*标识符
出口
出口 *无符号整数
其他 出错
返回S
状态转换图的实现:
两种思路:
根据状态转换图的子图结构设计相应的程序结构,不同输入转 入不同(状态)处理过程
S
1
U
0
1
0
0
V
Z
1
例:输入字符串x=01101 和1001
•识别算法(自然语言描述)
利用状态图可按如下步骤分析和识别字符串x:
1、置初始状态为当前状态,从x的最左字符开始, 重复步骤2,直到x右端为止。
2、扫描x的下一个字符,在当前状态所射出的弧中 找出标记有该字符的弧,并沿此弧过渡到下一个状 态;如果找不到标有该字符的弧,那么x不是句子, 过程到此结束;如果扫描的是x的最右端字符,并 从当前状态出发沿着标有该字符的弧过渡到下一个 状态为终止状态Z,则x是句子。
getchar ( );
while (letter( )||digit( ))
getchar (); …; /*实现状态j功能的语句*/
第二种:以状态转换为核心 用变量s表示当前状态,token表示当前识别的单词。 用一个大的分支语句实现状态转换表功能,整个程序 在表驱动下,循环读入字符,进行状态转换。其他类 似以输入处理为核心。 以图2-3 (a)为例,
单词序列的机器编码表示示例 : <10,-> <22,-> <1,1> <28,-> <1,2> <29,-> <1,3> <25,-> <20,->
3.1.2 实现方案:
1.词法分析单独作为一遍
第一遍
单词串
S.P.(字符串)
词法分析
S.P.(符号串)
第二遍 语法分析
优点: 结构清晰、各遍功能单一 缺点:效率低
3.2.3 状态转换图
词法分析程序的设计:
词法规则
状态图
词法分析程序
概念:有限个结点的有向图 表示方法:状态(结点)、初态、终态、状态转换(弧) 用处:可用来识别某个字符串是否是某个正规语言的句子 (如识别整常数的状态图可识别出‘32172’是一个整常数)
L(M) = { Bn | n>0 }, 其中 B= {01,10} ,识别该语言句子 的其状态图为:
相关文档
最新文档