编译原理语义分析

#include
#include
#include
ofstream Targetfile;
char *rwtab[6]={"begin","if","then","while","do","end"};
int numberoftemp=0;
int numberofquad=0;
class quad
{
public:
char result[8];
char arg1[8];
char op[8];
char arg2[8];
void Tofile()
{
Targetfile<}
}q[20];
void emit(char a[],char b[],char c[],char d[])
{
strcpy(q[numberofquad].result,a);
strcpy(q[numberofquad].arg1,b);
strcpy(q[numberofquad].op,c);
strcpy(q[numberofquad].arg2,d);
numberofquad++;
}
char* newtemp()
{
char *p;
int temp=numberoftemp;
p=new char[8];
p[0]='t';
for(int i=0;;i++)
{
p[++i]=char(temp%10+48);
temp=temp/10;
if (temp==0) {p[i+1]='\0'; break;}
}
numberoftemp++;
return p;
};
char *convert(int c)
{
char *t;
char temp;
t=new char[8];
for (int i=0;;i++)
{
t[i]=char(c%10+48);
c=c/10;
if(c==0){t[i+1]='\0'; break;}

}
for(int j=0;j<=i/2;j++)
{
temp=t[j];
t[j]=t[i-j];
t[i-j]=temp;
}
return t;
}
class Interpreter
{
private:
ifstream SourceFile;
char buffercode[200];
int syn;
int current;
int sum;
char token[8];
int kk;
int schain;
public:
Interpreter(){current=0;}
int lrparser();
int yucu();
void error(int c);
void Scaner();
void Read();
char *factor();
char *expression();
char *term();
int statement();
};
void Interpreter::error(int c)
{
kk=1;
switch (c)
{
case 1: cout<<"结尾出错"<case 2: cout<<"复制号有错误"<case 3: cout<<"括号不搭配"<default :cout<<"赋值语句格式有误";
}
}
int Interpreter::lrparser()
{
schain=0;
kk=0;
if (syn==1)
{
Scaner();
schain=yucu();
if(syn==6)
{
Scaner();
if((syn==0)&&(kk==0))
cout<<"分析成功 无错误"<
}
else {error(1);}
}
cout<<"文件生成的中间代码存放在 intermediacode.txt中"<return schain;
}
int Interpreter::yucu()
{
schain=0;
schain=statement();
while(syn==26)
{
Scaner();
schain=statement();
}
return (schain);
}
int Interpreter::statement()
{
char tt[8],eplace[8];
schain=0;
switch(syn)
{
case 10:
strcpy(tt,token);
Scaner();
if (syn==18)
{
Scaner();
strcpy(eplace,expression());
emit(tt,eplace,"","");
schain=0;
}
else error(2);
return schain;
break;
default:error(5);
}
Scaner();
return schain;
}
char* Interpreter::factor()
{
char *fplace;
fplace=new char[8];
if ((syn==10))
{
strcpy(fplace,token);
Scaner();
}
else if((syn==11))
{
strcpy(fplace, convert(sum));
Scaner();
}
else if((syn==27))
{
Scaner();
char *t=expression();
if (syn==28){Scaner(); return t;}
else {error(3);}
}
else{error(4);}
return fplace;
}
char*interpreter::expression()
{
char *tp,*ep2,*eplace,

*tt;
tp=new char[8];
ep2=new char[8];
eplace=new char[8];
tt=new char[8];
strcpy(eplace,term());
while(strcmp(token,"or")==0)
{
strcpy(tt,token);
Scaner();
strcpy(ep2,term());
strcpy(tp,newtemp());
emit(tp,eplace,tt,ep2);
strcpy(eplace,tp);
}
return eplace;
}
char*Interpreter::term()
{

char *tp,*ep2,*eplace,*tt;
tp=new char[8];
ep2=new char[8];
eplace=new char[8];
tt=new char[8];
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;
}
void Interpreter::Read()
{
SourceFile.open("sourcefile.txt");
SourceFile.get(buffercode,200,'\n');
}
void Interpreter::Scaner()
{
int m=0;
for(int i=0;i<8;i++) token[i]=' ';
sum=0;
while (buffercode[current]==' ') current++;
if(((buffercode[current]>='a')&&(buffercode[current]<='z'))||((buffercode[current]>='A')&&(buffercode[current]<='Z')))
{
// cout<<"zimu"<while ((((buffercode[current]>='a')&&(buffercode[current]<='z'))||((buffercode[current]>='A')&&(buffercode[current]<='Z')))||((buffercode[current]>='0')&&(buffercode[current]<='9')))
{
// cout<<"zimu1"<token[m]=buffercode[current];m++;
current++;
// cout<<"zimu2"<}

token[m++]='\0';current--;syn=10;
for (int n=0;n<6;n++)
{
if (strcmp(token,rwtab[n])==0)
{
// cout<<"here"<syn=n+1;
break;
}
}
}
else if((buffercode[current]>='0')&&(buffercode[current]<='9'))
{
while ((buffercode[current]>='0')&&(buffercode[current]<='9'))
{
sum=sum*10+buffercode[current]-'0';//字符转换为整型的方法
current++;
}
current--;syn=11;
}
else switch(buffercode[current])
{
case '<':m=0;token[m++]=buffercode[current];token[m]='\0';current++;
if(buffercode[current]=='>')
{syn=21;token[m++]=buffercode[current];token[m]='\0';}
else if (buffercode[current]=='=')
{syn=22;token[m++]=buffercode[current];token[m]='\0';}
else{syn=20;current--;}
break;
case '>':m=0;token[m++]=buffercode[current];current++;
if (buffercode[current]=='=')
{syn=24;token[m++]=buffercode[current];token[m]='\0';}
else{syn=23;current--;}
break;
case ':':m=0;token[m++]=buffercode[current];current++;
if(buffercode[current]=='=')
{syn=18;token[m++]=buffercode[current];token[m]='\0';}
else {syn=17;current--;}
break;
case '+':syn=13;token[0]=buffercode[current];token[1]='\0';break;
case '-':syn=14;token[0]=buffercode[current];token[1]='\0';break;
case '*':syn=15;token[0]=buffercode[current];token[1]='\0';break;
case '/':syn=16;token[0]=buffercode[current];token[1]='\0';break;
case '=':syn=25;token[0]=buffercode[current];token[1]='\0';break;
case ';':syn=26;token[0]=buffercode[current];token[1]='\0';break;
case '(':syn=27;token[0]=buffercode[current];token[1]='\0';br

eak;
case ')':syn=28;token[0]=buffercode[current];token[1]='\0';break;
case '#':syn=0;token[0]=buffercode[current];token[1]='\0';break;
default:syn=-1;

}
current++;
}
void main()
{
Interpreter wa;
wa.Read();
wa.Scaner();
Targetfile.open("intermediacode.txt");
wa.lrparser();
for(int i=0;iq[i].Tofile();
}

相关文档
最新文档