ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:18.77KB ,
资源ID:7584623      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7584623.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(IFELSE条件语句的翻译程序设计简单优先法输出四元式.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

IFELSE条件语句的翻译程序设计简单优先法输出四元式.docx

1、IFELSE条件语句的翻译程序设计简单优先法输出四元式#include #include #include #include#include#include#include#includeusing namespace std;#define STACK_INIT_SIZE 50 #define STACKINCREMENT 30 #define OK 1 #define ERROR -1 #define FAILURE -1 /*(1)S-if E then B else B(2)E-(AA)(3)E-(A(A)(5)A-d(6)A-num(7)B-d=C(8)C-A+A(9)C-A-A(1

2、0)C-A*A(11)C-A/A(12)C-A*/int lineno = 1;char ch ; int anltable2222= /*S*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, /*if*/ 0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*E*/ 0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*then*/0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, /*B*/ 0,0,0,0,0,3,0,0,0,0

3、,0,0,0,0,0,0,0,0,0,0,0,2, /*else*/0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, /*(*/ 0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0, /*)*/ 0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*/ 0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0, /*/ 0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0, /*=*/ 0,0,0,0,0,0,0,0

4、,0,0,0,1,1,1,3,0,0,0,0,0,0,0, /*A*/ 0,0,0,0,0,0,0,3,3,3,0,0,0,0,0,0,2,3,3,3,3,0, /*d*/ 0,0,0,0,0,0,0,2,2,2,3,0,0,0,0,0,2,2,2,2,2,0, /*num*/ 0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,2,2,2,2,2,0, /*C*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0, /*/ 0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0, /*/ 0,0,0,0,0,2

5、,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, /*+*/ 0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0, /*_*/ 0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0, /*/ 0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0, /*/*/ 0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0, /*#*/ 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,;/0-error ,1=

6、,3=char allname3030;/单词全名char out3030;/保存单词简称int length;struct att/名字表类型 string sname; char select; char addre;att attname40;/名字表typedef struct SqStack char *base; char *top; int stacksize; SqStack;/栈定义void InitStack (SqStack &S) /栈初始化 S.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char);/分配存储空间 if(!S.

7、base) exit(OVERFLOW); /为栈S分配存储空间失败 S.top=S.base; S.stacksize=STACK_INIT_SIZE; int push(SqStack &S,char ch) / 将元素e插入到栈S中,成为新的栈顶元素 if(S.top-S.base S.stacksize) /判定栈是否满 S.base=(char*)realloc(S.base,(S.stacksize+STACKINCREMENT *sizeof(char); if(!S.base) printf(分配存储单元失败.n); /存储单元分配失败 exit(OVERFLOW); S.to

8、p=S.base+S.stacksize; /指明栈顶指针的基址 S.stacksize+=STACKINCREMENT; /指明栈的空间大小 / end of if *S.top+=ch; /先将e送入栈顶指针所指向的单元,再将栈顶指针加1 return(OK); /end of Push() subfunction int pop(SqStack &S,char &ch) /栈顶元素出栈 if(S.top=S.base) printf(溢出); return (ERROR); ch=*-S.top; return(OK); char gettop(SqStack S) /返回栈顶元素 if

9、(S.top=S.base) cout栈空,出错: return 8;break; case : return 9;break; case =: return 10;break; case A: return 11;break; case d: return 12;break; case n: return 13;break; case C: return 14;break; case : return 15;break; case : return 16;break; case +: return 17;break; case -: return 18;break; case *: retu

10、rn 19;break; case /: return 20;break; case #: return 21;break; default: return 88; int judge(char *string) /判断是否是关键字 char *keywords1000=if,then,else; for(int i = 0;i = 2;i+) if (!strcmp(string,*(keywords+i) return 1; return 0; int analysis(ifstream &fin,ofstream &fout) /词法分析程序,用引用传递参数 char temp10; /

11、 临时存放已读入但无法判断类型的字符 int j=0; int ou=0; int na=0; while (fin.get(ch) if (ch = n) lineno += 1; else if (ch = t|ch = ) /排除制表、空格字符 else if (isalpha(ch) /当前输入符为字母 while (isalpha(ch)|isdigit(ch) tempj = ch; j+; fin.get(ch); tempj = 0; /标志字符串结束 j = 0; if(judge(temp) / 判断是否为关键字 memcpy(allnamena,temp,10); att

12、namena.sname=allnamena; attnamena.select=allnamena0; memcpy(outou,temp,10);ou+; fout(attnamena.sname,关键字)endl; na+; else memcpy(allnamena,temp,10); attnamena.sname=allnamena; attnamena.select=d; memcpy(outou,temp,10);ou+; fout(attnamena.sname,变量)endl; na+; fin.seekg(-1,ios:cur); /回退1个字符 else if (isd

13、igit(ch) while (isdigit(ch) tempj = ch; j+; fin.get(ch); tempj = 0; /标志字符串结束 j = 0; memcpy(allnamena,temp,10); attnamena.sname=allnamena; attnamena.select=n; memcpy(outou,temp,10);ou+; fout(attnamena.sname,常量)endl; na+; fin.seekg(-1,ios:cur); /回退一个字符 else if (ch = =) allnamena0=ch; attnamena.sname=a

14、llnamena; attnamena.select=ch; memcpy(outou,=,10);ou+; fout(attnamena.sname,算符)endl; na+; else if (ch = +) allnamena0=ch; attnamena.sname=allnamena; attnamena.select=ch; memcpy(outou,+,10);ou+; fout(attnamena.sname,算符)endl; na+; else if (ch = -) allnamena0=ch; attnamena.sname=allnamena; attnamena.se

15、lect=ch; memcpy(outou,-,10);ou+; fout(attnamena.sname,算符)endl; na+; else if (ch = *) allnamena0=ch; attnamena.sname=allnamena; attnamena.select=ch; memcpy(outou,*,10);ou+; fout(attnamena.sname,算符)endl; na+; else if (ch = /) allnamena0=ch; attnamena.sname=allnamena; attnamena.select=ch; memcpy(outou,

16、/,10);ou+; fout(attnamena.sname,算符)endl; na+; else if (ch = () allnamena0=ch;attnamena.sname=allnamena;attnamena.select=ch;fout(attnamena.sname,界限符)endl;na+; else if (ch = ) allnamena0=ch;attnamena.sname=allnamena;attnamena.select=ch;fout(attnamena.sname,界限符)endl;na+; else if (ch = ) allnamena0=ch;a

17、ttnamena.sname=allnamena;attnamena.select=ch;fout(attnamena.sname,界限符)endl;na+; else if (ch = ) allnamena0=ch; attnamena.sname=allnamena; attnamena.select=ch; fout(attnamena.sname,界限符)endl; na+; else if (ch = ) allnamena0=ch; attnamena.sname=allnamena; attnamena.select=ch; memcpy(outou,10);ou+; fout

18、(attnamena.sname,逻辑运算符) allnamena0=ch; attnamena.sname=allnamena; attnamena.select=ch; memcpy(outou,10);ou+; fout(attnamena.sname,逻辑运算符)endl; na+; else if (ch = #) outou0=#;ou+; else fout无法识别字符 ch endl; return 0; ch = 0; attnamena.select=#; outou0=#;ou+; length=na; return 1;void printstack(SqStack &

19、S,int naa,int ty,ofstream &fout) char temp4020; for(int k=0;k40;k+) for(int t=0;t20;t+) tempkt=NULL; int te=0; int i=0,j=0; int nu=0; char *ku; ku=S.base; i=naa+1; char *contrl; contrl=S.base; while(contrl!=S.top) if(*contrl!=1) if(*contrl=i) foutif;nu=nu+2; else if(*contrl=t) foutthen;nu=nu+4; else

20、 if(*contrl=e) foutelse;nu=nu+4; else fout*contrl;nu+; contrl+; foutttt; for(i;i=length;i+) if(gettop(S)=S) fout#; else foutattnamei.select; if(gettop(S)=S) fout#; else fouttempte; te+; foutendl; int laynax(ofstream &f) SqStack S; InitStack(S); push(S,#); char cch,tempch; int naa=0,over=1,go; int fr

21、ont=0,last=0,choose=0; while(over) /getchar(); front=getnum(gettop(S); last=getnum(attnamenaa.select); go=naa; /coutfront lastendl; choose=anltablefrontlast; if(choose=1) push(S,1); push(S,attnamenaa.select); printstack(S,go,1,f); naa+; else if(choose=3) push(S,attnamenaa.select); printstack(S,go,1,

22、f); naa+; else if(choose=2) int a=0;l1: pop(S,cch); if(cch=1) if(tempch=i) push(S,S); printstack(S,go,3,f); over=0; else if(tempch=() push(S,E); printstack(S,naa-1,3,f); else if(tempch=d) front=getnum(gettop(S); last=getnum(A); choose=anltablefrontlast; if(choose=1)push(S,1); push(S,A); a=1; printst

23、ack(S,naa-1,3,f); /cout归约了Aendl; else if(tempch=n) front=getnum(gettop(S); last=getnum(A); choose=anltablefrontlast; if(choose=1)push(S,1); push(S,A); a=1; printstack(S,naa-1,3,f); /cout归约了Aendl; else if(tempch=) push(S,B); a=1; printstack(S,go-1,3,f); /cout归约了Bendl;naa+; else if(tempch=A) push(S,C); a=1; printstack(S,go-1,3,f);

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1