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

下载本文档

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

文档简介

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

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

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

4、法;递归下降分析法;算符优先分析法; LR分析法等。3中间代码生成器 产生上述算术表达式的中间代码(四元式序列)三、实现过程给出各题目的详细算法描述,数据结构和函数说明,流程图1、词法分析器的流程图2、语法分析器主程序图3、中间代码生成器流程图:入口归釣REDUCE(SYN)执行语文动作丸LLread(v) 4读单词查 CSYN(tap)PUSERwOX errXiT.n四、源程序词法分析器#in clude<>#in clude<>v匚:wmDO口 X#include<iostream> using namespace std;typedef struct

5、 table ,S1)=0|strcmp(Mpq.m,S2)=0) ; printf("%15c->%sn",X,str0);getchar();opt3:printf(" 请输入要分析的字符串,且以 # 结束 :n");analyse(Vn, Vt);printf(请选择*n");printf("1printf("2printf("0输入字符串 n"); 输入新分析表 n"); 退 出 n");printf(H*n");opt4:cin>>select;s

6、witch(select)case '1': goto opt3;break;case '2': goto opt2;case '0': break;default: printf(" 输入错误 ! 请重新选择 :");goto opt4; break; return 0;运行结果:uh liee Ise switclicase1234£8while i£ e Lse switchcase3 4 5 12单词符号uhi le种别晶1戲记帶 uhxle& 7M 19Tflfli£ 常数

7、77;23ir.语法分析器源程序:#in clude<>#in clude<iostream>using n amespace std;char prog100,toke n10;char ch;int syn, p,m=0,n ,row,sum=0;char*rwtab20="dim","if","do","stop","end" ,"and","begin","bool","case",&

8、quot;char","false","for","i nt"," not","or","set","the n","true","u ntil","while"void sca ner()for(n=0; n<9;n+) toke nn =NULL;ch=progp+;while(ch='')ch=progp; p+;if(ch>='a'&a

9、mp;&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+='0'p-;syn=21;for(n=0;n<20;n

10、+) if(strcmp(token,rwtabn)=0) syn=n+1;break;else if(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;else switch(ch) case'=':syn=8+15;token0=ch;break;case'+

11、9;: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'#':syn=0;token0=ch;break

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

13、rogp+; 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;void main()p=0;row=1;cout<<endl<<endl<<endl;cout<<"

14、小型词法分析<<endl<<endl;cout<<" 请输入一段程序(以 #结束)do(ch);progp+=ch;while(ch!='#');p=0;cout<<endl<<"*词法分析结果如*"<<endl;cout<<"种别编码 自身值 "<<endl;doscaner();("<<sy n <<",Error in("<<sy *<",swit

15、ch(s yn)case 22 : cout<<" "<<sum<<")"<<e ndl; break;case -1: cout<< "row"<<row<<"!"<<e ndl; break;default:cout<<""<<toke n< <")"<<e ndl;break;while (syn!=0);>E>E&

16、gt;T>T>T>F尸S.T農紅创t肝F运行结果:d中间代码生成器源程序表达式生成四元式递归子程序法#in clude<stri ng>#in clude <iostream> using n amespace std;#define DEFAULT_SIZE 100char EMachine(char w); exit(1);void stack:push(const string &item) return;top+;stackatop=item;string stack:pop(void)exit(1) ;string item=stac

17、katop;top-;return item;string stack:gettop(void) const exit(1) ;return stackatop;static stack wordStack;static int noOfQuet=0;static int noOfT = 1;void main()char yesOrNo;docout<<" 请输入算术表达式: noOfT = 1;ZMachine();<<endl;<<endl;<<endl;<<endl;/ 符号栈/静态四元式个数记录/静态状态个数记录/

18、 主函数/进行一个循环操作控制"<<endl;/ 每次结束询问cout<<endl<<"Continue?Yes or Not:" cin>>yesOrNo; / while(yesOrNo='y'); / 输入“ Y”则继续否则程序结束bool ZMachine()/Z自动机char w;cin>>w;/ 调用 E 自动机/ 遇到“ #”则结束w = EMachine(w); if(w='#')return true;elsereturn false;char EMach

19、ine(char w) string operate,a,b,c; string state5; w = TMachine(w); while(w='+'|w='-') operate = w; cin>>w; w = TMachine(w); b = ();/a = ();/E/ 字符栈弹出 两个操作字符自动机调用 T 自动机 是加或减符号 读入下一字符调用 T 自动机cout<<"(""<<operate<<"","<<a<<&

20、quot;,"<<b<<",t"<<noOfT<<")"<<endl;c = "t"+intToString(noOfT);(c); / noOfT+;/新状态压栈/输出四元式状态计数加一return w;char TMachine(char w) string operate,a,b,c; string state5; w = FMachine(w); while(w='*'|w='/') operate = w; cin>&

21、gt;w;w = FMachine(w); b = ();/a = ();/ 调用 F 自动机/ 是乘除号/ 读取下一字符/ 调用 F 自动机 符号栈弹出 两个操作字符cout<<"(""<<operate<<"","<<a<<","<<b<<",t"<<noOfT<<")"<<endl; c = "t"+intToString(noOfT); /输出四元式(c); / 新状态压栈noOfT+; / 状态计数加 1return w;char FMachine(char w)/F 自动机string theWord;if(w>='a'&&w<='z'|w>=&

温馨提示

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

评论

0/150

提交评论