编译原理词法分析器语法分析器实验报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

编译技术班级网络0802学号52姓名叶晨舟指导老师朱玉全2011年7月4日一、目的编译技术是理论与实践并重的课程,而其实验课要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。二、任务及要求基本要求:1.词法分析器产生下述小语言的单词序列这个小语言的所有的单词符号,以及它们的种别编码和内部值如下表:单词符号种别编码助记符内码值DIMIFDOSTOPEND标识符常数(整)=+***,()1234567891011121314$DIM$IF$DO$STOP$END$ID$INT$ASSIGN$PLUS$STAR$POWER$COMMA$LPAR$RPAR------内部字符串标准二进形式------对于这个小语言,有几点重要的限制:首先,所有的关键字(如IF﹑WHILE等)都是“保留字”。所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。例如,下面的写法是绝对禁止的:IF(5)=x其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。也就是说,对于关键字不专设对应的转换图。但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。例如,一个条件语句应写为IFi0i=1;而绝对不要写成IFi0i=1;因为对于后者,我们的分析器将无条件地将IFI看成一个标识符。这个小语言的单词符号的状态转换图,如下图:2.语法分析器能识别由加+减-乘*除/乘方^括号()操作数所组成的算术表达式,其文法如下:E→E+T|E-T|TT→T*F|T/F|FF→P^F|Pp→(E)|i使用的算法可以是:预测分析法;递归下降分析法;算符优先分析法;LR分析法等。3.中间代码生成器产生上述算术表达式的中间代码(四元式序列)三、实现过程给出各题目的详细算法描述,数据结构和函数说明,流程图。1、词法分析器的流程图开始输入源文件路径路径是否有效是初始化文件指针否将字符加入字符数组Word[]是空格,空白或换行吗是字母吗是数字吗否否是界符吗否打开源文件跳过该字符是是文件结束?否将字符加入字符数组Word[]否将字符加入字符数组Word[]是指向下一字符识别指针内容指向下一字符是字母惑数字吗是将word与关键字表key进行匹配否匹配?是输出word为关键字输出word为普通标示符否将字符加入字符数组Word[]指向下一字符输出word为常数识别指针内容回退是数字吗是否输出word为界符指向下一字符结束是输出Word内容为不可识别将字符加入字符数组Word[]2、语法分析器主程序图3、中间代码生成器流程图:四、源程序词法分析器:#include#include#includeiostreamusingnamespacestd;typedefstructtable,S1)==0||strcmp(M[p][q].m,S2)==0);printf(%15c--%s\n,X,str0);;getchar();}}opt3:printf(请输入要分析的字符串,且以#结束:\n);analyse(Vn,Vt);printf(********************请选择***********************\n);printf(1:输入字符串\n);printf(2:输入新分析表\n);printf(0:退出\n);printf(*************************************************\n);opt4:cinselect;switch(select){case'1':{gotoopt3;break;}case'2':{gotoopt2;}case'0':{break;}default:{printf(输入错误!请重新选择:);gotoopt4;break;}}return0;}运行结果:语法分析器源程序:#include#includeiostreamusingnamespacestd;charprog[100],token[10];charch;intsyn,p,m=0,n,row,sum=0;char*rwtab[20]={dim,if,do,stop,end,and,begin,bool,case,char,false,for,int,not,or,set,then,true,until,while};voidscaner(){for(n=0;n9;n++)token[n]=NULL;ch=prog[p++];while(ch==''){ch=prog[p];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')){token[m++]=ch;ch=prog[p++];}token[m++]='\0';p--;syn=21;for(n=0;n20;n++){if(strcmp(token,rwtab[n])==0){syn=n+1;break;}}}elseif((ch='0'&&ch='9')){{sum=0;while((ch='0'&&ch='9')){sum=sum*10+ch-'0';ch=prog[p++];}}p--;syn=7+15;if(sum32767)syn=-1;}elseswitch(ch){case'=':syn=8+15;token[0]=ch;break;case'+':syn=9+15;token[0]=ch;break;case'*':m=0;token[m++]=ch;ch=prog[p++];if(ch=='*'){syn=11+15;token[m++]=ch;}else{syn=10+15;p--;}break;case',':syn=12+15;token[0]=ch;break;case'(':syn=13+15;token[0]=ch;break;case')':syn=14+15;token[0]=ch;break;case'#':syn=0;token[0]=ch;break;case'':m=0;token[m++]=ch;ch=prog[p++];if(ch==''){syn=17+15;token[m++]=ch;}elseif(ch=='='){syn=16+15;token[m++]=ch;}else{syn=15+15;p--;}break;case'':m=0;token[m++]=ch;ch=prog[p++];if(ch=='='){syn=19+15;token[m++]=ch;}else{syn=18+15;p--;}break;case':':m=0;token[m++]=ch;ch=prog[p++];if(ch=='='){syn=21+15;token[m++]=ch;}else{syn=20+15;p--;}break;case'/':syn=22+15;token[0]=ch;break;case'-':syn=23+15;token[0]=ch;break;case';':syn=24+15;token[0]=ch;break;default:syn=-1;break;}}voidmain(){p=0;row=1;coutendlendlendl;cout***************************小型词法分析器**********************************endlendl;cout请输入一段程序(以#结束):;do{(ch);prog[p++]=ch;}while(ch!='#');p=0;coutendl**************************词法分析结果如下*********************************endl;cout种别编码自身值endl;do{scaner();switch(syn){case22:cout(syn,sum)endl;break;case-1:coutErrorinrowrow!endl;break;default:cout(syn,token)endl;break;}}while(syn!=0);}运行结果:}中间代码生成器源程序:表达式生成四元式递归子程序法#includestring#includeiostreamusingnamespacestd;#defineDEFAULT_SIZE100charEMachine(charw);endl;exit(1);}}voidstack::push(conststring&item)endl;return;}top++;stacka[top]=item;}stringstack::pop(void)endl;exit(1);}stringitem=stacka[top];top--;returnitem;}stringstack::gettop(void)constendl;exit(1);}returnstacka[top];}staticstackwordStack;//符号栈staticintnoOfQuet=0;//静态四元式个数记录staticintnoOfT=1;//静态状态个数记录voidmain(){//主函数charyesOrNo;//进行一个循环操作控制do{cout请输入算术表达式:endl;noOfT=1;//每次结束询问ZMachine();coutendlContinue?YesorNot:;cinyesOrNo;//输入“Y”则继续}while(yesOrNo=='y');//否则程序结束}boolZMachine(){//Z自动机charw;cinw;w=EMachine(w);//调用E自动机if(w=='#'){//遇到“#”则结束returntrue;}else{returnfalse;}}charEMachine(charw){//E自动机stringoperate,a,b,c;stringstate[5];w=TMachine(w);//调用T自动机while(w=='+'||w=='-'){//是加或减符号operate=w;cinw;//读入下一字符w=TMachine(w);//调用T自动机b=();//字符栈弹出a=();//两个操作字符cout(\operate\,a,b,tnoOfT)endl;c=t+intToString(noOfT);//输出四元式(c);//新状态压栈noOfT++;//状态计数加一}returnw;}charTMachine(charw){stringoperate,a,b,c;stringstate[5];w=FMachine(w);//调用F自动机while(w=='*'||w=='/'){//是乘除号operate=w;cinw;//读取下一字符w=FMachine(w);//调用F自动机b=();//符号栈弹出a=();//两个操作字符cout(\operate\,a,b,tnoOfT)endl;c=t+intToString(noO

1 / 15
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功