中间代码生成程序(三地址)Word格式.docx
《中间代码生成程序(三地址)Word格式.docx》由会员分享,可在线阅读,更多相关《中间代码生成程序(三地址)Word格式.docx(6页珍藏版)》请在冰豆网上搜索。
![中间代码生成程序(三地址)Word格式.docx](https://file1.bdocx.com/fileroot1/2022-10/19/10ff297a-3804-4218-8db4-959e14267e4b/10ff297a-3804-4218-8db4-959e14267e4b1.gif)
charsnum[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},
{6,6,6,6,6,6},
{3,6,5,3,11,4},
{1,1,7,1,1,1},
{3,3,3,3,3,3},
{5,5,5,5,5,5}
intgo2[12][3]={//goto表
{1,2,3},
{0,0,0},
{8,2,3},
{0,9,3},
{0,0,10},
{0,0,0}
voidaction(inti,char*&
a,char&
how,int&
num,char&
A,int&
b,int&
k)//action函数[i,a]
{
intj;
//,r;
chars1,s2,s3;
charv;
switch(*a)
{
case'
i'
:
//case'
d'
j=0;
break;
+'
j=1;
*'
j=2;
('
j=3;
)'
j=4;
#'
j=5;
default:
j=-1;
}
if(j!
=-1)
{
how=sym[i][j];
num=snum[i][j];
if(how=='
)
{
switch(num)
{
case1:
A='
E'
b=3;
cout<
<
"
按E->
E1+T规约"
endl;
s1=symbol2.top();
symbol2.pop();
s2=symbol2.top();
s3=symbol2.top();
symbol2.push(k+48);
cout<
t"
k<
="
(v=(isdigit(s3))?
'
t'
'
)<
s3<
s2;
cout<
(v=(isdigit(s1))?
s1<
k++;
break;
case2:
b=1;
T规约"
case3:
T'
按T->
T1*F规约"
s1=symbol2.top();
case4:
F规约"
case5:
F'
按F->
(E)规约"
case6:
id规约"
default:
}
}
}
intgo(intt,charA)//goto[t,A]
switch(A)
case'
returngo2[t][0];
returngo2[t][1];
returngo2[t][2];
voiderror(inti,intj,char*&
a)//error显示函数
cout<
error"
switch(j)
case1:
//期望输入id或左括号,但是碰到+,*,或$,就假设已经输入id了,转到状态5
//state.push(5);
//symbol.push('
);
//必须有这个,如果假设输入id的话,符号栈里必须有....
cout<
缺少运算对象digit"
break;
case2:
//从输入中删除右括号
//a++;
不配对的右括号"
case3:
//期望碰到+,但是输入id或左括号,假设已经输入算符+,转到状态6
//state.push(6);
缺少运算符"
case4:
//缺少右括号,假设已经输入右括号,转到状态11
//state.push(11);
缺少右括号"
case5:
*号无效,应该输入+号!
//case6:
//a++;
intmain()
ints;
char*a;
charhow;
intnum;
intb;
charA;
intk=1;
charq;
while
(1)
cin>
>
sen;
a=sen;
state.push(0);
//先输入0状态
while(*a!
='
\0'
{
b=0;
num=0;
how='
;
A='
s=state.top();
q=*a;
if(isalpha(*a))
{
*a='
}
action(s,a,how,num,A,b,k);
if(how=='
)//移进
cout<
移进"
symbol.push(*a);
state.push(num);
if(q!
&
q!
{
symbol2.push(q);
}
a++;
elseif(how=='
)//规约
for(inti=0;
i<
b;
i++)
if(!
state.empty())
state.pop();
symbol.empty())
symbol.pop();
intt=state.top();
symbol.push(A);
state.push(go(t,A));
)//接受
cout<
成功接受"
break;
else
error(s,num,a);
//错误显示
输入有误,重新输入!
break;
}
return0;