xcpzxx 2022-11-24 20:10 采纳率: 0%
浏览 9
已结题

语义分析代码运行出不来结果

编译原理的语义分析为什么代码没错但是出不来结果呢
感觉错在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; 
}
  • 写回答

3条回答 默认 最新

报告相同问题?

问题事件

  • 系统已结题 12月2日
  • 修改了问题 11月24日
  • 创建了问题 11月24日

悬赏问题

  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题