编译原理上机报告1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
重庆科技学院
上机实验报告(程序设计类)
课程名称编译原理实验项目词法分析程序设计
机房名称I313 上机时间2018年5月8日
指导老师王双明上机成绩
学生姓名李翼学号2015442377 专业班级计科15
一、上机目的和要求
1.了解词法分析程序的功能、单词符号及输出单词的形式
2.掌握词法分析程序的编写方法
二、上机开发环境
硬件环境:能流畅运行Windows 7、VC++6.0或Eclipse4.5
软件环境:Windows 7、VC++6.0或Eclipse4.5
三、上机内容(老师布置的具体任务)
1.构造词法分析程序:根据给出的词法规则构造相应的词法分析程序。
词法规则:关键字(from for draw scale origin rot step is T to)、
运算符和界符(+ - * / ^ < <= > >= = == ; , ( ) #)、整数(NUM=数字数字*)、空白(空格、制表符(\t) 、换行符组成);字母
区分大小写,单词最长不超过20个符号。
2.模拟一个DFA的执行。DFA如下图所示。
四、上机调试中出现的错误信息、错误原因及解决办法
原输入串进行分析的预处理是在注释的嵌套判断上出现了问题,调试了几次才
发现是出现注释时计数值本来应该减2结果减了1。
五、上机实验中的收获及心得(不少于50字)
在看到词法分析这个实验时,对于词法分析的这个含义还不是很清楚,对于老师布置这个作业的意义也不清楚。在看到书上对于词法分析的讲解时,才明白词法分析是整个编译的第一阶段工作,可以说好的词法分析程序会让之后的编译工作变得更轻松。在参考了一些词法分析程序后,对于词法分析程序中的侧重点也有所了解,特别是对于一段源程序的存储与判断,最后与种别表进行相应的对比,这是简单的词法分析过程。在自己实现这个代码时,印象最深的是在对于分界符的判断时,在两个以上的一起判断时,就会出现单个分界符的错误输出,在经过一系列的错误尝试后,最后正确输出。可以说这个词法分析程序结合许多不同的方法,最终得到的简单可行的程序。
要求:正文采用小四宋体,代码用5号Times new Roman字体
附录:
程序流程图
上机调试后的源程序及注解
题目一:#include
#include
#include
#include
#include
int i, row = 0, line = 0;
char a[1000]; //程序
int number[1000][100]; //常数表
char mark[100][5]; //标识符表
//词法分析
int wordanalysis()
{
if ((a[i] >= 'A'&&a[i] <= 'Z')||(a[i]>='a'&&a[i]<='z')) //分析标识符和保留字
{
char word[10];
char pro[100][100] = { "FROM", "FOR", "DRAW", "SCALE", "ORIGIN", "ROT", "STEP", "IS", "TO", }; //保留字表
int n = 0;
word[n++] = a[i++];
//若字符为A~Z或0~9,则继续读取
while ((a[i] >= 'A'&&a[i] <= 'Z') || (a[i] >= '0' && a[i] <= '9')||(a[i]>='a'&&a[i]<='z'))
{
word[n++] = a[i++];
}
word[n] = '\0';
i--;
//判断该标识符是否为保留字
for (n = 0; n < 100; n++)
{
if (strcmp(word, pro[n]) == 0)
{
printf("%s\t(%d,-) 保留字\n", pro[n], n + 1); return 3;
}
}
//判断标识符长度是否超出规定
if (strlen(word)>20)
{
printf("%s\tERROR\n",word);
return 0;
}
//判断该标识符是否存在标识符表中
int m = 0;
if (line != 0)
{
int q = 0;
while (q { if (strcmp(word, mark[q++]) == 0) { printf("%s\t(12,%d) 标识符\n", word, q); return 3; } } } //将该标识符保存到标识符表中 strcpy(mark[line], word); printf("%s\t(12, %d) 标识符\n", word, line + 1); line++; return 3; } else if (a[i] >= '0' && a[i] <= '9') //分析常数 { char x[100]; int n = 0, sum; x[n++] = a[i++]; //判断字符是否是0~9 while (a[i] >= '0' && a[i] <= '9') { x[n++] = a[i++]; } x[n] = '\0'; i--; int num = atoi(x); //将字符串转换成int型 //判断该常数是否存在于常数表中