⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sandizhi.c

📁 一款简单的语义分析器
💻 C
📖 第 1 页 / 共 2 页
字号:
                    }
                }
                if(strlen(ch)==1)
                {
                    for(i=0;i<strlen(ch);i++)
                            {
                                k=ch[i]-'0';
                                answer=answer+k*pow(10,strlen(ch)-i-1);
                            }
                            nuattr=answer;
                            return 15;

                }
            }
            else
            {
                strcpy(attr,ch);
                return 18;
            }
        }
    }
}
int S()
{
    int c,s1,ss,e;
    if(strcmp(ech[now],"if")==0)
    {
        if(label==0)
        {
            newlabel(Snext);
            newlabel(Sbegin);
            printf("\n%s:\n",Sbegin);
        }
        else
        {
            strcpy(Sbegin,Ctrue);
        }

        newlabel(Ctrue);
        strcpy(Cfalse,Snext);



        now++;
        c=C();
        if(c==0)
        {
            return 0;
        }
        if(strcmp(ech[now],"then")==0)
        {
            now++;
            if(strcmp(ech[now],"i")==0||strcmp(ech[now],"if")==0)
            {
                printf("\n%s:\n",Ctrue);
            }
            s1=S();
            if(s1==0)
            {
                return 0;
            }
            ss=SS();
            if(ss==0)
            {
                return 0;
            }
            else
            {
                return 1;
            }
        }
    }
    if(strcmp(ech[now],"i")==0)
    {
        strcpy(idplace,echattr[now]);
        now++;
        if(strcmp(ech[now],"=")==0)
        {
            now++;
            e=E();
            strcpy(Scode,Ecode);                                 /*aaaaaaaaaaaaaaa*/
            printf("   %s=%s\n",idplace,Eplace);
            printf("   goto%s",Sbegin);
            if(e==0)
            {
                return 0;
            }
            else
            {
                return 1;
            }
        }
        return 0;
    }
    if(strcmp(ech[now],"while")==0)
    {
        now++;

        if(label==0)
        {
            newlabel(Snext);
            newlabel(Sbegin);
        }
        else
        {
            strcpy(Sbegin,Ctrue);
        }
        newlabel(Ctrue);
        strcpy(Cfalse,Snext);
        strcpy(S1next,Sbegin);

        printf("\n%s:\n",Sbegin);

        c=C();



        if(c==0)
        {
            return 0;
        }
        if(strcmp(ech[now],"do")==0)
        {
            now++;

            if(strcmp(ech[now],"while")!=0)
            {
                printf("\n%s:\n",Ctrue);
            }
            strcpy(Snext,S1next);
            s1=S();



            if(s1==0)
            {
                return 0;
            }
            else
            {
                return 1;
            }
        }
    }
    return 0;
}
int SS()
{
    int s;
    if(strcmp(ech[now],"else")==0)
    {
        now++;
        s=S();
        if(s==0)
        {
            return 0;
        }
        else
        {
            return 1;
        }
    }
    if(strcmp(ech[now],"#")==0)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
int C()
{
    int cc,e;
    e=E();
    strcpy(E1place,Eplace);           /*aaaaaaaaaaaaaa*/
    strcpy(E1code,Ecode);
    if(e==0)
    {
        return 0;
    }
    cc=CC();
    if(cc==0)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}
int CC()
{
    int e;
    if(strcmp(ech[now],">")==0)
    {
        now++;
        e=E();
        strcpy(E2place,Eplace);           /*aaaaaaaaaaaaaa*/
        strcpy(E2code,Ecode);
        printf("   if %s>%s goto %s \n   goto %s",E1place,E2place,Ctrue,Cfalse);
        if(e==0)
        {
            return 0;
        }
        else
        {
            return 1;
        }
    }
    if(strcmp(ech[now],"<")==0)
    {
        now++;
        e=E();
        strcpy(E2place,Eplace);           /*aaaaaaaaaaaaaa*/
        strcpy(E2code,Ecode);
        printf("   if %s<%s goto %s \n   goto %s",E1place,E2place,Ctrue,Cfalse);
        if(e==0)
        {
            return 0;
        }
        else
        {
            return 1;
        }
    }
    if(strcmp(ech[now],"=")==0)
    {
        now++;
        e=E();
        strcpy(E2place,Eplace);           /*aaaaaaaaaaaaaa*/
        strcpy(E2code,Ecode);
        printf("   if %s=%s goto %s \n   goto %s",E1place,E2place,Ctrue,Cfalse);
        if(e==0)
        {
            return 0;
        }
        else
        {
            return 1;
        }
    }
    else
    {
        return 0;
    }
}
int E()
{
    int t,ee;
    t=T();
    strcpy(Eplace,Tplace);                /*aaaaaaaaaaaa*/
    strcpy(Ecode,Tcode);
    if(t==0)
    {
        return 0;
    }
    ee=EE();
    if(ee==0)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}
int T()
{
    int f,tt;
    f=F();
    strcpy(Tplace,Fplace);                /*aaaaaaaaaaaa*/
    strcpy(Tcode,Fcode);
    if(f==0)
    {
        return 0;
    }
    tt=TT();
    if(tt==0)
    {
        return 0;
    }
    else
    {
        return 1;
    }

}
int TT()
{
    int f,tt;
    if(strcmp(ech[now],"*")==0)
    {   
        strcpy(TTplace,Tplace);
        strcpy(TTcode,Tcode);
        newtemp(Tplace);                            /*aaaaaaaaaaaa*/
        now++;
        f=F();
        strcpy(Tcode,TTcode);                       /*aaaaaaaaaaaa*/
        strcat(Tcode,Fcode);
        printf("   %s=%s*%s\n",Tplace,TTplace,Fplace);
        if(f==0)
        {   
            return 0;
        }
        tt=TT();
        if(tt==0)
        {
            return 0;
        }
        else
        {
            return 1;
        }

    }
    if(strcmp(ech[now],"/")==0)
    {   
        strcpy(TTplace,Tplace);
        strcpy(TTcode,Tcode);
        newtemp(Tplace);                            /*aaaaaaaaaaaa*/
        now++;
        f=F();
        strcpy(Tcode,TTcode);                       /*aaaaaaaaaaaa*/
        strcat(Tcode,Fcode);
        printf("   %s=%s/%s\n",Tplace,TTplace,Fplace);
        if(f==0)
        {   
            return 0;
        }
        tt=TT();
        if(tt==0)
        {
            return 0;
        }
        else
        {

            return 1;
        }
    }
    else
    {
        return 1;
    }
}
int EE()
{
    int t,ee;
    if(strcmp(ech[now],"+")==0)
    {   
        strcpy(EEplace,Eplace);
        strcpy(EEcode,Ecode);
        newtemp(Eplace);                            /*aaaaaaaaaaaa*/
        now++;
        t=T();
        strcpy(Ecode,EEcode);                       /*aaaaaaaaaaaa*/
        strcat(Ecode,Tcode);
        printf("   %s=%s+%s\n",Eplace,EEplace,Tplace);
        if(t==0)
        {   
            return 0;
        }
        ee=EE();
        if(ee==0)
        {
            return 0;
        }
        else
        {
            return 1;
        }
    }
    if(strcmp(ech[now],"-")==0)
    {   
        strcpy(EEplace,Eplace);
        strcpy(EEcode,Ecode);
        newtemp(Eplace);                            /*aaaaaaaaaaaa*/
        now++;
        t=T();
        strcpy(Ecode,EEcode);                       /*aaaaaaaaaaaa*/
        strcat(Ecode,Tcode);
        printf("   %s=%s-%s\n",Eplace,EEplace,Tplace);
        if(t==0)
        {   
            return 0;
        }
        ee=EE();
        if(ee==0)
        {
            return 0;
        }
        else
        {
            return 1;
        }
    }
    else
    {
        return 1;
    }
}
int F()
{
    int e=0;
    if(strcmp(ech[now],"(")==0)
    {
        now++;
        e=E();
        strcpy(Fplace,Eplace);                 /*aaaaaaaaaaaa*/
        strcpy(Fcode,Ecode);
        if(e==0)
        {
            return 0;
        }
        if(strcmp(ech[now],")")==0)
        {
            now++;
            return 1;
        }
        else
        {
            return 0;
        }
    }
    if(strcmp(ech[now],"i")==0)
    {
        strcpy(Fplace,echattr[now]);             /*aaaaaaaaaaaa*/
        strcpy(Fcode,"");
        now++;
        return 1;
    }
    if(strcmp(ech[now],"int8")==0)
    {
        strcpy(Fplace,echattr[now]);            /*aaaaaaaaaaaa*/
        strcpy(Fcode,"");
        now++;
        return 1;
    }
    if(strcmp(ech[now],"int10")==0)
    {
        strcpy(Fplace,echattr[now]);            /*aaaaaaaaaaaa*/
        strcpy(Fcode,"");
        now++;
        return 1;
    }
    if(strcmp(ech[now],"int16")==0)
    {
        strcpy(Fplace,echattr[now]);            /*aaaaaaaaaaaa*/
        strcpy(Fcode,"");
        now++;
        return 1;
    }

    else
    {
        return 0;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -