- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
PAGE
PAGE 10
《编译原理》综合性
实 验 报 告
实验学期 2016 至 2017 学年 第 1 学期专业 计算机科学与技术 班级 1403
学生姓名 黄世增 学号 1411640305
任课教师 赵曦
实验成绩
《编译原理》课程综合性实验报告
开课实验室: C210 2016 年 12 月 6 日
实验题目 词法分析器的设计一、实验目的
通过设计、编制、 调试一个具体的词法分析程序,实现对高级程序设计语言源程序进行扫描, 并将其分解为各种单词的词法分析方法; 加深对课堂教学的理解; 提高词法分析方法的实践能力。
二、实验要求
任选一种高级程序设计语言编程完成词法分析器。词法分析器应以教材所述分词原理为依据,使用恰当的数据结构和方法,结构清晰、高效。
编制一个读单词过程,源程序保存在文本文件中(也可键盘输入),读取该文
件,识别出各个具有独立意义的单词,即关键字、标识符、常数、运算符、分界符 五大类。依次输出各个单词的内部单词种别及单词符号自身值, 遇到错误时可显示“Eorror”,然后跳过错误部分继续显示。
二、实验设备与环境
硬件: PC机 Pentium100 以上。
软件: Win10,VS2010。三、实验内容
1.正规文法
关键字 - int |for| while | do | return | break | continue
运算符和界符 - |+ | - | * | / |==| | = |!= | | = | , | ; | ( | ) | {|}
标识符 - letter (letter | digit)*
整型常数 - digit digit* 2.算法思想
算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,
其基本思想是根据扫描到单词符号的第一个字符的种类,拼接出相应的单词符号。
主程序
置初值
调用扫描子程序
将结果存入结构体
否
输入串结束
是
输出单词二元组
结束
图 1 词法分析主程序示意图
其中初始包括关键字、运算符、界限符的置初值。
扫描子程序的算法思想:
在词法分析中,先以只读方式读取一个文件,自文件头开始扫描文本,滤去
开头的空格、回车符、换行符等。读取的字符送入 word。扫描第一个字符,看匹配的类型,并进行相应的类型分析,满足判断类型时,输出其种别码和值。
忽略空格
te是xt 是否扫描结束 是 返回
字母拼字符串
否
数字 其他
运算符、 符号界符等符号
是否关键字?
是
拼数
否
( 2,单词自身值)
(4/5 ,单词自身值) 报错
( 1,单词自身值)
( 3,单词自身值)
返回
图 2 扫描子程序
四、实验步骤
编写程序时,先定义几个全局变量, key[] 事先存放 7 个关键字, words[] 用来存放识别出来的单词二元组, text 用来存放从文件读取的内容, word 用于存放识别出来的单词, length 存放字符个数, k 存放识别出来的单词个数。
首先,将文本内容读取到 text 中,文本内容最后一个字符是空白符,然后调 用 scan 方法,逐个扫描每个字符,如果 word 的第一个字符是字母,则进行拼字符串,再判断是关键字还是标识符;如果 word 的第一个字符是数字,则在 word 清空之前判断是否有识别出非数字字符,若有,则出错,若没有,则识别出来的
字符串是常数;若 word 第一个字符是运算符或界限符,则各自存到 words[] 中。
最后扫描结束后输出。五、实验结果及分析
六、实验小结和思考
通过这次实验,我对词法分析器有了进一步的了解,而且对词法分析和语法
分析在实践中的应用有了深入的掌握 , 让我对高级语言的学习有了更深的认识 , 了解得更透彻。
七、源程序清单
#includ estdio.h #includ estdlib.h #includ estring using namespace std; #define MAX 10000
struct WordString
{
string Word; // 单 词
int category; // 类 别
};
char *key[7] = { int ,for , while , do, return , break , continue }; // 关键字
WordString words[MAX]; // 创建一个单词符号串string text; // 读入的文本存入 text 中string word; // 分割出的单词用 word 表示int length; // 字符个数
int k; // 总单词个数
void scan()
{
int i,j; k=0;
word= ;
for (i=0;i=
原创力文档


文档评论(0)