(实验报告模板)实验1:词法分析
编译原理
实验报告
学院(系)名称:计算机与通信工程学院
编译原理
空白 字母或数字
编译原理
因为在课本中已经对词法分析器做了很明确的分析,所以只要把代码变成真正可执行的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; 即可清空数组
编译原理
.代码如下:
#include<stdio.h> #include<string.h> char ch;
char token[20],prog[20]; int i,p,c;
char *keyword[5]={"while","if","else","switch","case"}; int reserve() //判断是否为保留字 {
if(strcmp(token,keyword[0])==0) return 1;
else if(strcmp(token,keyword[1])==0) return 2;
else if(strcmp(token,keyword[2])==0) return 3;
else if(strcmp(token,keyword[3])==0) return 4;
else if(strcmp(token,keyword[4])==0) return 5; else return 0; }
int letter() //判断是否为字母 {
if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z') return 1; else return 0; }
int digit() //判断是否为数字 {
if(ch>='0'&&ch<='9') return 1; else return 0; }
int retract() //指针回退一个字 {
p=p-1; }
void get() {
ch=prog[p]; p++; }
编译原理
void main() {
printf("please input the sentence,end with '#'"); p=0;
do //先将#以前的所有字符读入prog[p]数组 { p++; scanf("%c",&prog[p]); }while(prog[p]!='#'); //!!!!!!!!由于上面采用的是do..while所以读入的第一个 p=1; for(i=0;i<20;i++) token[i]=NULL; i=0; get();
while(ch!='#') { if(ch==' ') get(); else { switch(ch) { case'a': case'b': case'c': case'd': case'e': case'f': case'g': case'h': case'i': case'j': case'k': case'l': case'm': case'n': case'o': case'p': case'q': case'r': case's': case't': case'u': case'v': case'w':
//字符时存在p=1的,所以先要使p=1,这是必须的 //清空token[]数组
编译原理
case'x': case'y': case'z':
while(letter(ch)||digit(ch)) { token[i]=ch; i++; get(); }
retract();
c=reserve(); if(c==0) { printf("(标识符%s,种别编码6)\n",token); } else printf("保留字%s,种别编码%d\n",token,c); break; case'0': case'1': case'2': case'3': case'4': case'5': case'6': case'7': case'8': case'9':
while(digit(ch)) { token[i]=ch; i=i+1; get(); }
retract();
printf("常数%s\n",token); break; case'+': printf("(加,+)\n");break; case'-': printf("(减,-)\n");break; case'*': printf("(乘,*)\n");break; case'<':
编译原理
get(); if(ch=='=') printf("(小于等于,<=)\n"); else { retract(); printf("(小于,<)\n"); } break; case'=': get(); if(ch=='=') printf("(赋值,==)\n"); else { retract(); printf("(等于,=)\n"); } break; case';': printf("(分号,;)\n"); break; case'(': printf("(\n");break; case')': printf(")\n");break; default: printf("(无效字符,%c)\n",ch); } for(i=0;i<20;i++) token[i]=NULL; i=0; //对token[]数组进行完操作需把i归0, get(); //指向第一个存储单元,否则token[]数组 } //置空,是无法输出的 } }
实验结果:
编译原理
【实验过程记录(源程序、测试用例、测试结果及心得体会等)】
这个程序还有不足的地方,比如可以识别的关键字只有keyword[]里的五个保留字,如果想要增加,增加的代码虽简单但是却冗长,不如循环做得好:
for(n=0;n<6;n++)
if(strcmp(token,keyword[n])==0) { blz=n+1; break; } } 这样就可以判断出保留字并且返回blz就是保留字的种别编码,不过由于我的程序后面是根据c=reserve()的c值来输出的,所以上述的循环体不太合适
…… 此处隐藏:1481字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [小学教育]四年级综合实践活动课《衣物的洗涤》教
- [小学教育]2014半年工作总结怎么写
- [小学教育]20世纪外国文学专题综合试题及答案
- [小学教育]TS_1循环使用催化丙烯环氧化反应研究
- [小学教育]最实用的考勤签到表(上下班签到表)
- [小学教育]气候与生态建筑——以新疆民居为例
- [小学教育]二人以上股东有限责任公司章程参考样本
- [小学教育]2014届第一轮复习资料4.1,3美好生活的
- [小学教育]土方开挖、降水方案
- [小学教育]手绘儿童绘本《秋天的图画》(蜡笔)
- [小学教育]2002级硕士研究生卫生统计学考试试题
- [小学教育]环保装备重点发展目录
- [小学教育]金蝶K3合并报表培训教材
- [小学教育]岩浆岩试题及参考答案
- [小学教育]知之深爱之切学习心得
- [小学教育]第十二章 蛋白质的生物合成
- [小学教育]Chapter 2-3 Solid structure and basi
- [小学教育]市政道路雨季专项施工方案
- [小学教育]中国海洋大学2012-2013学年第二学期天
- [小学教育]教育心理学第3章-学习迁移
- 浅谈深化国企改革中加强党管企业
- 2006年中国病理生理学会学术活动安排
- 设计投标工作大纲
- 基于ARP的网络攻击与防御
- 2016届湖北省七市(州)教科研协作体高三
- Google_学术搜索及其检索技巧
- 2019-2020学年七年级地理下册6.3美洲教
- 城市道路可研报告
- 【名师指津】2012高考英语 写作基础技
- 6级知识点培训北京师范大学《幼儿智趣
- 注册会计师会计知识点:金融资产
- 新安装 500 kV 变压器介损分析与判断
- PS2模拟器PCSX2设置及使用教程.
- 医院药事管理与药剂科管理组织机构
- {PPT背景素材}丹巴的醉人美景,免费,一
- NAS网络存储应用解决方案
- 青海省西宁市六年级上学期数学期末考试
- 测量管理体系手册依据ISO10012:2003
- 洞子小学培养骨干教师工作计划
- 浅谈《牛津初中英语》的教材特点及教学




