VC++问题!编译原理兼编程高手进~~!

WHILE循环语句的翻译程序设计 (递归下降法、输出三地址表示)!要C++的源代码,能完全实现题目的要求,最好有注释!有珍藏的拿出来大家分享,没注释的话就留言,小弟诚心虚心请教~~!

我有做过,给你吧,记得加分哦

#include<iostream.h>
#include<stdio.h>
#include<string.h>

#define buf 20
#define MAXBUF 255

typedef struct Token
{
int label;
char name[buf];
int code;
}Token;

typedef struct Symbol_i
{
int symbol_i;
int state;
}Symbol_i;

int Getsymbol();
void ERROR();
void S(); //S->while (B) S | i=E
void B(); //B->E relop E
void relop(); //relop->< | = | >
void E(); //E->(E)F | iF | nF
void F(int A); //F->+EF | -EF | *EF | /EF | ε
void F();

char sym,ch;
int symbol_L=0,symbol_L1=0,symbol_L2=0,symbol_L3=0,symbol_L4=0;
int l,l1,l2,l3,l4;
int L_i=0,S_i=0,B_i=0,E_i=0,F_i=0,relop_i=0,i_i=0,n_i=0;
int k=0;
int re,n=0,t=0;
int i1=0,i2=0,i3=0,i4=0;
char *wh="while";
Token token1[MAXBUF],token2[MAXBUF];
Symbol_i L[MAXBUF],L1[MAXBUF],L2[MAXBUF],L3[MAXBUF],L4[MAXBUF];

FILE *input;
FILE *output;

int strcmp(char *s,char *t)
{
for(;*s==*t;s++,t++)
if(*s==0) return 0;
return 1;
}

void main()
{
if((input=fopen("input.txt","rt"))==NULL)
printf("cannot open input file \n");
if((output=fopen("output.txt","wt+"))==NULL)
printf("cannot open output file\n");

for(int i=0;i<MAXBUF;i++)
for(int j=0;j<buf;j++)
{
token1[i].name[j]='\0';
token1[i].name[j]='\0';
}

for(int j=0;j<MAXBUF;j++)
{
L[j].symbol_i=-1;
L[j].state=0;
L1[j].symbol_i=-1;
L1[j].state=0;
L2[j].symbol_i=-1;
L2[j].state=0;
L3[j].symbol_i=-1;
L3[j].state=0;
L4[j].symbol_i=-1;
L4[j].state=0;
}
sym=fgetc(input);
S();
cout<<"Lnext: exit"<<endl;
fprintf(output,"%s","Lnext: exit");
cout<<endl;
if(k==1)
{
cout<<"分析结束!"<<endl;
cout<<"成功分析!"<<endl;
}
}

int Getsymbol()
{
while(sym!=EOF)
{
if((sym>='a'&&sym<='z')||(sym>='A'&&sym<='Z'))
{
int h1=0;
while((sym>='a'&&sym<='z')||(sym>='A'&&sym<='Z')||sym=='_'||(sym>='0'&&sym<='9'))
{
token1[t].name[i1++]=sym;
n=t;
sym=fgetc(input);
}
h1=strcmp(token1[t].name,wh);
t++;
i3=i1;
i1=0;
if(!h1)
return 16; //返回while给主程序
else
return 13;
} //已经取了下一个字符
else
if(sym>='0'&&sym<='9')
{
while(sym>='0'&&sym<='9')
{
token2[t].name[i2++]=sym;
n=t;
sym=fgetc(input);
}
t++;
i4=i2;
i2=0;
return 12;
}
else
if(sym=='/')
{
sym=fgetc(input);
ch='/';
return 1;
}
else
if(sym=='*')
{
sym=fgetc(input);
ch='*';
return 2;
}
else
if(sym=='-')
{
sym=fgetc(input);
ch='-';
return 3;
}
else
if(sym=='+')
{
sym=fgetc(input);
ch='+';
return 4;
}
else
if(sym=='(')
{
sym=fgetc(input);
return 15;
}
else
if(sym==')')
{
sym=fgetc(input);
return 14;
}
else
if(sym=='<')
{
sym=fgetc(input);
ch='<';
return 9;
}
else
if(sym=='=')
{
sym=fgetc(input);
ch='=';
return 10;
}
else
if(sym=='>')
{
sym=fgetc(input);
ch='>';
return 11;
}
else
if(sym==';'&&k!=1)
{
ch=';';
k=1;
return 20;
break;
}
else
if(k!=1)
{
sym=fgetc(input);
}

}
return 0;
}

void S() //S->while (B) S | i=E
{
re=Getsymbol();//cout<<re<<" S"<<endl;

if(re==16)//
{
cout<<"L"<<L_i<<": "<<"if ( B"<<B_i<<" ) goto L"<<L_i+1<<endl;
fprintf(output,"%s%d%s%d%s%d%s","L",L_i,": if ( B",B_i," ) goto L",L_i+1,"\n");
cout<<" else goto Lnext"<<endl;
fprintf(output,"%s","else goto Lnext\n\n");
L_i++;
//cout<<endl;
re=Getsymbol();//cout<<re<<" S"<<endl;

if(re==15)
{
B();
if(re==14)
S();
else
ERROR();
}
else
ERROR();
}
else
if(re==13)
{
cout<<"L"<<L_i<<": "<<"i"<<i_i<<" = E"<<E_i<<endl;
fprintf(output,"%s%d%s%d%s%d%s","L",L_i,": i",i_i," = E",E_i,"\n\n");
L_i++;
//cout<<endl;
cout<<" i"<<i_i<<":=";
fprintf(output,"%s%d%s"," i",i_i,":=");
for(int i=0;i<=i3;i++)
if(token1[n].name[i]!='\0')
{
cout<<token1[n].name[i];
fprintf(output,"%c",token1[n].name[i]);
}
i_i++;
cout<<endl;//<<endl;
fprintf(output,"%s","\n\n");

re=Getsymbol();//cout<<re<<" S"<<endl;
if(re==10)
E();
else
ERROR();
}
else
ERROR();
}

void B() // //B->E relop E
{
cout<<" B"<<B_i<<":=E"<<E_i<<" relop"<<relop_i<<" E"<<E_i+1<<endl;
fprintf(output,"%s%d%s%d%s%d%s%d%s"," B",B_i,":=E",E_i," relop",relop_i," E",E_i+1,"\n\n");
//cout<<endl;
B_i++;
E();
relop();
E();
}

void relop() //relop->< | = | >
{
if(re==9)
{
cout<<" relop"<<relop_i<<":= <"<<endl;
fprintf(output,"%s%d%s"," relop",relop_i,":= <\n\n");
relop_i++;
//cout<<endl;
}//cout<<re<<" relop"<<endl;
else
if(re==10)
{
cout<<" relop"<<relop_i<<":= ="<<endl;
fprintf(output,"%s%d%s"," relop",relop_i,":= =\n\n");
relop_i++;
//cout<<endl;
}//cout<<re<<" E"<<endl;
else
if(re==11)
{
cout<<" relop"<<relop_i<<":= >"<<endl;
fprintf(output,"%s%d%s"," relop",relop_i,":= >\n\n");
relop_i++;
//cout<<endl;
}//cout<<re<<" E"<<endl;
else
ERROR();
}

void E() //E->(E)F | iF | nF
{
re=Getsymbol() ;//cout<<re<<" E"<<endl;
if(re==15)
{
cout<<" E"<<E_i<<":=( E"<<E_i+1<<" ) F"<<F_i<<endl;
fprintf(output,"%s%d%s%d%s%d%s"," E",E_i,":=( E",E_i+1," ) F",F_i,"\n\n");
E_i++;
L[symbol_L].symbol_i=F_i;//L=F_i;
l=symbol_L;
symbol_L++;
F_i++;
//cout<<endl;
E();
if(re==14)
{
re=Getsymbol();//cout<<re<<" E"<<endl;
if(re==4||re==3||re==2||re==1||re==20)
{
while(l>=0)
{
if(L[l].state==0)
{
F(L[l].symbol_i);
L[l].state=1;
}
else
{
l--;
}
}
}
else
F();
}
else
ERROR();
}
else
if(re==12)
{
cout<<" E"<<E_i<<":="<<"n"<<n_i<<" F"<<F_i<<endl;
fprintf(output,"%s%d%s%d%s%d%s"," E",E_i,":=n",n_i," F",F_i,"\n\n");
//cout<<endl;
E_i++;

cout<<" n"<<n_i<<":=";
fprintf(output,"%s%d%s"," n",n_i,":=");
for(int i=0;i<=i4;i++)
{
cout<<token2[n].name[i];
fprintf(output,"%c",token2[n].name[i]);
}
cout<<endl;//<<endl;
fprintf(output,"%s","\n\n");
n_i++;

re=Getsymbol();//cout<<re<<" E"<<endl;
if(re==4||re==3||re==2||re==1)
F();
else
F(F_i);
}
else
if(re==13)
{
cout<<" E"<<E_i<<":="<<"i"<<i_i<<" F"<<F_i<<endl;
fprintf(output,"%s%d%s%d%s%d%s"," E",E_i,":=i",i_i," F",F_i,"\n\n");
E_i++;
//cout<<endl;
cout<<" i"<<i_i<<":=";
fprintf(output,"%s%d%s"," i",i_i,":=");
for(int i=0;i<=i3;i++)
if(token1[n].name[i]!='\0')
{
cout<<token1[n].name[i];
fprintf(output,"%c",token1[n].name[i]);
}
cout<<endl;//<<endl;
fprintf(output,"%s","\n\n");
i_i++;

re=Getsymbol();//cout<<re<<" E"<<endl;
if(re==4||re==3||re==2||re==1)
F();
else
F(F_i);
}
else
ERROR();
}

void F(int A) //F->+EF | -EF | *EF | /EF | ε
{
if(re==4)
{
cout<<" F"<<A<<":="<<"+ E"<<E_i;
fprintf(output,"%s%d%s%d"," F",A,":=+ E",E_i);
F_i++;
L1[symbol_L1].symbol_i=F_i;//L1=F_i;
l1=symbol_L1;
symbol_L1++;
cout<<" F"<<F_i<<endl;
fprintf(output,"%s%d%s"," F",F_i,"\n\n");
F_i++;
//cout<<endl;
E();
if(re==4||re==3||re==2||re==1)
F();
else
while(l1>=0)
{
if(l1[L1].state==0&&L1[l1].symbol_i!=-1)
{

F(L1[l1].symbol_i);
L1[l1].state=1;
}
else
{
l1--;
}
}
}
else
if(re==3)
{
cout<<" F"<<A<<":="<<"- E"<<E_i;
fprintf(output,"%s%d%s%d"," F",A,":=- E",E_i);
F_i++;
L2[symbol_L2].symbol_i=F_i;//L2=F_i;
l2=symbol_L2;
symbol_L2++;
cout<<" F"<<F_i<<endl;
fprintf(output,"%s%d%s"," F",F_i,"\n\n");
F_i++;
//cout<<endl;
E();
if(re==4||re==3||re==2||re==1)
F();
else
while(l2>=0&&L2[l2].symbol_i!=-1)
{
if(L2[l2].state==0)
{

F(L2[l2].symbol_i);
L2[l2].state=1;
}
else
{
l2--;
}
}
}
else
if(re==2)
{
cout<<" F"<<A<<":="<<"* E"<<E_i;
fprintf(output,"%s%d%s%d"," F",A,":=* E",E_i);
F_i++;
L3[symbol_L3].symbol_i=F_i;//L3=F_i;
l3=symbol_L3;
symbol_L3++;
cout<<" F"<<F_i<<endl;
fprintf(output,"%s%d%s"," F",F_i,"\n\n");
F_i++;
//cout<<endl;
E();
if(re==4||re==3||re==2||re==1)
F();
else
while(l3>=0&&L3[l3].symbol_i!=-1)
{
if(L3[l3].state==0)
{

F(L3[l3].symbol_i);
L3[l3].state=1;
}
else
{
l3--;
}
}
}
else
if(re==1)
{
cout<<" F"<<A<<":="<<"/ E"<<E_i;
fprintf(output,"%s%d%s%d"," F",A,":=/ E",E_i);
F_i++;
L4[symbol_L4].symbol_i=F_i;//L4=F_i;
l4=symbol_L4;
symbol_L4++;
cout<<" F"<<F_i<<endl;
fprintf(output,"%s%d%s"," F",F_i,"\n\n");
F_i++;
// cout<<endl;
E();
if(re==4||re==3||re==2||re==1)
F();
else
while(l4>=0&&L4[l4].symbol_i!=-1)
{
if(L4[l4].state==0)
{

F(L4[l4].symbol_i);
L4[l4].state=1;
}
else
{
l4--;
}
}
}
else
if(re==20)
{
cout<<" F"<<A<<":=ε"<<endl;
fprintf(output,"%s%d%s"," F",A,":=ε\n\n");
F_i++;
//cout<<endl;
re=-1;
}
else
{
cout<<" F"<<A<<":=ε"<<endl;
fprintf(output,"%s%d%s"," F",A,":=ε\n\n");
if((symbol_L<=l)&&(symbol_L1<=l1)&&(symbol_L2<=l2)&&(symbol_L3<=l3)&&(symbol_L4<=l4))
F_i++;
//cout<<endl;
}
}

void F() //F->+EF | -EF | *EF | /EF | ε
{
if(re==4)
{
cout<<" F"<<F_i<<":="<<"+ E"<<E_i;
fprintf(output,"%s%d%s%d"," F",F_i,":=+ E",E_i);
F_i++;
L1[symbol_L1].symbol_i=F_i;//L1=F_i;
l1=symbol_L1;
symbol_L1++;
cout<<" F"<<F_i<<endl;
fprintf(output,"%s%d%s"," F",F_i,"\n\n");
F_i++;
//cout<<endl;
E();
if(re==4||re==3||re==2||re==1)
F();
else
while(l1>=0&&L1[l1].symbol_i!=-1)
{
if(L1[l1].state==0)
{

F(L1[l1].symbol_i);
L1[l1].state=1;
}
else
{
l1--;
}
}
}
else
if(re==3)
{
cout<<" F"<<F_i<<":="<<"- E"<<E_i;
fprintf(output,"%s%d%s%d"," F",F_i,":=- E",E_i);
F_i++;
L2[symbol_L2].symbol_i=F_i;//L2=F_i;
l2=symbol_L2;
symbol_L2++;
cout<<" F"<<F_i<<endl;
fprintf(output,"%s%d%s"," F",F_i,"\n\n");
F_i++;
//cout<<endl;
E();
if(re==4||re==3||re==2||re==1)
F();
else
while(l2>=0&&L2[l2].symbol_i!=-1)
{
if(L2[l2].state==0)
{

F(L2[l2].symbol_i);
L2[l2].state=1;
}
else
{
l2--;
}
}
}
else
if(re==2)
{
cout<<" F"<<F_i<<":="<<"* E"<<E_i;
fprintf(output,"%s%d%s%d"," F",F_i,":=* E",E_i);
F_i++;
L3[symbol_L3].symbol_i=F_i;//L3=F_i;
l3=symbol_L3;
symbol_L3++;
cout<<" F"<<F_i<<endl;
fprintf(output,"%s%d%s"," F",F_i,"\n\n");
F_i++;
//cout<<endl;
E();
if(re==4||re==3||re==2||re==1)
F();
else
while(l3>=0&&L3[l3].symbol_i!=-1)
{
if(L3[l3].state==0)
{

F(L3[l3].symbol_i);
L3[l3].state=1;
}
else
{
l3--;
}
}
}
else
if(re==1)
{
cout<<" F"<<F_i<<":="<<"/ E"<<E_i;
fprintf(output,"%s%d%s%d"," F",F_i,":=/ E",E_i);
F_i++;
L4[symbol_L4].symbol_i=F_i;//L4=F_i;
l4=symbol_L4;
symbol_L4++;
cout<<" F"<<F_i<<endl;
fprintf(output,"%s%d%s"," F",F_i,"\n\n");
F_i++;
//cout<<endl;
E();
if(re==4||re==3||re==2||re==1)
F();
else
while(l4>=0&&L4[l4].symbol_i!=-1)
{
if(L4[l4].state==0)
{

F(L4[l4].symbol_i);
L4[l4].state=1;
}
else
{
l4--;
}
}
}
else
{
cout<<" F"<<F_i<<":=ε"<<endl;
fprintf(output,"%s%d%s"," F",F_i,":=ε");
F_i++;
//cout<<endl;
}
}

void ERROR()
{
cout<<"这个语句与该文法不符!"<<endl;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-06-17
你们用的是PL/0做的?你说的这个可不是随便写出来的,因为它跟整个编译过程关联很大,你想想,在处理完while TOKEN后处理(),然后表达式处理,判定;然后再是语句处理;处理while需要回填跳转地址的;
相似回答