📄 yu.cpp
字号:
#include <iostream.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
char prog[80],token[8];
char ch;
int syn,p,m,n,sum,kk,pp,k;
char *rwtab[6]={"begin","if","then","while","do","end"};
struct
{ char result[8];
char ag1[8];
char op[8];
char ag2[8];
}quad[20];
bool letter(char ch);
bool digit(char ch);
void scaner();
void Irparser();
void yucu();
void statement();
char *expression();
char *term();
char *factor();
char *newtemp(void);
void emit(char *result,char *ag1,char *op,char *ag2);
int isdigit(char m);
int ischar(char c);
void main()
{ p=0;
pp=0;
cout<<"输入表达语句:"<<endl;
do
{ ch=getchar();
prog[p++]=ch;
}while(ch!='#');
p=0;
Irparser();
int i;
cout<<"编译结果的四元式形式是:"<<endl;
for(i=0;i<pp;i++)
{ if(strlen(quad[i].op)==0)
cout<<'('<<":=";
else
cout<<'('<<quad[i].op;
cout<<','<<quad[i].ag1<<','<<quad[i].ag2<<','<<quad[i].result<<')'<<endl;
}
cout<<"编译结果的三地址指令格式是:"<<endl;
for(i=0;i<pp;i++)
{
cout<<quad[i].result<<'='<<quad[i].ag1<<quad[i].op<<quad[i].ag2<<endl;
}
}
//***************************************************************************
void scaner()
{
for(n=0;n<10;n++)
token[n]=NULL;
ch=prog[p++];
while(ch==' ')
ch=prog[p++];
if(ischar(ch))
{ m=0;
while(ischar(ch)||isdigit(ch))
{ token[m++]=ch;
ch=prog[p++];
}
token[m++]='\0';
p--;
syn=10;
for(n=0;n<6;n++)
{ if(strcmp(token,rwtab[n])==0)
{ syn=n+1;
break;
}
}
}
else
if(isdigit(ch))
{ while(isdigit(ch))
{ sum=sum*10+ch-'0';
ch=prog[p++];
}
p--;
syn=11;
}
else
switch(ch)
{ case '<':m=0;token[m++]=ch;
ch=prog[p++];
if(ch=='>')
{ syn=21;
token[m++]=ch;
}
else if(ch=='=')
{ syn=22;
token[m++]=ch;
}
else
{ syn=20;
}
break;
case '>':m=0;token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{ syn=24;
token[m++]=ch;
}
else
{ syn=23;
}
break;
case ':':m=0;token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{ syn=18;
token[m++]=ch;
}
else
{ syn=17;
}
break;
case '+':syn=13;
m=0;
token[m++]=ch;
break;
case '-':syn=14;
m=0;
token[m++]=ch;
break;
case '*':syn=15;
m=0;
token[m++]=ch;
break;
case '/':syn=16;
m=0;
token[m++]=ch;
break;
case ';':syn=26;
m=0;
token[m++]=ch;
break;
case '=':syn=25;
m=0;
token[m++]=ch;
break;
case '(':syn=27;
m=0;
token[m++]=ch;
break;
case ')':syn=28;
m=0;
token[m++]=ch;
break;
case '#':syn=0;
m=0;
token[m++]=ch;
break;
default:syn=-1;
}
token[m++]='\0';
}
int ischar(char c)
{ if((c>=65&&c<=90)||(c>=97&&c<=122))
return 1;
else return 0;
}
int isdigit(char m)
{ if(m>=48&&m<=57)
return 1;
else return 0;
}
//**********************************************************************************
/*语法分析程序*/
void Irparser()
{ scaner();
if(syn==1)
{ scaner();
yucu();
if(syn==6)
{ scaner();
if((syn==0)&&(kk==0))
{ cout<<"success"<<endl;
}
}
else
{ if(kk!=1)
{ cout<<"缺少end"<<endl;
kk=1;
}
}
}
}
void yucu()
{
statement();
while(syn==26)
{ scaner();
statement();
}
}
void statement()
{ char tt[8],eplace[8];
switch(syn)
{ case 10:strcpy(tt,token);
scaner();
if(syn=18)
{ scaner();
strcpy(eplace,expression());
emit(tt,eplace,"","");
}
else{ cout<<"缺少赋值号"<<endl;
}
break;
}
}
char *expression()
{ char *tp,*ep2,*eplace,*tt;
ep2=new char[12];
tp=new char[12];
eplace=new char[12];
tt=new char[12];
strcpy(eplace,term());
while((syn==13)||(syn==14))
{
strcpy(tt,token);
scaner();
strcpy(ep2,term());
strcpy(tp,newtemp());
emit(tp,eplace,tt,ep2);
strcpy(eplace,tp);
}
return eplace;
}
char *term()
{ char *tp,*ep2,*eplace,*tt;
tp=new char[12];
ep2=new char[12];
eplace=new char[12];
tt=new char[12];
strcpy(eplace,factor());
while((syn==15)||(syn==16))
{
strcpy(tt,token);
scaner();
strcpy(ep2,factor());
strcpy(tp,newtemp());
emit(tp,eplace,tt,ep2);
strcpy(eplace,tp);
}
return eplace;
}
char *factor()
{ char *fplace;
fplace=new char[12];
strcpy(fplace," ");
if(syn==10)
{ strcpy(fplace,token);
scaner();
}
else if(syn==11)
{ itoa(sum,fplace,10);
scaner();
}
else if(syn==27)
{ scaner();
fplace=expression();
if(syn==28)
scaner();
else
{ cout<<"输出')'错误"<<endl;
}
}
else
{ cout<<"输出')'错误"<<endl;
}
return fplace;
}
char *newtemp(void)
{ char *p;
char m[8];
p=new char[8];
k++;
itoa(k,m,10);
strcpy(p+1,m);
p[0]='t';
return p;
}
void emit(char *result,char *ag1,char *op,char *ag2)
{ strcpy(quad[pp].result,result);
strcpy(quad[pp].ag1,ag1);
strcpy(quad[pp].op,op);
strcpy(quad[pp].ag2,ag2);
pp++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -