编译原理 设计c语言的词法分析器_第1页
编译原理 设计c语言的词法分析器_第2页
编译原理 设计c语言的词法分析器_第3页
编译原理 设计c语言的词法分析器_第4页
编译原理 设计c语言的词法分析器_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

./编译原理课程设计报告题目:学院:教师::学号:班级:评分:签字:.编译原理课程设计一:设计c语言的词法分析器一、实验目的了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程,加深对词法原理的理解。二、实验要求了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。三、实验设计3.1.单词分类及表示3.1.1C语言的子集分类标识符:以字母开头的字母数字串整数或浮点型。保留字:for,while,do,else,if,static,int,sizeof,break,continue运算符:+,-,*,/,%,>,<,=,!=,==,<=,>=,!,&,&&,||;界符:"<",">",",",":",";","{","}"3.1.2单词二元组〔单词分类号、单词自身值单词分类号标识符1整数或浮点型2保留字3运算符4界符53.2词法分析器的设计3.2.1算法设计3.2.1.1概要设计从文件中逐个读取字符,只要这五大类的状态序列则继续读取,否则回退字符,在对应类别进行查找,输出单元二次组至另一文件夹。3.2.1.2状态图设计3.2.2输入输出设计输入:通过文件指针从文件中一个一个读取字符输出:输出单词二元组至文件。格式为〔种别码,值3.2.3主要函数voidGetchar<FILE*fp>//读入一个字符voidGetBC<FILE*fp>//读入一个非空字符voidcontacat<>//连接字符intletter<>//判断是否为字母intdigit<>//判断是否为字母voidretract<FILE*fp,char*c>//回退intreserve<char**k>//处理保留字intsysmbol<identifier*id>//处理标识符,查找符号表并存放位置若没有则添加intconstant<constnumber*con>//存入常数表,并返回它在常数表中的位置voidTofile<intnum,intval,identifier*id,constnumber*con,FILE*fw>//写到文件voidWordAnalyze<char**k,char*c,char**CODE,identifier*id,constnumber*con,FILE*fp,FILE*fw>//词法分析函数四、结果测试文件输入intmain<>{inta=1,b=3;if<a>1>b=b-2;}输出结果:结论:程序输出结果与期望输出结果相符。收获与感想通过我本次课程设计掌握了词法分析器设计的基本方法与相关知识。词法分析的关键是明确各类字符的状态转换过程。同时辅助标识符、常量结构体与保留字表用于查找返回值。同时我也对分析问题解决问题有了更深入全面的认识与理解。面对一个大的问题,需要理清解决的步骤再将其分解成小的模块逐个解决最后再串联在一起,问题就会变得更容易,思路也会更加清晰。五、实验代码#include<iostream>usingnamespacestd;#defineLENGTH10charch;char*CODE[]={"identifier","constant","keyword"/*保留字*/,"+","-","*","/","<","<=",">",">=","!=","==","=","<",">",",",":",";","{","}"};char*k[]={"for","while","do","else","if","static","int","sizeof","break","continue"};//保留字chartoken[16];//存放处理后的字符串//标识符结构体typedefstruct{ char*I[256]; intlen;}identifier;typedefstruct{ intcont[300]; intlen;}constnumber;//读入一个字符voidGetchar<FILE*fp>{ if<<ch=getc<fp>>==EOF> exit<1>;}//读入一个非空字符voidGetBC<FILE*fp>{ while<ch==''||ch=='\n'||ch==9> Getchar<fp>;}//连接字符voidcontacat<>{ char*cht=&<ch>; strcat_s<token,cht>;}//判断是否为字母intletter<>{ return isalpha<ch>;}intdigit<>{ returnisdigit<ch>;}//回退voidretract<FILE*fp,char*c>{ inta=ftell<fp>; fseek<fp,0,SEEK_SET>; fprintf_s<fp,"%c",ch>; ch=''; fseek<fp,a,SEEK_SET>;}//处理保留字intreserve<char**k>{ inti; for<i=0;i<LENGTH;i++> { if<strcmp<token,k[i]>==0> return<i+1>; } return0;}//处理标识符,查找符号表并存放位置若没有则添加intsysmbol<identifier*id>{ inti; for<i=0;i<id->len;i++> if<strcmp<token,id->I[i]>==0> returni+1; if<id->len>256> { cout<<"error"; } id->I[id->len]=token; id->len++; returnid->len;}//数字字符串转化为整数intstr_to_num<>{ inti=0; intk=token[i]-'0'; for<i=1;token[i]!='\0';i++> { k=k*10+token[i]-'0'; } returnk;}//存入常数表,并返回它在常数表中的位置intconstant<constnumber*con>{ con->cont[con->len]=str_to_num<>; con->len++;returncon->len;}//写到文件voidTofile<intnum,intval,identifier*id,constnumber*con,FILE*fw>{ intnum_=num; fprintf_s<fw,"<%d,",num>; if<num>=4> fprintf_s<fw,"%s",CODE[num-1]>; if<num<4> { switch<num> { case1:fprintf_s<fw,"%s",id->I[val-1]>;break; case2:fprintf_s<fw,"%d",con->cont[val-1]>;break; case3:fprintf_s<fw,"%s",k[val-1]>;break; } } fprintf_s<fw,">\n">;}voiderror<FILE*fw>{ cout<<"<Error,"<<ch<<">"<<endl; fprintf_s<fw,"<Error,%c\n>",ch>;}//词法分析函数voidWordAnalyze<char**k,char*c,char**CODE,identifier*id,constnumber*con,FILE*fp,FILE*fw>{ intnum,val; strcpy_s<token,"">;//初始化为空字符串 Getchar<fp>; GetBC<fp>; if<<ch>='A'&&ch<='Z'>||<ch>='a'&&ch<='z'>>//分析标识符和保留字 { //若字符为A~Z或0~9,则继续读取 while<letter<>||digit<>> { contacat<>; Getchar<fp>; } retract<fp,c>; num=reserve<k>; if<num!=0> Tofile<3,num,id,con,fw>; else { val=sysmbol<id>; Tofile<1,val,id,con,fw>; } } elseif<digit<>>//处理常数 { while<digit<>> { contacat<>; Getchar<fp>; } retract<fp,c>; val=constant<con>; Tofile<2,val,id,con,fw>; } else//分析符号 { switch<ch> { case'<': Getchar<fp>; if<ch=='='> Tofile<9,0,id,con,fw>; else { retract<fp,c>; Tofile<8,0,id,con,fw>; } break; case'>': Getchar<fp>; if<ch=='='> Tofile<11,0,id,con,fw>; else { retract<fp,c>; Tofile<10,0,id,con,fw>; } break; case'=': Getchar<fp>; if<ch=='='> Tofile<13,0,id,con,fw>; else { retract<fp,c>; Tofile<14,0,id,con,fw>; } break; case'!': Getchar<fp>; if<ch=='='> Tofile<12,0,id,con,fw>; else error<fw>; break; case'+': Tofile<4,0,id,con,fw>; break; case'-': Tofile<5,0,id,con,fw>; break; case'*': Tofile<6,0,id,con,fw>; break; case'/': Tofile<7,0,id,con,fw>; break; case'<': Tofile<15,0,id,con,fw>; break; case'>': Tofile<16,0,id,con,fw>; break; case',': Tofile<17,0,id,con,fw>; break; case':': Tofile<18,0,id,con,fw>; break; case';': Tofile<19,0,id,con,fw>; break; case'{': Tofile<20,0,id,con,fw>; break; case'}': Tofile<21,0,id,con,fw>; break; default: error<fw>; } }}intmain<>{ charc[100]="F://1.txt"; FILE*fp,*fw; errno_terr; err=fopen_s<&fp,c,"r">; if<err!=0> { printf<"Thefilewasnotopened\n">; exit<0>; } errno_terr1; err1=fopen_s<&fw,"F://2.txt","w">; if<err1!=0> { printf<"Thefilewasnotopened\n">; exit<0>; } identifier*id=<i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论