编译原理的语义分析为什么代码没错但是出不来结果呢
感觉错在scaner函数上
是使用dev c++ 软件的
源代码一下:
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include <stdlib.h>
char prog[100],token[8],ch;
char const *rwtab[6]={"begin","if","then","while","end"};
int syn,p,m,n,sum,q;
int kk;
struct
{
char result1[8];
char ag11[8];
char op1[8];
char ag21[8];
}quad[20];
char *factor();
char *expression();
int yucu();
char *term();
int statement();
int Irparser();
char *newtemp();
void scaner();
void emit(char const *result,char const *ag1,char const *op,char const *ag2);
int main()
{
int j;
q=p=kk=0;
printf("请输入一个串(以'#'结束):\n");
do
{ scanf("%c",&ch);
prog[p++]=ch;
} while(ch!='#');
p=0;
scaner();
Irparser();
if(q>19)
printf("句子太长!\n");
else
for(j=0;j<q;j++)
{
printf("%s=",quad[j].result1);
printf("%s",quad[j].ag11);
printf("%s",quad[j].op1);
printf("%s ",quad[j].ag21);
printf("\n");
}
getch();
return 0;
}
int Irparser()
{
int schain=0;
kk=0;
if(syn==1)
{
scaner();
schain=yucu();
if(syn==6)
{
scaner();
if((syn==0)&&(kk==0))
printf("Success!\n");
}
else
{
if(kk!=1)
printf("short of'end'!\n");
kk=1;
}
}
else
{
printf("short of'begin'!\n");
kk=1;
}
return (schain);
}
int yucu()
{
int schain=0;
schain=statement();
while(syn==26)
{
scaner();
schain=statement();
}
return (schain);
}
int statement()
{
char tt[8],eplace[8];
int schain=0;
switch(syn)
{
case 10:
strcpy(tt,token);
scaner();
if(syn==18)
{
scaner();
strcpy(eplace,expression());
emit(tt,eplace,"","");
schain=0;
}
else
{
printf("short of sign':='!\n");
kk=1;
}
return (schain);
break;
}
}
char *expression()
{
char *tp, *ep2, *eplace, *tt;
tp= (char *) malloc (12) ;
ep2= (char *) malloc (12);
eplace= (char *) malloc(12) ;
tt= (char *) malloc(12) ;
strcpy (eplace, term());
while((syn-=13) || (syn==14))
{
if (syn==13)
strcpy(tt,"+");
else
strcpy(tt,"-");
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= (char *)malloc(12);
ep2= (char *) malloc(12) ;
eplace= (char *) malloc(12) ;
tt= (char *) malloc(12) ;
strcpy (eplace, factor());
while((syn==15) || (syn==16))
{
if (syn==15)
strcpy(tt,"*");
else
strcpy(tt,"/");
scaner() ;
strcpy (ep2, factor());
strcpy (tp, newtemp());
emit (tp, eplace, tt, ep2) ;
strcpy (eplace, tp);
}
return (eplace);
}
char *factor()
{
char *fplace;
fplace= (char *) malloc (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 { printf("error on ')'!\n");
kk=1;
}
}
else
{ printf("error on '(' !\n");
kk=1;
}
return (fplace);
}
char *newtemp ()
{
char *p;
char m[8];
p= (char *)malloc (8) ;
kk++;
itoa(kk, m, 10);
strcpy(p+1,m) ;
p[0]='t';
return (p);
}
void scaner()
{
for(n=0;n<8;n++)
token[n]=' ';
m=0;
ch=prog[p++];
while(ch==' ')ch=prog[p++];
if((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A'))
{
while((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A')||(ch<='9'&&ch>='0'))
{
token[m++]=ch;
ch=prog[p++];
}
syn=10;
token[m++]='\0';
p--;
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;
break;
}
}
else
if((ch<='9'&&ch>='0'))
{
sum=0;
while((ch<='9'&&ch>='0'))
{
sum=sum*10+ch-'0';
ch=prog[p++];
}
ch=prog[--p];
syn=11;
p--;
syn=11;
}
else
switch(ch)
{
case '<':m=0;
ch=prog[p++];
if(ch=='>')
{
syn=21;
}
else
if(ch=='=')
{
syn=22;
}
else
{
syn=20;
p--;
}
break;
case '>':m=0;
ch=prog[p++];
if(ch=='=')
{
syn=24;
}
else
{
syn=23;
p--;
}
break;
case ':':m=0;
ch=prog[p++];
if(ch=='=')
{
syn=18;
}
else
{
syn=17;
p--;
}
break;
case '+':syn=13;break;
case '-':syn=14;break;
case '*':syn=15;break;
case '/':syn=16;break;
case '(':syn=27;break;
case ')':syn=28;break;
case '=':syn=25;break;
case '#':syn=0;break;
case ';':syn=26;break;
default:syn=-1;break;
}
}
void emit (char const *result, char const *ag1, char const *op, char const *ag2)
{
strcpy (quad[q].result1, result);
strcpy (quad[q].ag11, ag1);
strcpy (quad[q].op1, op);
strcpy (quad[q].ag21, ag2);
q++;
return;
}