中间代码生成程序(三地址)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
s3=symbol2.top(); symbol2.pop(); symbol2.push(k+48);
cout<<"t"<<k<<"="<<(v=(isdigit(s3))?'t':' ')<<s3<<s2;cout<<(v=(isdigit(s1))?'t':' ')<<s1<<endl;
k++;
{
how=sym[i][j];
num=snum[i][j];
if(how=='r')
{
switch(num)
{
case 1:
A='E',b=3;
cout<<"按E->E1+T规约"<<endl;
s1=symbol2.top(); symbol2.pop(); s2=symbol2.top(); symbol2.pop();
void error(int i,int j,char *&a)//error显示函数
{
cout<<"error"<<endl;
switch(j)
{
case 1://期望输入id或左括号,但是碰到+,*,或$,就假设已经输入id了,转到状态5
//state.push(5);
//symbol.push('i');//必须有这个,如果假设输入id的话,符号栈里必须有....
#include<iostream>
#include<stack>
#include<ctype.h>
using namespace std;
stack<int> state;
stack<char> symbol;
//stack<int> val;
stack<char> symbol2;
char sen[50];
//case 6:
// a++;
}
}
int main()
{
int s;
char *a;
char how;
int num;
int b;
char A;
int k=1;
char q;
while(1)
{
cin>>sen;
a=sen;
state.push(0);//先输入0状态
while(*a!='\0')
{
{'r','r','r','r','r','r'}
};
char snum[12][6]={//数字表
{5,1,1,4,2,1},
{3,6,5,3,2,0},
{2,2,7,2,2,2},
{4,4,4,4,4,4},
{5,1,1,4,2,1},
{6,6,6,6,6,6},
{5,1,1,4,2,1},
{5,1,1,4,2,1},
{3,6,5,3,11,4},
{1,1,7,1,1,1},
{3,3,3,3,3,3},
{5,5,5,5,5,5}
};
int go2[12][3]={//goto表
{1,2,3},
{0,0,0},
{0,0,0},
{0,0,0},
{8,2,3},
{0,0,0},
{0,9,3},
{0,0,10},
{0,0,0},
break;
}
}
}
}
int go(int t,char A)//goto[t,A]
{
switch(A)
{
case 'E':
return go2[t][0];break;
case 'T':
return go2[t][1];break;
case 'F':
return go2[t][2];break;
}
}
{
case 'i':
//case 'd':
j=0;break;
case '+':
j=1;break;
case '*':
j=2;break;
case '(':
j=3;break;
case ')':
j=4;break;
case '#':
j=5;break;
default:
j=-1;break;
}
if(j!=-1)
s3=symbol2.top(); symbol2.pop(); symbol2.push(k+48);
cout<<"t"<<k<<"="<<(v=(isdigit(s3))?'t':' ')<<s3<<s2;cout<<(v=(isdigit(s1))?'t':' ')<<s1<<endl;
k++;
}
b=0;num=0;how='\0';A='\0';
s=state.top();
q=*a;
if(isalpha(*a))
{
*a='i';
}
action(s,a,how,num,A,b,k);
if(how=='s')//移进
{
cout<<"移进"<<endl;
symbol.push(*a);
state.push(num);
{'r','r','r','r','r','r'},
{'s','e','e','s','e','e'},
{'s','e','e','s','e','e'},
{'e','s','e','e','s','e'},
{'r'Leabharlann Baidu'r','s','r','r','r'},
{'r','r','r','r','r','r'},
break;
case 4:
A='T',b=1;
cout<<"按T->F规约"<<endl;
break;
case 5:
A='F',b=3;
cout<<"按F->(E)规约"<<endl;
break;
case 6:
A='F',b=1;
cout<<"按F->id规约"<<endl;
break;
default:
symbol.push(A);
state.push(go(t,A));
}
else if(how=='a')//接受
{
cout<<"成功接受"<<endl;
break;
}
else
{
error(s,num,a);//错误显示
cout<<"输入有误,重新输入!"<<endl;
break;
}
}
}
return 0;
cout<<"缺少运算对象digit"<<endl;
break;
case 2://从输入中删除右括号
//a++;
cout<<"不配对的右括号"<<endl;
break;
case 3://期望碰到+,但是输入id或左括号,假设已经输入算符+,转到状态6
//state.push(6);
//symbol.push('+');
if (q!='('&&q!=')')
{
symbol2.push(q);
}
a++;
}
else if(how=='r')//规约
{
for(int i=0;i<b;i++)
{
if(!state.empty())
state.pop();
if(!symbol.empty())
symbol.pop();
}
int t=state.top();
break;
case 2:
A='E',b=1;
cout<<"按E->T规约"<<endl;
break;
case 3:
A='T',b=3;
cout<<"按T->T1*F规约"<<endl;
s1=symbol2.top(); symbol2.pop(); s2=symbol2.top(); symbol2.pop();
char sym[12][6]={//符号表
{'s','e','e','s','e','e'},
{'e','s','e','e','e','a'},
{'r','r','s','r','r','r'},
{'r','r','r','r','r','r'},
{'s','e','e','s','e','e'},
{0,0,0},
{0,0,0},
{0,0,0}
};
void action(int i,char *&a,char &how,int &num,char &A,int &b,int &k)//action函数[i,a]
{
int j;//,r;
char s1,s2,s3;
char v;
switch(*a)
cout<<"缺少运算符"<<endl;
break;
case 4://缺少右括号,假设已经输入右括号,转到状态11
//state.push(11);
//symbol.push(')');
cout<<"缺少右括号"<<endl;
break;
case 5:
//a++;
cout<<"*号无效,应该输入+号!"<<endl;
相关文档
最新文档