编译原理词法分析器语法分析器实验报告_第1页
编译原理词法分析器语法分析器实验报告_第2页
编译原理词法分析器语法分析器实验报告_第3页
编译原理词法分析器语法分析器实验报告_第4页
编译原理词法分析器语法分析器实验报告_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、v1.0可编辑可修改江冢大学编译技术班级网络0802学号52姓名叶晨舟指导老师朱玉全2011年7月4日、目的编译技术是理论与实践并重的课程,而其实验课要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。二、任务及要求基本要求:1 .词法分析器产生下述小语言的单词序列这个小语言的所有的单词符号,以及它们的种别编码和内部值如下表:单词符号种别编码助记符内码值DIM1$DIM-IF2$IF-DO3$DO-STOP4$STOP-EN

2、D5$END-标识符6$ID-常数(整)7$INT内部字符串=8$ASSIGN标准二进形式+9$PLUS-*10$STAR-*11$POWER-12$COMMA-(13$LPAR-)14$RPAR-对于这个小语言,有几点重要的限制:首先,所有的关键字(如IF、WHILE等)都是“保留字”。所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。例如,下面的写法是绝对禁止的:IF(5)=x其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。也就是说,对于关键字不专设对应的转换图。但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。当转换图识别出一个标识符时,就

3、去查对这张表,确定它是否为一个关键字。再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。例如,一个条件语句应写为IFi>0i=1;而绝对不要写成IFi>0i=1;因为对于后者,我们的分析器将无条件地将IFI看成一个标识符。这个小语言的单词符号的状态转换图,如下图:2 .语法分析器能识别由加+减-乘*除/乘方八括号()操作数所组成的算术表达式,其文法如下:E-E+T|E-T|TT一T*F|T/F|FF-PAF|PpfE)|i使用的算法可以是:预测分析法;递归下降分析法;算符优先分析法;LR分析法等。3

4、.中间代码生成器产生上述算术表达式的中间代码(四元式序列)三、实现过程给出各题目的详细算法描述,数据结构和函数说明,流程图1、词法分析器的流程图开始24路径是否有、效)输入源文件路径是.结束将字符加入字符数组 Word口跳过该字符将字符加入字符数组 Word口将字符加 入字符数 组 Word口指向下一字符指向下一字符将字符 加入字 符数组 Word口将字符 加入字 符数组 Word口是是字母惑数字指向下一字符识别指针内容输出word为界符I输出Word内容为不 可识别回退将word与关键字表key进行匹酉己否输出word为普通标示符否配? > 一是输出word 为常数指向下一字符4是空格

5、空白或换、.空'行/二二一否*,是字母吗:否_;是数字吗:一否f是界符吗>一否%J输出word为关键字2、语法分析器主程序图3、中间代码生成器流程图:入口归的展仪3YN,南四、源程序词法分析器#include<>#include<>#include<iostream>usingnamespacestd;typedefstructtable,S1)=0|strcmp(Mpq.m,S2)=0);printf("%15c->%sn",X,str0);getchar();opt3:printf("请输入要分析的字符串

6、,且以#结束:n");analyse(Vn,Vt);printf("*请选择*n");printf("1:输入字符串n");printf("2:输入新分析表n");printf("0:退出n");printf("*n");opt4:cin>>select;switch(select)case'1':gotoopt3;break;case'2':gotoopt2;case'0':break;default:printf(&quo

7、t;输入错误!请重新选择:");gotoopt4;break;return0;运行结果:whilewhileswitchswitch种别编刊内码值助记符单闵符号 uhl le语法分析器源程序:#include<>#include<iostream>usingnamespacestd;charprog100,token10;charch;intsyn,p,m=0,n,row,sum=0;char*rwtab20="dim","if","do","stop","end&quo

8、t;,"and","begin","bool","case","char","false","for","int","not","or","set","then","true","until","while"voidscaner()for(n=0;n<9;n+)tokenn=NULL;ch=p

9、rogp+;while(ch='')ch=progp;p+;if(ch>='a'&&ch<='z')|(ch>='A'&&ch<=Z)m=0;while(ch>='0'&&ch<='9')|(ch>='a'&&ch<='z')|(ch>='A'&&ch<=Z)tokenm+=ch;ch=progp+;tokenm+

10、='0'p-;syn=21;for(n=0;n<20;n+)if(strcmp(token,rwtabn)=0)syn=n+1;break;elseif(ch>='0'&&ch<='9')sum=0;while(ch>='0'&&ch<='9')sum=sum*10+ch-'0'ch=progp+;P-;syn=7+15;if(sum>32767)syn=-1;elseswitch(ch)case'=':syn=8+

11、15;token0=ch;break;case'+':syn=9+15;token0=ch;break;case'*':m=0;tokenm+=ch;ch=progp+;if(ch='*')(syn=11+15;tokenm+=ch;else(syn=10+15;P-;break;case',':syn=12+15;token0=ch;break;case'(':syn=13+15;token0=ch;break;case')':syn=14+15;token0=ch;break;case'

12、#':syn=0;token0=ch;break;case'<':m=0;tokenm+=ch;ch=progp+;if(ch='>')(syn=17+15;tokenm+=ch;elseif(ch='=')(syn=16+15;tokenm+=ch;)else(syn=15+15;P-;)break;case'>':m=0;tokenm+=ch;ch=progp+;if(ch='=')(syn=19+15;tokenm+=ch;)else(syn=18+15;P-;)break;case

13、':':m=0;tokenm+=ch;ch=progp+;if(ch='=')syn=21+15;tokenm+=ch;elsesyn=20+15;P-;break;case'/':syn=22+15;token0=ch;break;case'-':syn=23+15;token0=ch;break;case'':syn=24+15;token0=ch;break;default:syn=-1;break;voidmain()P=0;row=1;cout<<endl<<endl<<

14、;endl;cout<<"*小型词法分析器*I'<<endl<<endl;cout<<"请输入一段程序(以#结束):”;do(ch);progp+=ch;)while(ch!='#');p=0;词法分析结果如下cout<<endl<<"*"<<endl;cout<<"*种别编码自身值"<<endl;doscaner();switch(syn)case22:cout<<"("

15、<<syn<<","<<sum<<")"<<endl;break;case-1:cout<<"Errorinrow"<<row<<"!"<<endl;break;default:cout<<"("<<syn<<","<<token<<")"<<endl;break;)while(

16、syn!=0);)运行结果:,;X|A你要定上的女曲的产生式的!物不>E>T>T>T>F-中间代码生成器源程序:表达式生成四元式递归子程序法#include<string>#include<iostream>usingnamespacestd;#defineDEFAULT_SIZE100charEMachine(charw);<<endl;exit(1);voidstack:push(conststring&item)<<endl;<<endl;<<endl;/符号栈/静态四元式个数记

17、录/静态状态个数记录/ 主函数/进行一个循环操作控制"<<endl;return;top+;stackatop=item;stringstack:pop(void)exit;stringitem=stackatop;top-;returnitem;stringstack:gettop(void)constexit;returnstackatop;staticstackwordStack;staticintnoOfQuet=0;staticintnoOfT=1;voidmain()charyesOrNo;docout<<"请输入算术表达式:noOfT=

18、1;/每次结束询问ZMachine();cout<<endl<<"ContinueYesorNot:"cin>>yesOrNo;while(yesOrNo='y');boolZMachine()charw;cin>>w;w=EMachine(w);if(w='#')returntrue;elsereturnfalse;charEMachine(charw)stringoperate,a,b,c;stringstate5;w=TMachine(w);while(w='+'|w=&#

19、39;-')operate=w;cin>>w;w=TMachine(w);/输入“Y”则继续否则程序结束/Z自动机/调用E自动机/遇到“#"则结束/E自动机/调用T自动机/是加或减符号/读入下一字符/调用T自动机b二();a=();/字符栈弹出两个操作字符cout<<"(""<<operate<<"","<<a<<","<<b<<",t"<<noOfT<<&q

20、uot;)"<<endl;c = "t"+intToString(noOfT); /输出四元式(c);/ 新状态压栈/状态计数加一noOfT+;returnw;charTMachine(charw)stringoperate,a,b,c;stringstate5;w=FMachine(w);while(w='*'|w=7')operate=w;cin>>w;w=FMachine(w);b=();/a=();/调用F自动机/是乘除号/读取下一字符/调用F自动机符号栈弹出两个操作字符cout<<"(""<<operate<<"","<<a<<","<<b<<",t"<<noOfT<<")"<<endl;c="t"+intToString(noOfT);/输出四元式(c);/新状态压栈noOfT+;/状态计数加1returnw;charFMachine(charw)/F自动机stringtheWord;if(w>=&

温馨提示

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

评论

0/150

提交评论