DOWHILE循环语句的翻译程序设计简单优先法输出四元式_第1页
DOWHILE循环语句的翻译程序设计简单优先法输出四元式_第2页
DOWHILE循环语句的翻译程序设计简单优先法输出四元式_第3页
DOWHILE循环语句的翻译程序设计简单优先法输出四元式_第4页
DOWHILE循环语句的翻译程序设计简单优先法输出四元式_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

1、(二)DO-WHILE循环语句的翻译程序设计(简单优先法、输出四元式)一、1.简单优先法的基本思想根据优先关系的定义,将简单优先文法中各文法符号之间的这种关系用一个矩阵表示,称作简单优先矩阵。PDA读入一个单词后,比较栈顶符号和该单词的优先级,若栈顶符号优先级低于该单词,继续读入;若栈顶符号优先级高于或等于读入符号,则找句柄进行归约,找不到句柄就继续读入。直到最后栈内只剩下开始符号,输入串读到“”为止。此时识别正确。可分点描述如下:(1)、对句型中相邻的文法符号规定优先关系,以寻找句型中的句柄;(2)、规定句柄内各相邻符号之间具有相同的优先级;(3)、规定句柄两端符号优先级要比位于句柄之外而又

2、和句柄相邻的符号的优先级高,以先归约句柄;(4)、对于文法中所有符号,只要它们可能在某个句型中相邻,就要为它们规定相应的优先关系,若某两个符号永远不可能相邻,则它们之间就无关系.2.简单优先矩阵用于表示文法符号之间的简单优先关系的矩阵。3.简单优先法的优缺点优点:技术简单,当做简单优先矩阵是要求较短。缺点:适用范围小,分析表尺寸太大。二、源代码实现:#include<iostream>#define MAX 35#include<list>#include<string>#include<fstream>using namespace std;#

3、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,-

4、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','=','<','>','+','-','*','/','(',

5、9;)','d','w','','#','0'char p186="dLwS0","SP0","SP0","0","iQE0","TG0","+TG0","-TG0","0","FR0","*FR0","/FR0","0","(E)0&quo

6、t;,"i0","=0","<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,-

7、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; in

8、t 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;/str

9、ing GetSubString(char s,int from,int to)string st;for(int i=from;i<to;i+)st+=si;return st;/* 翻译赋值表达式*/void translatefuzhi(char *sInput)/栈结构的初始化char StackSTR_LEN=0;int index = 0;int top = 1;Stack0 = '#'list<char> rPolish;list<string> Num;int begin=0;while(sInputbegin!='=

10、9;)if(IsCharInStr(sInputbegin,sTable)cout<<"Equal expression is illegal!"<<endl;return ;begin+;Num.push_back(GetSubString(sInput,0,begin);int now = begin+1;int before = begin;rPolish.push_back('i');while(sInputnow!='0')if(IsCharInStr(sInputnow,sTable)char temp3=

11、0;if(now-before>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+;bre

12、ak;case 0:/脱括号if(Stackindex='(')Stacktop+ = ')'Stackindex = 'E'top = index+1;index-;else/规约if(top!=2)return;rPolish.push_back('=');list<char>:iterator iter;list<string>:iterator siter=Num.begin();string fuzhi256;int d=0,m;for(iter=rPolish.begin();iter!=rPo

13、lish.end();iter+)if(*iter='i')fuzhid+=*siter;siter+;elsefuzhid+=*iter;m=d;string op1,op2;int flag,xiabiao=0;for(d=0;d<m;d+)cout<<"("<<fuzhid<<","<<op1<<","<<op2<<","<<"T"<<xiabiao<&l

14、t;")"<<endl;fuzhid = "T"fuzhid+=(xiabiao+'0');xiabiao+;/cout<<fuzhid;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

15、-=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

16、=2)cout<<"字符没有出现在产生式中"<<endl;else if(n=3)cout<<"没有找到合适的¨选产式"<<endl;else cout<<"该句子是文法语言的句子"<<endl;void print()cout<<"("if(count<10)cout<<'0'cout<<count<<")"int i;for(i=0;i<

17、;=sp;i+)cout<<stacki;for(;i<=20;i+)cout<<" "for(i=0;i<front;i+)cout<<" "for(;queuei!='#'i+)cout<<queuei;cout<<queuei;for(;i<=20;i+)cout<<" "void semantic()if(VTopr='=')arrd0='='arrd1=arr_iopd;arrd2=id;

18、arrd3='-'id+;else if(opr=-2)arrd0='='arrd1=id-1;arrd2=arr_iopd;arrd3='-'else arrd0=VTopr;arrd1=arr_iopd;arrd2=id;if(VTopr!='<'&&VTopr!='>')arrd3=id-1;else arrd3=id+1;id+;d+;void syntax()/语法分析int n;count+;print();X=stacksp;a=queuefront;if(X='#

19、'&&a='#')f=4;if(X<'A'|X>'Z')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();cout<<

20、;'t'<<'''<<a<<"'匹配"<<endl;else opd=c;cout<<'t'<<'''<<arr_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;cout<<a<&l

21、t;endl; else if(n=-1)f=3; else sp-;cout<<'t'<<X<<"->"if(len(pn)!=0)for(int i=len(pn)-1;i>=0;i-)stack+sp=pni;cout<<pnlen(pn)-1-i;cout<<endl;else cout<<"空串"<<endl;if(f=0)syntax();else tdt='-1'err(f);void lexical() /词法分

22、析int i,j,d;char ch;j=d=0;for(i=0;vari!='#'i+)ch=vari;if(ch='d'&&vari+1='o')cout<<"do"<<'t'<<"keword"<<endl;queuej+='d'i+=1;else if(ch='w')ch=vari+1;if(ch='h')ch=vari+2;if(ch='i')ch=var

23、i+3;if(ch='l')ch=vari+4;if(ch='e')ch=vari+5;cout<<"while"<<'t'<<"keyword"<<endl;queuej+='w'i+=4;else if(index(ch,VT)<=0)if(ch!=''&&ch!=''&&ch!='('&&ch!=')')cout<&

24、lt;ch<<'t'<<"variable:i"<<d+<<""<<endl;arr_id-1=ch;queuej+='i'else cout<<ch<<'t'<<"bound"<<endl;else if(index(ch,VT)>0)cout<<ch<<'t'<<"operator"<<e

25、ndl;queuej+=ch;queuej='#'for(i=0;queuei!='#'i+)cout<<queuei;cout<<endl;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循环语句 *"<&

26、lt;endl;cout<<" * (简单优先法输出四元式) *"<<endl;cout<<" *"<<endl;ifstream table;table.open("dowhile.txt");if(!table)cout<<"error!"table.seekg(0,ios:end);length = table.tellg();table.seekg(0,ios:beg);while(length!=table.tellg()table.read(c

27、har*)&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;i<len;i+)if(vari='')flag1=i;fuzhilen=flag1-2;for(i=3;i<flag1;i+)fuzhis+=vari;fuzhis='#'char shuru;char zh100;int kaishi=0;zh0='d'for(kaishi=1;kaishi<s+1;kaishi+)zhkaishi=fuzhikaishi-1;zhkaishi+=&

温馨提示

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

评论

0/150

提交评论