




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
(二)DO-WHILE循环语句的翻译程序设计(简单优先法、输出四元式)一、1.简单优先法的基本思想根据优先关系的定义,将简单优先文法中各文法符号之间的这种关系用一个矩阵表示,称作简单优先矩阵。PDA读入一个单词后,比较栈顶符号和该单词的优先级,若栈顶符号优先级低于该单词,继续读入;若栈顶符号优先级高于或等于读入符号,则找句柄进行归约,找不到句柄就继续读入。直到最后栈内只剩下开始符号,输入串读到“”为止。此时识别正确。可分点描述如下:(1)、对句型中相邻的文法符号规定优先关系,以寻找句型中的句柄;(2)、规定句柄内各相邻符号之间具有相同的优先级;(3)、规定句柄两端符号优先级要比位于句柄之外而又和句柄相邻的符号的优先级高,以先归约句柄;(4)、对于文法中所有符号,只要它们可能在某个句型中相邻,就要为它们规定相应的优先关系,若某两个符号永远不可能相邻,则它们之间就无关系.2.简单优先矩阵用于表示文法符号之间的简单优先关系的矩阵。3.简单优先法的优缺点优点:技术简单,当做简单优先矩阵是要求较短。缺点:适用范围小,分析表尺寸太大。二、源代码实现:#include#define MAX 35#include#include#includeusing namespace std;#defineTABLE_LEN8#defineSTR_LEN256int zhlen;char sTableTABLE_LEN+1 = +-*/()i#;/顺序索引int ShipTableTABLE_LENTABLE_LEN = /优先表 1, 1,-1,-1,-1, 1,-1, 1, 1, 1,-1,-1,-1, 1,-1, 1, 1, 1, 1, 1,-1, 1,-1, 1, 1, 1, 1, 1,-1, 1,-1, 1,-1,-1,-1,-1,-1, 0,-1,-2, 1, 1, 1, 1,-2, 1,-2, 1, 1, 1, 1, 1,-2, 1,-2, 1,-1,-1,-1,-1,-1,-2,-1, 0;char X,a;char VN11=K,L,P,S,E,G,T,R,F,Q,0;char VT15=i,=,+,-,*,/,(,),d,w,;,#,0;char p186=dLwS0,SP0,;SP0,0,iQE0,TG0,+TG0,-TG0,0,FR0,*FR0,/FR0,0,(E)0,i0,=0,0;char stackMAX;char queueMAX;int sp,front;intM1014= -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,2,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5,-1,-1,-1,-1,-1,-1,-1,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,6,7,-1,-1,-1,-1,-1,8,8,8,9,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,12,12,10,11,-1,-1,-1,12,12,12,14,-1,-1,-1,-1,-1,-1,-1,13,-1,-1,-1,-1,-1,-1,15,16,17,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,;int f=0; int count=0;int c=0;char arr_iMAX;char varMAX; /表格管理int tdMAX; int t=0;int opd=-1;int opr=-1;int id=0;int d=0;char arrMAX4;/存放待输出的四元式/char keyword27=do0,while0;bool IsCharInStr(char c,char s)for(int i=0;si!=0;i+)if(si=c)return true;return false;int GetIndex(char s,char c)for(int i=0;si!=0;i+)if(c=si)return i;return -1;/string GetSubString(char s,int from,int to)string st;for(int i=from;ito;i+)st+=si;return st;/* 翻译赋值表达式*/void translatefuzhi(char *sInput)/栈结构的初始化char StackSTR_LEN=0;int index = 0;int top = 1;Stack0 = #;list rPolish;list Num;int begin=0;while(sInputbegin!=)if(IsCharInStr(sInputbegin,sTable)coutEqual expression is illegal!1)temp0 = i;temp1 = sInputnow;Num.push_back(GetSubString(sInput,before+1,now);elsetemp0 = sInputnow;int i=0;while(tempi!=0)int left = GetIndex(sTable,Stackindex);int right = GetIndex(sTable,tempi);switch(ShipTableleftright)case -1:/移入Stacktop+ = tempi;index = top-1;i+;break;case 0:/脱括号if(Stackindex=()Stacktop+ = );Stackindex = E;top = index+1;index-;else/规约if(top!=2)return;rPolish.push_back(=);list:iterator iter;list:iterator siter=Num.begin();string fuzhi256;int d=0,m;for(iter=rPolish.begin();iter!=rPolish.end();iter+)if(*iter=i)fuzhid+=*siter;siter+;elsefuzhid+=*iter;m=d;string op1,op2;int flag,xiabiao=0;for(d=0;dm;d+)cout(fuzhid,op1,op2,Txiabiao)endl;fuzhid = T;fuzhid+=(xiabiao+0);xiabiao+;/coutfuzhid;return;i+;break;case 1:/归约if(Stackindex=i)rPolish.push_back(i);Stackindex = E;index-;elserPolish.push_back(Stackindex);Stackindex-1 = E;top = index;index-=2;break; default:return;before=now;now+;int len(char str)int i=0;while(stri!=0)i+;return i;int index(char ch,char str)int i=0;while(stri!=0)if(ch!=stri)i+;else break;if(stri=0)return -1;return i;void err(int n)if(n=1)cout字符不匹配endl;else if(n=2)cout字符没有出现在产生式中endl;else if(n=3)cout没有找到合适的选产式endl;else cout该句子是文法语言的句子endl;void print()cout(;if(count10)cout0;coutcount);int i;for(i=0;i=sp;i+)coutstacki;for(;i=20;i+)cout ;for(i=0;ifront;i+)cout ;for(;queuei!=#;i+)coutqueuei;coutqueuei;for(;i=20;i+)cout ;void semantic()if(VTopr=)arrd0=;arrd1=arr_iopd;arrd2=id;arrd3=-;id+;else if(opr=-2)arrd0=;arrd1=id-1;arrd2=arr_iopd;arrd3=-;else arrd0=VTopr;arrd1=arr_iopd;arrd2=id;if(VTopr!=)arrd3=id-1;else arrd3=id+1;id+;d+;void syntax()/语法分析int n;count+;print();X=stacksp;a=queuefront;if(X=#&a=#)f=4;if(XZ)if(X=a)sp-;front+;if(a!=i)if(a!=d&a!=w&a!=;&a!=#)opr=index(a,VT);semantic();else if(a=;|a=w|a=#)opr=-2;semantic();coutta匹配endl;else opd=c;couttarr_ic+匹配endl;else f=1; else int tx=index(X,VN);int ta=index(a,VT);n=Mtxta;tdt+=Mtxta;if(ta=-1)f=2;coutaendl; else if(n=-1)f=3; else sp-;couttX;if(len(pn)!=0)for(int i=len(pn)-1;i=0;i-)stack+sp=pni;coutpnlen(pn)-1-i;coutendl;else cout空串endl;if(f=0)syntax();else tdt=-1;err(f);void lexical() /词法分析int i,j,d;char ch;j=d=0;for(i=0;vari!=#;i+)ch=vari;if(ch=d&vari+1=o)coutdotkewordendl;queuej+=d;i+=1;else if(ch=w)ch=vari+1;if(ch=h)ch=vari+2;if(ch=i)ch=vari+3;if(ch=l)ch=vari+4;if(ch=e)ch=vari+5;coutwhiletkeywordendl;queuej+=w;i+=4;else if(index(ch,VT)=0)if(ch!=&ch!=&ch!=(&ch!=)coutchtvariable:id+endl;arr_id-1=ch;queuej+=i;else coutchtbound0)coutchtoperatorendl;queuej+=ch;queuej=#;for(i=0;queuei!=#;i+)coutqueuei;coutendl;int main()int i=0,j=0;int len,length;char temp;char S=K;sp=front=0;stack0=#;sp+;stack1=K;cout *endl;cout * DO-WHILE循环语句 *endl;cout * (简单优先法输出四元式) *endl;cout *endl;ifstream table;table.open(dowhile.txt);if(!table)couterror!;table.seekg(0,ios:end);length = table.tellg();table.seekg(0,ios:beg);while(length!=table.tellg()table.read(char*)&temp,1);vari=temp;i+;if(vari= )i-;if(vari=#)break;table.close();len=i;vari=0;cout词法分析endl;lexical();char fuzhi20;int flag1,fuzhilen;int s=0;for(i=0;ilen;i+)if(vari=;)flag1=i;fuzhilen=flag1-2;for(i=3;iflag1;i+)fuzhis+=vari;fuzhis=#;char shuru;char zh100;int kaishi=0;zh0=d;for(kaishi=1;kaishis+1;kaishi+)zhkaishi=fuzhikaishi-1;zhkaishi+=;zhkaishi+=W;for(i=flag1+8;ilen;i+)if(vari=)break;else zhkaishi+=vari;zhkaishi+=#;zhlen=kaishi; cout输出四元式endl;coutdoendl;translatefuzhi(fuzhi);cout(varflag1+9,varflag1+8,varflag1+10,T2)endl;coutif T2=true goto T0endl;return 0;三、测试结果:词法分析部分:输出四元式:四、课程小结:这次编译原理课程设计的题目是用简单优先分析法进行DO-WHILE循环语句的语法分析,并输出四元式.设计的特点是利用定义每个终极符和非终极符之间优先关系,来进行符号的移进与规约,如
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公寓合同转让协议书模板
- 多人旅游住民宿合同范本
- 合同人工费调整补充协议
- 2025年充电桩技术面试题及答案详解
- 劳动合同员工廉洁协议书
- 2025婚前财产协议书
- 亲属房产买断协议书范本
- pe管焊接作业合同范本
- 危货车转让租赁合同范本
- 三大运营商协议合同模板
- 设备采购 投标方案(技术方案)
- 数字经济与人工智能
- 晚期胃癌患者护理查房
- IATF16949质量相关知识专项考试试题及答案
- 妇产科腹腔镜手术相关护理综述课件
- 航空发电机市场需求分析报告
- 教科版(2017版)科学五年上册《机械摆钟》说课稿(附反思、板书)课件
- 公差配合课件
- 招标代理机构入围服务 投标方案(技术标)
- 新苏教版六年级上册《科学》全一册全部课件(含19课时)
- 部编版三年级语文上册全册表格式教案(教学设计)
评论
0/150
提交评论