编译原理上机报告1

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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型

//判断该常数是否存在于常数表中

相关文档
最新文档