收藏 分销(赏)

词法分析器的设计与实现.doc

上传人:丰**** 文档编号:4119568 上传时间:2024-07-30 格式:DOC 页数:10 大小:37.54KB 下载积分:8 金币
下载 相关 举报
词法分析器的设计与实现.doc_第1页
第1页 / 共10页
词法分析器的设计与实现.doc_第2页
第2页 / 共10页


点击查看更多>>
资源描述
《编译原理》课程实验报告 实验题目: 某种简单程序语言的词法分析器的设计 与实现 专 业: 计算机科学与技术 班 级: 11060341 学 号: 11060341 姓 名: 实验目的: 设计一个词法分析程序,理解词法分析器实现的原理,掌握程序设计语言中的各类单词的词法分析方法,加深对词法分析原理的理解。 实验任务: 词法分析是从左向右扫描每行源程序的符号,拼成单词,换成统一的二元式 (单词种别,单词符号的属性值)表示。对给定的程序通过词法分析器识别一个个单词符号,并以二元式 (单词种别,单词符号的属性值)显示,本程序则是通过对给定程序段分析后以单词符号和文字提示显示) 实验流程: 程序清单: #include〈iostream> #include<cstdio> #include<cstring〉 using namespace std; int k=0; struct word { char name[10]; int kind; } word[1000]; char key[35][10]= {"scanf”,"short",”int”,"long”,”float”,”double”,"char”,"struct","union", ”printf”,”typedef",”const”,"unsigned”,"signed","extern",”register",”static”, ”volatile”,"void”,"if","else”,”switch”,"case","for","do”,"while”,”goto", ”continue”,”break","default”,”sizeof","return","include”,”bool" }; bool cmp(char a[]) { int i; for(int k=0; k<35; k++) { if(strcmp(a,key[k])==0) return 1; } return 0; } int main() { #ifdef LOCAL freopen(”in.txt”, ”r", stdin); freopen(”out。txt", "w”, stdout); #endif int p,q,flag; char a[1000],b[10],ch; while(gets(a)) { p=0; int len=strlen(a); while(p<len) { ch=a[p]; memset(b,0,sizeof(b)); while(ch==' ') { p++; ch=a[p]; } if((ch〉=’a'&&ch<='z')||(ch〉='A'&&ch<='Z')||ch==’_’) { flag=0; q=0; while((ch>=’a’&&ch<=’z’)||(ch>='A’&&ch<='Z')||ch=='_’||(ch〉='0'&&ch<='9')) { if((ch〉=’0’&&ch<=’9')||ch=='_’) flag=1; b[q++]=ch; p++; ch=a[p]; } if(flag==1) { strcpy(word[k]。name,b); word[k++]。kind=1; } else if(flag==0) { if(ch=='\''||ch==’”') { strcpy(word[k]。name,b); word[k++].kind=2; } else if(cmp(b)==1) { strcpy(word[k]。name,b); word[k++]。kind=3; } else { strcpy(word[k].name,b); word[k++].kind=1; } } } else if((ch〉=’0'&&ch<=’9')||ch==’-’) { int t=p—1; if(a[t]〉='0'&&a[t]〈='9’||a[t]>=’a’&&a[t]<=’z’||a[t]>='A'&&a[t]<=’Z’) { p++; ch=a[p]; if(ch==’—'||ch==’=’) { b[0]='-’; b[1]=ch; strcpy(word[k].name,b); word[k++].kind=5; ch=a[++p]; } else { b[0]='—'; strcpy(word[k]。name,b); word[k++]。kind=5; } } else { q=0; b[q++]=ch; p++; ch=a[p]; while((ch>=’0'&&ch<=’9')||ch=='。') { b[q++]=ch; p++; ch=a[p]; } strcpy(word[k]。name,b); word[k++].kind=2; } } else if(ch=='('||ch==')’||ch=='[’||ch==']'||ch==’{’||ch=='}'||ch==’,’||ch==';'||ch==’:’||ch=='\’'||ch==’"')//ch=='('||ch==')'||ch=='['||ch==']’||ch==’{’||ch==’}'|| { b[0]=ch; strcpy(word[k]。name,b); word[k++].kind=4; ch=a[++p]; } else if(ch=='%'||ch=='^’) { b[0]=ch; strcpy(word[k]。name,b); word[k++]。kind=5; ch=a[++p]; } else if(ch==’+’) { p++; ch=a[p]; if(ch=='+’||ch=='=’) { b[0]='+’; b[1]=ch; strcpy(word[k].name,b); word[k++].kind=5; ch=a[++p]; } else { b[0]=’+'; strcpy(word[k]。name,b); word[k++]。kind=5; } } else if(ch==’*') { p++; ch=a[p]; if(ch==’*’||ch=='=’) { b[0]=’*'; b[1]=ch; strcpy(word[k].name,b); word[k++].kind=5; ch=a[++p]; } else { b[0]=’*’; strcpy(word[k].name,b); word[k++]。kind=5; } } else if(ch=='/’) { p++; ch=a[p]; if(ch==’/'||ch==’=') { b[0]='/'; b[1]=ch; strcpy(word[k]。name,b); word[k++].kind=5; ch=a[++p]; } else { b[0]=’/'; strcpy(word[k]。name,b); word[k++].kind=5; } } else if(ch==’=') { p++; ch=a[p]; if(ch==’=’) { b[0]=b[1]=’='; strcpy(word[k].name,b); word[k++].kind=5; ch=a[++p]; } else { b[0]=’=’; strcpy(word[k].name,b); word[k++].kind=5; } } else if(ch==’〉’) { p++; ch=a[p]; if(ch=='>’||ch=='=’) { b[0]=’>’; b[1]=ch; strcpy(word[k].name,b); word[k++].kind=5; ch=a[++p]; } else { b[0]=’〉'; strcpy(word[k]。name,b); word[k++].kind=5; } } else if(ch=='<’) { p++; ch=a[p]; if(ch=='〈'||ch=='=’) { b[0]='<’; b[1]=ch; strcpy(word[k].name,b); word[k++].kind=5; ch=a[++p]; } else { b[0]=’<’; strcpy(word[k]。name,b); word[k++]。kind=5; } } else if(ch=='!’) { p++; ch=a[p]; if(ch=='=') { b[0]=’!'; b[1]=’='; strcpy(word[k].name,b); word[k++]。kind=5; ch=a[++p]; } else { b[0]='!'; strcpy(word[k]。name,b); word[k++].kind=5; } } else if(ch==’&’) { p++; ch=a[p]; if(ch==’&’) { b[0]=b[1]='&’; strcpy(word[k].name,b); word[k++].kind=5; ch=a[++p]; } else { b[0]=’&’; strcpy(word[k].name,b); word[k++].kind=5; } } else if(ch==’|') { p++; ch=a[p]; if(ch=='|') { b[0]=b[1]=’|'; strcpy(word[k]。name,b); word[k++]。kind=5; ch=a[++p]; } else { b[0]='|'; strcpy(word[k].name,b); word[k++].kind=5; } } } } for(int i=0; i〈k; i++) { switch(word[i]。kind) { case 1: { printf("(标识符,"); break; } case 2: { printf("(常量,”); break; } case 3: { printf("(关键字,"); break; } case 4: { printf("(界符,”); break; } case 5: { printf("(运算符,"); break; } } printf(”%s)\n”,word[i]。name); } int a1=0,a2=0,a3=0,a4=0,a5=0; for(int i=0;i〈k;i++) { if(word[i]。kind==1) a1++; else if(word[i]。kind==2) a2++; else if(word[i]。kind==3) a3++; else if(word[i].kind==4) a4++; else if(word[i]。kind==5) a5++; } printf(”标识符:%d\n常量:%d\n关键字:%d\n界符:%d\n运算符:%d\n”,a1,a2,a3,a4,a5); return 0; } 运行结果:
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服