IFELSE条件语句的翻译程序设计简单优先法输出四元式文档格式.docx
- 文档编号:20700757
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:20
- 大小:18.77KB
IFELSE条件语句的翻译程序设计简单优先法输出四元式文档格式.docx
《IFELSE条件语句的翻译程序设计简单优先法输出四元式文档格式.docx》由会员分享,可在线阅读,更多相关《IFELSE条件语句的翻译程序设计简单优先法输出四元式文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
(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++;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- IFELSE 条件 语句 翻译 程序设计 简单 优先 输出 四元式