中间代码生成程序(三地址)Word格式.docx

上传人:b****2 文档编号:14564433 上传时间:2022-10-23 格式:DOCX 页数:6 大小:16.33KB
下载 相关 举报
中间代码生成程序(三地址)Word格式.docx_第1页
第1页 / 共6页
中间代码生成程序(三地址)Word格式.docx_第2页
第2页 / 共6页
中间代码生成程序(三地址)Word格式.docx_第3页
第3页 / 共6页
中间代码生成程序(三地址)Word格式.docx_第4页
第4页 / 共6页
中间代码生成程序(三地址)Word格式.docx_第5页
第5页 / 共6页
点击查看更多>>
下载资源
资源描述

中间代码生成程序(三地址)Word格式.docx

《中间代码生成程序(三地址)Word格式.docx》由会员分享,可在线阅读,更多相关《中间代码生成程序(三地址)Word格式.docx(6页珍藏版)》请在冰豆网上搜索。

中间代码生成程序(三地址)Word格式.docx

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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 材料科学

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

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