已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
编译原理课 程 设 计院 系 信息科学与技术学院 专 业 计算机科学与技术 年 级 2014级 学 号 2014111963 姓 名 张正超 词法分析器设计一、设计题目 手工设计c语言的词法分析器(可以是c语言的子集)。二、设计内容 处理c语言源程序,过滤掉无用符号,判断源程序中单词的合法性,并分解出正确的单词,以二元组形式存放在文件中。三、设计目的 了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。四、需求分析4.1.源程序的预处理:源程序中,存在许多编辑用的符号,他们对程序逻辑功能无任何影响。例如:回车,换行,多余空白符,注释行等。在词法分析之前,首先要先剔除掉这些符号,使得词法分析更为简单。4.2.单词符号的识别并判断单词的合法性:将每个单词符号进行不同类别的划分。单词符号可以划分成5中。 (1)标识符:用户自己定义的名字,常量名,变量名和过程名。(2)常数:各种类型的常数。(3) 保留字(关键字):如if、else、while、int、float等。(4) 运算符:如+、-、*、=等。(5)界符:如逗号、分号、括号等。5.3.将所有合法的单词符号转化为便于计算机处理的二元组形式:(单词分类号,单词自身值)。 五、主要源代码#include#include#include#include#include#defineLENGTH110/定义保留字的大小FILE*fp=NULL;/输出流指针FILE*fw=NULL;/输入流指针char /*/character;/字符char token16;/字符数组,用来存放已读入的字符序列/编码表/*/char*CODE=identifier/*标识符*/,constant/*常数*/,keyword/*保留字*/,+,-,*,/,=,!=,=,=,(,),:,;,;/保留字表charchar*k=for,while,do,else,if,static,int,sizeof,break,continue;/标识符结构体typedef structchar*I256;/标识符数组intlen;/标识符数量identifier;/常量结构体typedef/*/ struct intcont300;/存放常量的数组 intlen;/常量的数目constnumber;/读入一个字符,从输入流中读入一个字符到变量character中。voidgetNextChar(FILE*ifp) if(character=getc(ifp)=EOF) exit(1);/读入非空白字符,检查变量character中的字符是否为空白字符或回车或换行符。若是,/则调用getNextChar()读入下一个字符,直到character中的字符满足条件.voidgetnbc(FILE*ifp) while(character=|character=n|character=9) getNextChar(ifp); /连接字符串,把character中的字符连接到token数组的结尾。voidconcat()char*ct=&character;strcat(token,ct);/判断是否为字母。intletter()returnisalpha(character);/判断是否为数字intdigit()returnisdigit(character);/回退字符,将刚读入的character中的字符回退到输入流中。并把character中的值置为空。voidretract(FILE*ifp)(ifp-_cnt)+;(ifp-_ptr)-;character=;/处理保留字,对存放在token中的字符串查保留字,若查到,则返回该保留字的类别编码,否则返回0.intreserve(char*k)inti;for(i=0;iLENGTH1;i+)if(strcmp(token,ki)=0)returni+1;return0;/处理标识符,对存放在token中的字符串查找符号表,若查到,则返回它在符号表的位置,/存入常数表中,并返回它在常数表中的位置编号。intsymbol(identifier*id)inti;for(i=0;ilen;i+)if(strcmp(token,id-Ii)=0)returni+1;if(id-len256)assert(0);id-Iid-len=token;id-len+;returnid-len;/将数字字符串转化为整数。intstrtonumber()inti;intsum=0;for(i=0;icontcon-len=strtonumber();con-len+;returncon-len;/将整数值转化为字符串char*numbertoString(intnum)chars3;inti=num/10;while(i0) charc=i+0; strcat(s,&c); returns;/将结果写入到文件并且输出到屏幕。voidreturntofile(intnum,intval,identifier*id,constnumber*con) inti; int_num=num; charc; c=(;putc(c,fw); printf(%c,c); i=_num/10; while(i0) _num=_num-10*i; c=(i+0); printf(%c,c); putc(c,fw); i=_num/10; c=_num+0; printf(%c,c); putc(c,fw); printf(,);putc(,fw);/如果是标识符或常数则放入括号内。if(num=1)/处理标识符printf(%s,id-Ival-1);printf();printf(n);fputs(id-Ival-1,fw);putc(),fw);putc(n,fw);if(num=2)/处理常数_num=con-contval-1;i=_num/10;while(i0)_num=_num-10*i;c=(i+0);printf(%c,c);putc(c,fw);i=_num/10;c=_num+0;printf(%c,c);printf();printf(n);putc(c,fw);putc(),fw);putc(n,fw);if(num=3)/保留字 printf(-); printf(); printf();printf(#); printf(%s,kval-1); printf(#);printf(n); putc(-,fw);putc(),fw); fputs(,fw);putc(#,fw); fputs(kval-1,fw);putc(#,fw);putc(n,fw);if(num3)/处理界符 printf(-); printf(); printf(); printf(#); printf(%s,CODEnum-1); printf(#); printf(n); putc(-,fw); putc(),fw); fputs(,fw); putc(#,fw); fputs(CODEnum-1,fw); putc(#,fw); putc(n,fw); /将错误写入到文件或输出到屏幕voiderror() printf(ERROR,); printf(%c,character); printf(); printf(n); fputs(ERROR,fw); putc(character,fw); putc(),fw); putc(n,fw);/词法分析函数voidLexAnalyze(char*k,char*CODE,identifier*id,constnumber*con,FILE*fp,FILE*fw)intnum,val;strcpy(token,);getNextChar(fp);getnbc(fp);switch(character)casea:caseb:casec:cased:casee:casef:caseg:caseh:casei:casej:casek:casel:casem:casen:caseo:casep:caseq:caser:cases:caset:caseu:casev:casew:casex:casey:casez:caseA:caseB:caseC:caseD:caseE:caseF:caseG:caseH:caseI:caseJ:caseK:caseL:caseM:caseN:caseO:caseP:caseQ:caseR:caseS:caseT:caseU:caseV:caseW:caseX:caseY:caseZ:while(letter()|digit() concat(); getNextChar(fp); retract(fp); num=reserve(k);/保留字if(num!=0) returntofile(3,num,id,con); else val=symbol(id); returntofile(1,val,id,con); break; case0: case1: case2: case3: case4: case5: case6: case7: case8: case9:while(digit() concat(); getNextChar(fp); retract(fp); val=constant(con); returntofile(2,val,id,con); break; case: getNextChar(fp); if(character=) returntofile(11,0,id,con); else retract(fp); returntofile(10,0,id,con); break; case=: getNextChar(fp); if(character=) returntofile(13,0,id,con); else retract(fp); returntofile(14,0,id,con); break; case!: getNextChar(fp); if(character=) returntofile(12,0,id,con); else error(); break; case+: returntofile(4,0,id,con); break; case-: returntofile(5,0,id,con); break;case*: returntofile(6,0,id,con); break;case/: returntofile(7,0,id,con); break;case(: returntofile(15,0,id,con); break;case): returntofile(16,0,id,con); break;case,: returntofile(17,0,id,con); break;case: returntofile(18,0,id,con); break;case;: returntofile(19,0,id,con); break;case: returntofile(20,0,id,con); break;case: returntofile(21,0,id,con); break;default:error(); main(intargc,char*argv)/初始化标识符和常数结构体identifier*id=(identifier*)malloc(sizeof(identifier);constnumber*con=(constnumber*)malloc(sizeof(constnumber);con-len=0;id-len=0;argc=3;argv1=E:file1.txt;/待分析的文件argv2=E:file2.txt;/保存分析结果的文件/从打开目标文件流if(fp=fopen(argv1,r)=NULL) printf(cat:cantopen%sn,*argv); return1; /打开要写二元式的文件流 if(fw=fopen(argv2,w)=NULL) printf(cat:cantopen%sn,argv2);return1; while(!feof(fp) LexAnalyze(k,CODE,id,con,fp,fw);/执行词法分析/关闭流fclose(fp);fclose(fw);return0;六.实验结果 要分析的C语言程序(1)inti=0,sum=0;while(i10)sum=sum+i;i=i+1;结果为:(3,-)#int#(1,i)(14,-)#=#(2,0)(17,-)#,#(1,sum)(14,-)#=#(2,0)(19,-)#;#(3,-)#while#(15,-)#(#(1,i)(8,-)#0)charc=i+0;strcat(s,&c);returns;结果为:(1,char)(1,s)(ERROR,)(2,3)(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025失智老年照护专项测试题及答案
- 沈阳市高职单招职业技能考前演练试题及答案解析
- 成人住院患者跌倒风险评估及预防试题及答案
- 注册测绘师案例分析真题及答案解析
- 烟花爆竹经营单位安全管理人员考试题库(含答案)
- 班组长培训考试题及答案
- 电大专科学前教育《学前儿童科学教育》考试试题及答案
- 电焊工安全知识培训试题(含答案)
- 电焊考试模拟试题及答案
- 盐城市第一人民医院7月招聘试题及答案
- 数据新闻与信息可视化 课件 第一章 数据新闻与可视化概论
- 2024年宁波市水务环境集团有限公司招聘笔试参考题库含答案解析
- 嵊州嘉洋纺织有限公司面料技术改造项目环境影响报告
- 110kv各类型变压器的计算单
- 华友岗位职级图
- 《商务礼仪与沟通》项目十
- 了不起的我课件完整版
- 三菱HOPE电梯的故障码
- 抖音企业号操作文档最新版
- YC/T 145.2-2012烟用香精相对密度的测定
- GB/T 5709-1997纺织品非织造布术语
评论
0/150
提交评论