ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:106.87KB ,
资源ID:768086      下载积分:15 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-768086.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(词法分析器的设计实验.docx)为本站会员(聆听****声音)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

词法分析器的设计实验.docx

1、一、实验目的和要求加深对状态转换图的实现及词法分析器的理解。熟悉词法分析器的主要算法及实现过程。要求学生掌握词法分析器的设计过程,并实现词法分析。二、实验基本内容1、 格式输入:打开一个 C 语言程序的源代码文件,将其读入程序输入框。处理:对输入框中的代码进行词法分析,分离出关键字、标识符、数值、运算符和界符。输出:在词法分析结果表中输出每个单词对应的编码和值。其中,编码是自定义的,一种类型对应一组编码。 2、 编译对象变量声明和其它标记赋值语句分支结构语句循环语句3、 实现过程在词法分析程序设计中,先以只读方式读取一个文件,自文件头开始扫描文本,滤去开头的空格、回车符、换行符等!读取的字符送

2、入缓冲区。扫描第一个字符,看匹配的类型,并进行相应的类型分析,满足判断类型时,输出其种别码和值。判断时要注意保留字和识别符之间的不同,单目运算符和双目运算符之间的不同。因此可用指针进行处理。还必须熟悉字符串函数的使用。并要对非法字符作出错误提示。文本扫描结束要判断词法分析是否成功。最后是关闭文件,释放指针。给出一个简单语言的词法规则,画出状态转换图,并依据状态转换图编制出词法分析程序,能从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值(遇到错误时可显示“Error”,然后跳过错误部分继续显示)词法规则

3、如下:单词符号种别码内码单词符号种别码内码auto101long121break102new122case103operator123char104private124class105protected125const106public126continue107register127default108return128delete109short129do110sizeof130double111static131else112struct132enum113switch133extern114template134float115this135for116typedef136friend

4、117union137if118virtual138inline119void139int120while140单词符号种别码内码单词符号种别码内码201,234202235*203236/204237%205238206(239207)240208:241209242210243211#244212;245!213标识符300&214常数400二进制形式|215!216217218219|220221&222223224225*226227%228229230&231232|233三、实验步骤1. 基本思想从源程序中依次读入字符并解析,与关键字、运算符、结束符进行比较,得出其中的关键字, 并

5、将它存入到数组中去。2. 程序流程图3. 实验的输入源文件(input.txt)int a=3; double b=4; int c; double d=5; if(ab) c=a;else c=b; if(cd) c=d; else c=c4. 实验输出截图为了便于语法分析程序使用此法分析程序的结果,将此法分析程序的结果输出到 output.txt文件中,其内容如下所示:5. 实验源代码:#include #include #include #define MaxSize117#define MaxSize220#define MaxSize34 struct TNodechar value

6、20; int number;char description20;KeyWordsMaxSize1,OperationMaxSize2,EndOperationMaxSize3;char*WordsBuffMaxSize1=const,long,float,double,void,main,if,else,then,break,int,char,include,for,while,printf,scanf;char*OperationBuffMaxSize2=+,-,*,/,+=,-=,*=,+,-,=,=,(,),#,;char EndOperationBuffMaxSize3= ,;,n

7、,t; TNode Table1500;TNode Variable100;TNode Const100;void inputKeyWords(char * buff,int size)for(int i=0;isize;i+)strcpy(KeyWordsi.value,buffi); KeyWordsi.number=i+1;strcpy(KeyWordsi.description,关键字);void inputOperation(char * buff,int size)for(int i=0;isize;i+)strcpy(Operationi.value,buffi); Operat

8、ioni.number=i+50;strcpy(Operationi.description,运算符);void inputEndOperation(char buff,int size)for(int i=0;isize;i+)EndOperationi.value0=buffi; EndOperationi.value1=0; EndOperationi.number=i+100;strcpy(EndOperationi.description,结束符);void outputInfo(TNode a,int size)for(int i=0;isize;i+)printf(%d,ai.n

9、umber); printf(t); printf(%s),ai.value); printf(t); printf(ai.description); printf(n);void outInfoToFile(TNode a,int size,FILE *out)for(int i=0;isize;i+)fprintf(out,(%d,ai.number); fprintf(out,t); fprintf(out,%s),ai.value); fprintf(out,t); fprintf(out,ai.description); fprintf(out,n);char getChar(FIL

10、E *fp)char ch=fgetc(fp); return ch;int isOperation(char a)int result;for(int i=0;iMaxSize2;i+)result=strcmp(a,Operationi.value); if(result=0)return i; break;return -1;int isKeyWords(char a)int result;for(int i=0;iMaxSize1;i+)result=strcmp(a,KeyWordsi.value); if(result=0)return i; break;return -1;int

11、 isEndOperation(char a)for(int i=0;i=a&aA&a=0&a0)strcpy(Table1count.value,KeyWordsa.value); Table1count.number=KeyWordsa.number;else if(i0)strcpy(Table1count.description,KeyWordsa.description); count+;i=0;if(isChar(buff0)strcpy(Variablecount1.value,buff); Variablecount1.number=count1;strcpy(Variable

12、count1.description,标识符);count1+; i=0;else if(isDigit(buff0)strcpy(Constcount2.value,buff); Constcount2.number=count2;strcpy(Constcount2.description,常量);count2+; i=0;elsenextchar0=fgetc(in);else if(isEndOperation(nextchar0)!=-1)buffi=0; a=isKeyWords(buff); if(a!=-1&i0)strcpy(Table1count.value,KeyWord

13、sa.value); Table1count.number=KeyWordsa.number; strcpy(Table1count.description,KeyWordsa.description); strcpy(temp,KeyWordsa.value);count+; i=0;else if(i0)if(isChar(buff0)strcpy(Variablecount1.value,buff); Variablecount1.number=count1;strcpy(Variablecount1.description,标识符);count1+; i=0;else if(isDig

14、it(buff0)strcpy(Constcount2.value,buff); Constcount2.number=count2;strcpy(Constcount2.description,常量);count2+; i=0;elsenextchar0=fgetc(in);else if(a=isOperation(nextchar)!=-1)buffi=0; a=isKeyWords(buff); if(a!=-1&i0)strcpy(Table1count.value,KeyWordsa.value); Table1count.number=KeyWordsa.number; strc

15、py(Table1count.description,KeyWordsa.description); count+;i=0;else if(i0)if(isChar(buff0)strcpy(Variablecount1.value,buff);Variablecount1.number=count1;strcpy(Variablecount1.description,标识符); count1+;i=0;else if(isDigit(buff0)strcpy(Constcount2.value,buff); Constcount2.number=count2;strcpy(Constcoun

16、t2.description,常量);count2+; i=0;elseop0=nextchar0; nextchar0=fgetc(in); if(nextchar0!=)if(isOperation(nextchar)!=-1)op1=nextchar0; if(a=isOperation(op)!=-1)strcpy(Table1count.value,Operationa.value); Table1count.number=Operationa.number;strcpy(Table1count.description,Operationa.description);count+;

17、nextchar0=fgetc(in);elsestrcpy(Table1count.value,op); Table1count.number=-1;strcpy(Table1count.description,未定义的运算符);count+; nextchar0=fgetc(in);elseop1=0;a=isOperation(op); strcpy(Table1count.value,Operationa.value); Table1count.number=Operationa.number; strcpy(Table1count.description,Operationa.des

18、cription);count+;return count;void main()inputKeyWords(WordsBuff,MaxSize1); inputOperation(OperationBuff,MaxSize2); inputEndOperation(EndOperationBuff,MaxSize3); FILE *in,*out;bool Flag=true; while(Flag)printf(源文件的位置:D:input.txtn); if(in=fopen(D:input.txt,r)=NULL)printf(读取源文件失败!n);exit(0);if(out=fop

19、en(D:output.txt,w)=NULL)printf(打开文件失败!n); exit(0);int MaxSize=start1(in);printf(关键字及运算符n);fprintf(out,关键字及运算符n); outputInfo(Table1,MaxSize); outInfoToFile(Table1,MaxSize,out);printf(标识符表:n);fprintf(out, 标 识 符 表 :n); outputInfo(Variable,count1); outInfoToFile(Variable,count1,out);printf(常量表:n);fprint

20、f(out, 常 量 表 :n); outputInfo(Const,count2); outInfoToFile(Const,count2,out); Flag=false;fclose(in);fclose(out);四、 实验中发现的问题和遇到的困难:4.1 分析出的关键字、运算符、标识符等的保存问题4.2 文本文件中的转义字符问题五、问题及困难的解决:5.1 :对于保存的问题,我们设计了一种数据结构如下所示: struct TNodechar value20; /存放标识符的值int number;/存放标识符的种别码char description20;/描述软后申明这种类型的数组来保存关键字、运算符、标识符和常量等。5.2 : 转义字符是 C 语言中表示字符的一种特殊形式。通常使用转义字符表示 ASCII 码字符集中不可打印的控制字符和特定功能的字符,如用于表示字符常量的单撇号(),用于表示字符串常量的双撇号()和反斜杠()等。转义字符用反斜杠后面跟一个字符或一个八进制或十六进制数表示,文本文件中的打一下回车键对应的字符是rn,是两个字符六、总结第一个编译原理课程实验已经结束了,在这一个星期里的时间里,通过实验,让我感受到许多不足。历本次实训,从中学到很多东西,这次实训的宝贵经验也肯定将会成为我在以后成长道路上的一笔丰富财富!

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2