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