IFELSE条件语句的翻译程序设计简单优先法输出四元式Word文档格式.docx

上传人:b****6 文档编号:16182895 上传时间:2022-11-21 格式:DOCX 页数:20 大小:18.77KB
下载 相关 举报
IFELSE条件语句的翻译程序设计简单优先法输出四元式Word文档格式.docx_第1页
第1页 / 共20页
IFELSE条件语句的翻译程序设计简单优先法输出四元式Word文档格式.docx_第2页
第2页 / 共20页
IFELSE条件语句的翻译程序设计简单优先法输出四元式Word文档格式.docx_第3页
第3页 / 共20页
IFELSE条件语句的翻译程序设计简单优先法输出四元式Word文档格式.docx_第4页
第4页 / 共20页
IFELSE条件语句的翻译程序设计简单优先法输出四元式Word文档格式.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

IFELSE条件语句的翻译程序设计简单优先法输出四元式Word文档格式.docx

《IFELSE条件语句的翻译程序设计简单优先法输出四元式Word文档格式.docx》由会员分享,可在线阅读,更多相关《IFELSE条件语句的翻译程序设计简单优先法输出四元式Word文档格式.docx(20页珍藏版)》请在冰豆网上搜索。

IFELSE条件语句的翻译程序设计简单优先法输出四元式Word文档格式.docx

(11)C->

A/A

(12)C->

A

*////////////////////////////////////////

intlineno=1;

charch;

intanltable[22][22]={

/*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,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,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,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=<

2=>

3==

charallname[30][30];

//单词全名

charout[30][30];

//保存单词简称

intlength;

structatt

{//名字表类型

stringsname;

charselect;

charaddre;

attattname[40];

//名字表

typedefstructSqStack

{

char*base;

char*top;

intstacksize;

}SqStack;

//栈定义

voidInitStack(SqStack&

S)

{//栈初始化

S.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));

//分配存储空间

if(!

S.base)

exit(OVERFLOW);

//为栈S分配存储空间失败

S.top=S.base;

S.stacksize=STACK_INIT_SIZE;

}

intpush(SqStack&

S,charch)//将元素e插入到栈S中,成为新的栈顶元素

if(S.top-S.base>

S.stacksize)//判定栈是否满

{

S.base=(char*)realloc(S.base,(S.stacksize+STACKINCREMENT*sizeof(char)));

{

printf("

分配存储单元失败.\n"

);

//存储单元分配失败

exit(OVERFLOW);

}

S.top=S.base+S.stacksize;

//指明栈顶指针的基址

S.stacksize+=STACKINCREMENT;

//指明栈的空间大小

}//endofif

*S.top++=ch;

//先将e送入栈顶指针所指向的单元,再将栈顶指针加1

return(OK);

}//endofPush()subfunction

intpop(SqStack&

S,char&

ch)

{//栈顶元素出栈

if(S.top==S.base)

printf("

溢出"

return(ERROR);

}

ch=*--S.top;

}

chargettop(SqStackS)

{//返回栈顶元素

if(S.top==S.base)cout<

<

"

栈空,出错"

endl;

chare;

e=*(S.top-1);

returne;

intgetnum(charcc)

{//返回元素在优先表中的位置

switch(cc)

{

case'

S'

:

return0;

break;

i'

return1;

E'

return2;

t'

return3;

B'

return4;

e'

return5;

('

return6;

)'

return7;

>

'

return8;

return9;

='

return10;

A'

return11;

d'

return12;

n'

return13;

C'

return14;

{'

return15;

}'

return16;

+'

return17;

-'

return18;

*'

return19;

/'

return20;

#'

return21;

default:

return88;

}

intjudge(char*string)

{//判断是否是关键字

char*keywords[1000]={"

if"

"

then"

else"

for(inti=0;

i<

=2;

i++)

if(!

strcmp(string,*(keywords+i)))

{

return1;

}

return0;

intanalysis(ifstream&

fin,ofstream&

fout)//词法分析程序,用引用传递参数

{

chartemp[10];

//临时存放已读入但无法判断类型的字符

intj=0;

intou=0;

intna=0;

while(fin.get(ch))

if(ch=='

\n'

){lineno+=1;

elseif(ch=='

\t'

||ch=='

'

){}//排除制表、空格字符

elseif(isalpha(ch))//当前输入符为字母

while(isalpha(ch)||isdigit(ch))

{

temp[j]=ch;

j++;

fin.get(ch);

}

temp[j]='

\0'

;

//标志字符串结束

j=0;

if(judge(temp))//判断是否为关键字

memcpy(allname[na],temp,10);

attname[na].sname=allname[na];

attname[na].select=allname[na][0];

memcpy(out[ou],temp,10);

ou++;

fout<

("

attname[na].sname<

关键字)"

na++;

else

attname[na].select='

变量)"

fin.seekg(-1,ios:

cur);

//回退1个字符

elseif(isdigit(ch))

while(isdigit(ch))

memcpy(allname[na],temp,10);

attname[na].sname=allname[na];

attname[na].select='

memcpy(out[ou],temp,10);

fout<

常量)"

na++;

//回退一个字符

allname[na][0]=ch;

attname[na].select=ch;

memcpy(out[ou],"

="

10);

算符)"

+"

-"

*"

/"

{allname[na][0]=ch;

attname[na].sname=allname[na];

attname[na].select=ch;

fout<

界限符)"

na++;

逻辑运算符)"

out[ou][0]='

else

无法识别字符"

\"

"

ch<

\"

return0;

ch='

attname[na].select='

out[ou][0]='

length=na;

return1;

voidprintstack(SqStack&

S,intnaa,intty,ofstream&

fout)

chartemp[40][20];

for(intk=0;

k<

40;

k++)

for(intt=0;

t<

20;

t++)

temp[k][t]=NULL;

intte=0;

inti=0,j=0;

intnu=0;

char*ku;

ku=S.base;

i=naa+1;

char*contrl;

contrl=S.base;

while(contrl!

=S.top)

if(*contrl!

1'

if(*contrl=='

{fout<

nu=nu+2;

elseif(*contrl=='

nu=nu+4;

*contrl;

nu++;

contrl++;

fout<

\t\t\t"

for(i;

i<

=length;

i++)

if(gettop(S)=='

#"

attname[i].select;

if(gettop(S)=='

fout<

else

temp[te];

te++;

intlaynax(ofstream&

f)

SqStackS;

InitStack(S);

push(S,'

charcch,tempch;

intnaa=0,over=1,go;

intfront=0,last=0,choose=0;

while(over)

//getchar();

front=getnum(gettop(S));

last=getnum(attname[naa].select);

go=naa;

//cout<

front<

last<

choose=anltable[front][last];

if(choose==1)

push(S,'

push(S,attname[naa].select);

printstack(S,go,1,f);

naa++;

elseif(choose==3)

elseif(choose==2)

inta=0;

l1:

pop(S,cch);

if(cch=='

if(tempch=='

{

push(S,'

printstack(S,go,3,f);

over=0;

}

elseif(tempch=='

printstack(S,naa-1,3,f);

front=getnum(gettop(S));

last=getnum('

choose=anltable[front][last];

if(choose==1){push(S,'

a=1;

}//cout<

归约了A"

{

printstack(S,go-1,3,f);

归约了B"

naa++;

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

当前位置:首页 > 职业教育 > 职业技术培训

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

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