读文件否zhushi==0是接下来是‘*/’是zhushi=1否跳过空格和制表符判断是否到文件末尾是结束否标识符无符号整数符号等其他判断是否为保留字是输出(c,token)否输出(12,token)输出(13,token)输出(种别码,ch)输出(非法字符,ch)
七、 实验过程结果截图:
? 测试用例一:
结果一:
? 测试用例二:
结果二:
八、 实验总结:
? 实验心得:
通过本次实验我锻炼了自己的上机操作能力及编程能力,并对理论知识有了进一步的了解。本实验基本思路比较清晰,用较为简单的算法就能实现;解决实验中遇到的问题也花费了一部分时间,我增长了处理关于文件错误的能力;
? 实验中遇到的问题:
主要问题就是在读取文件时对文件末尾的判断预处理,有两个问题花费了大部分时间,一个是在回退时要判断是否为文件末尾,若是则不需要回退;另外一个就是要先读取一个字符再用feof(fp)来判断是否为文件尾,且两个应紧密相连;
? 程序的自我评价:
此程序实现了要求中的所有功能,并增加了对注释的一些操作,但因编程能力的欠缺,其中有的地方不免有些繁杂,还有一些潜藏的问题,需要进一步测试来时程序变得更加具有健壮性。
九、 程序清单:
/**************************************************** 课题名称:词法分析程序构造原理与实现技术 作者:房皓 进修生 13410801 最后修改时间:2014.4.9 19:47
***************************************************/
/**************************************************单词符号及其分类编码
单词符号 种别码 单词符号 种别码 begin 1 无符号整数 13 end 2 + 14 if 3 - 15 then 4 * 16 else 5 ; 17 for 6 ( 18 do 7 ) 19 while 8 = 20 and 9 > 21 or 10 >= 22 not 11 < 23 标识符 12 <= 24 <> 25 := 26 / 27 /* 28 */ //29
/***************************************************/ #include
/////////////////////////////////////////////////////////////////////////////////////////
int lookup(char *str)//每调用一次,就以TOKEN中的字符串查保留字表,若查到,就将相应关键字的类别码赋给整型变量c;否则将c置为0 { char*letter[11]={\保留字 int i; for(i=0;i<11;i++) { if(strcmp(str,letter[i])==0) //比较是否相同 return i+1; //若相同,返回相应的种别码 } return 0; }
//////////////////////////////////////////////////////////////////////////////////// int scanner(FILE *fp) { char TOKEN[20]; FILE *fp_out=fopen(\
char ch; int i=0,c; int zhushi=0; 前不是注释,zhushi=1表示当前及以后的都是注释 ch=fgetc(fp); while(!feof(fp)) { if(zhushi==0) { i=0; if(ch==' '||ch==' ') {} else if(isalpha(ch)) { ch=tolower(ch); TOKEN[0]=ch; i++; ch=fgetc(fp); while(isalnum(ch)) { if(isalpha(ch)) ch=tolower(ch); TOKEN[i]=ch; i++; ch=fgetc(fp); } TOKEN[i]='\\0'; if(ch!=EOF) 此判断,遇到文件结尾仍返回的话,则 fseek(fp,-1L,1); 最后一个字符 c=lookup(TOKEN); if(c==0) { fprintf(fp_out,\ printf(\ } else { fprintf(fp_out,\ printf(\ }
//zhushi等于0表示当
//判断文件结束
//是否为字母
//转换成小写
//数字或字母
//经验证,若没有
//ch的值永远为文件
//查找保留字
//标识符
//标识符
//保留字 //保留字
} else if(isdigit(ch)) //是否为数字 { TOKEN[0]=ch; ch=fgetc(fp); i++; while(isdigit(ch)) { TOKEN[i]=ch; i++; ch=fgetc(fp); } TOKEN[i]='\\0'; if(ch!=EOF) fseek(fp,-1L,1); fprintf(fp_out,\ //无符号整数 printf(\ //无符号整数 } else switch(ch) { case'<': if(!feof(fp)) ch=fgetc(fp); if(ch=='=') { fprintf(fp_out,\ printf(\ } else if(ch=='>') { fprintf(fp_out,\ printf(\ } else { if(ch!=EOF) fseek(fp,-1,1); fprintf(fp_out,\ printf(\ } break;