没有合适的资源?快使用搜索试试~ 我知道了~
首页编译原理 实验报告 此法分析语法分析
资源详情
资源评论
资源推荐

目录
目录
一、实验目的
二、实验任务概述
三、实现方法
编译程序词法分析程序的设计使用状态转换图实现
编译程序语法分析的设计与实现自顶向下的语法分析 递归子程序法
四、实验例程
词法分析器:
语法分析器:
五、总结
六、附录(源代码)
、词法分析器
、语法分析器
一、实验目的
1. 通过对 PL 语言编译程序的扩充,加深对编译过程的整体认识,进一步理解编译
程序本身的整体结构;
2. 通过对一个具体词法分析程序的扩充与调试,加深对词法分析原理的理解,掌
握词法分析的基本方法和实现技术;
3. 通过调试一个实际的词法分析程序,理解语法分析原理和实现方法,掌握递归
下降分析程序的构造、错误处理方法及符号表的组织方式;

二、实验任务概述
实验一:以 PL 语言(结构化语言的子集)为背景,实习编译程序的构造方法。
首先通过调试 PL 编译程序,了解一个小的编译程序的总体框架,掌握递归下降
分析程序的构造,理解和掌握错误处理方法及符号表的组织方式,理解和掌握
语法制导翻译。然后扩充 PL 语言成分,并对相应的编译程序进行扩充。扩充内
容:
1. 扩充语句,如增加 for 语句、repeat 语句、case 语句等
2. 增加函数的说明和使用
3. 扩充数据类型,如实型、记录类型等
4. 扩充其它语言成分
实验二:了解便于程序构造工具的使用:
1. 词法分析器的自动产生器——LEX
2. 语法分析器的自动产生器——YACC
3. 3.词法和语法分析器的自动产生器——JavaCC
三、实现方法
PL/0 编译程序词法分析程序的设计------使用状态转换图实现
表示状态,对应每个状态编一段程序,每个状态调用取字符程序,根据当前字符转
到不同的状态,并做相应操作。
表示终态,已识别出一个单词。
流程图如下:
或
数字数字
数字 . 或 或数字其他
. 数字
其他

PL/0 编译程序语法分析的设计与实现-----自顶向下的语法分析
递归子程序法
递归子程序法:对应每个非终结符语法单元,,编一个独立的处理过程(或子
程序)。语法分析从读入第一个单词开始,由非终结符<程序>(即开始符)出
发,沿语法描述图箭头所指出的方向进行分析。当遇到非终结符时,则调用相
应的处理过程,从语法描述图看,也就进入了一个语法单元,再沿当前所进入
的语法单元所指箭头方向继续进行分析。当遇到描述图中是终结符时,则判断
当前读入的单词是否与图中的终结符相匹配,若匹配,再读取下一个单词继续
分析。遇到分支点时,将当前的单词与分支点上多个终结符逐个相比较,若都
不匹配时可能是进入下一个非终结符语法单位或是出错。
四、实验例程
词法分析器:
词法规则
关键字: 本程序识别的关键字为 int real if then else while,仅当单独出现 以上标
识符时识别为关键字,对于 inta,ifb 等识别为标识符。
标识符: 一个标识符必须以字母开头,后面接上字母和数字,否则产生报错信
息,程 序停止词法分析,输出相关错误信息
如: 正确:abc, abc123, 等
错误:123abc
操作符: 本程序识别的操作符为: + - / * = == < <= > >= !=
当 !后跟其它字符时产生出错信息。
分隔符: 本程序识别的分隔符为: ( ) { } ;
数字: 识别的数字遵循以下文法规则:
digit 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
intnumber digit
+
exponent E ( + | - | ) digit
+
fraction . digit
+
realnumber digit
+
exponent | digit
+
fraction ( exponent |
例如:正确

错误,
注释符: 注释部分以 // 本程序对其不进行识别.
引入文件 为 #include<**>形式,其他做出错处理
设计思路
本程序采用字符流形式读入文件,识别其中的关键字,标识符,分隔符,注释符,
引入文件声明等
本 本程序是是一个关于 语言的词法分析器
例如:程序如下所示时结果如下所示:
!"#$!%
读入文件的第一个字符
回车
空格
操作符 直接识
别为操作符 操作符
号 "%&' 进行跳转
看是否是 "'(%'(&'('
'( 操作符 进行跳转
看是否是
)* ( ) ( 直
接 识 别 为 分
隔符
根据 $+,- 函数判
断是否读到字符 若
是,进行跳转 以此
识别出标识符串和关
键字
根据 $!./- 函数
判断是 否读到 数
字,若 是,进 行
跳转, 以 此识别
出整个数字
状态 判断读入字符
类型,进行状态跳转
并对行 号 和 列 号 做相
应调整
转入相应状态,进行相关
操作

!"$#!#$%
0#-
)
#'(
1-#''
/2#'(
$#'(
*
0#-
)
$/,.#'##(
1-#''
/2#'(
$#'(
*
由词法规则可得”#3以数字开头,为错误的标识符,应产生报错信息,所以输出如下
剩余25页未读,继续阅读












安全验证
文档复制为VIP权益,开通VIP直接复制

评论0