实验四 中间代码生成
一、
实验要求:
熟悉中间代码生成原理 二:实验内容:
中缀表达式:(a+2)*(b/c)+(d*e) 后缀表达式:a 2 + b c / * d e * + 定义:int a,b; char c; float d,e; 三、实验代码: #include
char name[10]; char type;//数据类型 }sem,*ptsem; ptsem* base; int utop;
}stack ;//语义信息栈
typedef struct{
int i=1; int j=0; int n=0; stack list;
char st[10],str1[10],*p; ptsem yylist=new sem[10]; void initlist()//初始化 {
list.base=new ptsem[100]; list.utop=0; }
void pop( ptsem &pt) {
pt=list.base[list.utop--]; return; }
void push(ptsem pt) {
list.base[++list.utop]=pt; return; }
void gencode(ptsem top,ptsem subtop,char w) {//生成四元式中间代码
ptsem pt=new sem;
if(top->type==subtop->type){}
else if(top->type=='i'&subtop->type=='c')//栈顶操作数不为实型 {
printf(\ char c=i+48;//产生临时变量数值,如t1,t2等 subtop->name[0]='t'; subtop->name[1]=c;
subtop->name[2]='\\0';//产生临时变量 subtop->type='i';//转换栈顶操作数类型为实型 i++; }
else if(top->type=='c'&subtop->type=='i')//栈顶操作数是实型 {
printf(\ char c=i+48; top->name[0]='t'; top->name[1]=c; top->name[2]='\\0';
top->type='i';//转换第2个栈顶操作数类型为实型 i++; }
else if(top->type=='i'&subtop->type=='r') {
printf(\ char c=i+48; top->name[0]='t'; top->name[1]=c; top->name[2]='\\0';
top->type='r';//转换第2个栈顶操作数类型为实型 i++; }
else if(top->type=='r'&subtop->type=='i') {
printf(\ char c=i+48; subtop->name[0]='t'; subtop->name[1]=c; subtop->name[2]='\\0';
subtop->type='r';//转换第2个栈顶操作数类型为实型 i++; }
else if(top->type=='c'&subtop->type=='r') {
printf(\ char c=i+48; top->name[0]='t'; top->name[1]=c; top->name[2]='\\0';
top->type='r';//转换第2个栈顶操作数类型为实型 i++; } {
printf(\ char c=i+48; subtop->name[0]='t'; subtop->name[1]=c; subtop->name[2]='\\0';
subtop->type='r';//转换第2个栈顶操作数类型为实型 i++; }
printf(\
//w表示运算符,subtop->name表示第1个操作数,top->name表示第2个操作数,i表示第i个
else if(top->type=='r'&subtop->type=='c')
临时变量
char c=i+48; {
while(*p>='a'&&*p<='z') st[j++]=*p++; st[j]='\\0'; j=0; int flag=0;
if(!strcmp(st,\ if(flag==1){strcpy(str1,st);return;} sem pp;
if(!strcmp(str1,\ {
strcpy(pp.name,st); pp.type='r';
pt->type=top->type; pt->name[0]='t'; pt->name[1]=c; pt->name[2]='\\0'; i++; push(pt); return; }
void identify()//判断变量及其数据类型
}
if(!strcmp(str1,\ {
strcpy(pp.name,st); pp.type='i'; }
if(!strcmp(str1,\ {
strcpy(pp.name,st); pp.type='c'; }
yylist[n++]=pp; }
void conid()//常量操作 {
ptsem pt=new sem; int flag=0,k=0; do {
pt->name[k++]=*p; if(*p++=='.')flag=1;
}while(*p>='0'&&*p<='9'||*p=='.'); pt->type=flag?'r':'i'; if(*p>'9'&&*p<'0')
{printf(\ exit(0); }
pt->name[k]='\\0'; push(pt); }
void varid()//变量操作 {
ptsem pt=new sem; int flag=0,k=0; do{
pt->name[k++]=*p++;
}while(*p>='a'&&*p<='z'||*p>='A'&&*p<='Z'); pt->name[k]='\\0'; for(int i=0;i if(!strcmp(pt->name,yylist[i].name)) {flag=1;pt->type=yylist[i].type;push(pt);} if(flag==0) } void main() { initlist(); printf(\ char str[100]; gets(str);//输入变量定义 p=str; while(*p!='\\0') { if(!(*p>='a'&&*p<='z'||*p>='A'&&*p<='Z'||*p==';'||*p==' '||*p==',')) {printf(\ switch(*p){ case',':p++;break; case ' ':p++;break; case';': p++;break; default: identify(); char strpds[100]; gets(strpds);//输入后缀式算术表达式 p=strpds; char ch=*p,a; ptsem top,subtop; while(*p!='\\0') { if(ch>='0'&&ch<='9')a='0'; else if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')a='1'; else if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='^')a='2'; else if(ch==';')break; else if(ch==' ')a='4'; }//switch }//while { } printf(\exit(0); else a='3'; switch(a){ case'0':conid();ch=*p;break;//常数 case'1':varid();ch=*p;break;//变量 case'2':pop(top);pop(subtop);gencode(top,subtop,ch);ch=*++p;break;//运算符 case'3':printf(\ case'4':ch=*++p;//空格 } } if(*p!='\\0') } printf(\ 四、实验结果: 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库实验四 中间代码生成在线全文阅读。
相关推荐: