(实验报告模板)实验1:词法分析(3)

2020-11-27 12:50

编译原理

因为在课本中已经对词法分析器做了很明确的分析,所以只要把代码变成真正可执行的C语言即可,我是参照课本的;

编程思路:根据书中提供的大致代码,不难把一些类似letter() digit()的函数写出来,程序中是用ch来表示字符的,可是要判断每一个读入的字符,不难想到用数组来实现(当然数据结构中的栈实现起来或许更好一些,但能力有限了),这样只要prog[p]中p++即可判断下一字符,扫描到下一字符为非类型字符时p-1即可(即retract()函数)。而判断是否为保留字还是想了不短的时间,首先想到prog[p]、p++逐个字符检查,可是逐个字符检查发现没有办法和保留字对比,或者说比起来很麻烦,查资料后发现用strcmp()函数可以比较容易的实现,只要将token和keyword[j]进行对比,如果二者相同结果返回j+1那么就是第j+1个保留字,否则返回0,之后再进行处理。用strcmp()函数时还需#include<string.h>。程序需要的一些函数基本定义完后开始写主函数,写主函数还是比较纠结的,因为虽然大体框架很清晰,但一些衔接的地方还是不知道该怎么办。就像空格的问题就想了很久,如程序输入时就有空格,程序中间出现空格,不知道该怎么处理。比较token与关键词的时候,本来是用 for(j=0;j<=4;j++) {

if(strcmp(token,keyword[j])==0) {

return j+1;

} else

return 0;

}

但执行一次只有while可以识别,剩下的关键字被return 0了,所以改成了下面的做法 if(strcmp(token,keyword[0])==0) return 1;

else if(strcmp(token,keyword[1])==0) return 2

没有把token[]置空会出现如下错误

把一个数组置空网上给出了如下方法:

也就是memset(token,0,sizeof(token)) 没见过,所以用了比较笨的方法,如下: for(i=0;i<20;i++)

token[i]=NULL; 即可清空数组


(实验报告模板)实验1:词法分析(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:第4章4.1-4.4微机接口技术

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: