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

📄 sandizhi.c

📁 一款简单的语义分析器
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
char input[200],mech[10];        /*input,存放最先输入的字符串,在输入的过程中,就进行了预处理*/
char ech[100][10];
char echattr[100][10];
char nch[10];
char Fplace[10],Eplace[10],Tplace[10],TTplace[10],EEplace[10],E1place[10],E2place[10],idplace[10],Splace[10],Snext[10],Ctrue[10],Cfalse[10],Sbegin[10];
char S1next[10],S2next[10];
char Fcode[50],Ecode[50],Tcode[50],TTcode[50],EEcode[50],E1code[50],E2code[50],idcode[50],Scode[50],Ccode[50];
int temp=1;
int label=0;
int stack;
int nuattr;
int flag=0;
char attr[10];
int number=0;
int now;
void init(char *ch)
{
    char newc[10];
    newc[0]=NULL;
    strcpy(ch,newc);
}
int S();
int SS();
int E();
int C();
int CC();
int T();
int TT();
int EE();
int F();
int scan();
void newtemp(char *ch)
{
    sprintf(attr,"%d",temp);
    strcpy(ch,"t");
    strcat(ch,attr);
    temp++;
}
void newlabel(char *ch)
{
    sprintf(attr,"%d",label);
    strcpy(ch,"L");
    strcat(ch,attr);
    label++;
}
main()
{
    int i=0,j=0,t;
    char c;
    char c1[2];
	char b[20];
	FILE* fp;
    c1[1]='\0';
    printf("请输入要分析的文件:");   
	scanf("%s",b);
	fp=fopen(b,"a+");
    do
    {
        c=fgetc(fp);
        if(c==' ')
        {
            if(i==0)
            {
                while(c==' ')
                {
                    c=fgetc(fp);
                }
                input[i]=c;
                i++;
            }
            else
            {
                while(c==' ')
                {
                    c=fgetc(fp);
                }
                input[i]=' ';
                i++;
                input[i]=c;
                i++;
            }
        }
        else
        {
            input[i]=c;
            i++;
        }
    }while(c!='$');    ///////////////////////////////
	fclose(fp);
    i=0;
    while(input[i]!='$')
    {
        c1[0]=input[i];
        if(c1[0]=='+'||c1[0]=='-'||c1[0]=='*'||c1[0]=='/'||c1[0]=='>'||c1[0]=='<'||c1[0]=='='||c1[0]=='('||c1[0]==')')
        {
            if(strlen(mech)!=0)
            {
                t=scan(mech);
                if(t==15)
                {
                    sprintf(attr,"%d",nuattr);
                    strcpy(echattr[j],attr);
                    strcpy(mech,"int10");
                }
                if(t==16)
                {
                    sprintf(attr,"%d",nuattr);
                    strcpy(echattr[j],attr);
                    strcpy(mech,"int16");
                }
                if(t==17)
                {
                    sprintf(attr,"%d",nuattr);
                    strcpy(echattr[j],attr);
                    strcpy(mech,"int8");
                }
                if(t==18)
                {
                    strcpy(echattr[j],attr);
                    strcpy(mech,"i");
                }
                strcpy(ech[j],mech);
                strcpy(echattr[j],attr);
                j++;
                init(mech);
                strcat(mech,c1);
                t=scan(mech);
                if(t==15)
                {
                    sprintf(attr,"%d",nuattr);
                    strcpy(echattr[j],attr);
                    strcpy(mech,"int10");
                }
                if(t==16)
                {
                    sprintf(attr,"%d",nuattr);
                    strcpy(echattr[j],attr);
                    strcpy(mech,"int16");
                }
                if(t==17)
                {
                    sprintf(attr,"%d",nuattr);
                    strcpy(echattr[j],attr);
                    strcpy(mech,"int8");
                }
                if(t==18)
                {
                    strcpy(echattr[j],attr);
                    strcpy(mech,"i");
                }
                strcpy(ech[j],mech);
                strcpy(echattr[j],attr);
                j++;
                init(mech);
            }
            else
            {
                strcat(mech,c1);
                t=scan(mech);
                if(t==15)
                {
                    sprintf(attr,"%d",nuattr);
                    strcpy(echattr[j],attr);
                    strcpy(mech,"int10");
                }
                if(t==16)
                {
                    sprintf(attr,"%d",nuattr);
                    strcpy(echattr[j],attr);
                    strcpy(mech,"int16");
                }
                if(t==17)
                {
                    sprintf(attr,"%d",nuattr);
                    strcpy(echattr[j],attr);
                    strcpy(mech,"int8");
                }
                if(t==18)
                {
                    strcpy(echattr[j],attr);
                    strcpy(mech,"i");
                }
                strcpy(ech[j],mech);
                strcpy(echattr[j],attr);
                j++;
                init(mech);
            }
            i++;
            continue;
        }
        if(c1[0]==' ')
        {
            if(strlen(mech)!=0)
            {
                t=scan(mech);
                if(t==15)
                {
                    sprintf(attr,"%d",nuattr);
                    strcpy(echattr[j],attr);
                    strcpy(mech,"int10");
                }
                if(t==16)
                {
                    sprintf(attr,"%d",nuattr);
                    strcpy(echattr[j],attr);
                    strcpy(mech,"int16");
                }
                if(t==17)
                {
                    sprintf(attr,"%d",nuattr);
                    strcpy(echattr[j],attr);
                    strcpy(mech,"int8");
                }
                if(t==18)
                {
                    strcpy(echattr[j],attr);
                    strcpy(mech,"i");
                }
                strcpy(ech[j],mech);
                strcpy(echattr[j],attr);
                j++;
                init(mech);
            }
        }
        else
        {
            strcat(mech,c1);
        }
        i++;
    }
    if(strlen(mech)!=0)
    {
        t=scan(mech);
                if(t==15)
                {
                    sprintf(attr,"%d",nuattr);
                    strcpy(echattr[j],attr);
                    strcpy(mech,"int10");
                }
                if(t==16)
                {
                    sprintf(attr,"%d",nuattr);
                    strcpy(echattr[j],attr);
                    strcpy(mech,"int16");
                }
                if(t==17)
                {
                    sprintf(attr,"%d",nuattr);
                    strcpy(echattr[j],attr);
                    strcpy(mech,"int8");
                }
                if(t==18)
                {
                    strcpy(echattr[j],attr);
                    strcpy(mech,"i");
                }
                strcpy(ech[j],mech);
                strcpy(echattr[j],attr);
                j++;
    }
    strcpy(ech[j],"$");
    number=j+1;
    now=0;
    j=S();
    printf("\nL0:\t//  S.next");

    if(j==1)
    {
        printf("\ntrue\n");
    }
    else
    {
        printf("\nfalse\n");
    }
    j=0;
    getch();
}
int scan(char *ch)
{
    char *k1="if";
    char *k2="then";
    char *k3="else";
    char *k4="while";
    char *k5="do";
    char *k6="+";
    char *k7="-";
    char *k8="*";
    char *k9="/";
    char *k10=">";
    char *k11="<";
    char *k12="=";
    char *k13="(";
    char *k14=")";
    int judge;
    int i=1,k;
    int answer=0;
    if(strcmp(ch,k1)==0)
    {
        strcpy(attr,ch);
        return 1;
    }
    if(strcmp(ch,k2)==0)
    {
        strcpy(attr,ch);
        return 2;
    }
    if(strcmp(ch,k3)==0)
    {
        strcpy(attr,ch);
        return 3;
    }
    if(strcmp(ch,k4)==0)
    {
        strcpy(attr,ch);
        return 4;
    }
    if(strcmp(ch,k5)==0)
    {
        strcpy(attr,ch);
        return 5;
    }
    else
    {
        if(strcmp(ch,k6)==0)
        {
            strcpy(attr,ch);
            return 6;
        }
        if(strcmp(ch,k7)==0)
        {
            strcpy(attr,ch);
            return 7;
        }
        if(strcmp(ch,k8)==0)
        {
            strcpy(attr,ch);
            return 8;
        }
        if(strcmp(ch,k9)==0)
        {
           strcpy(attr,ch);
           return 9;
        }
        if(strcmp(ch,k10)==0)
        {
            strcpy(attr,ch);
            return 10;
        }
        if(strcmp(ch,k11)==0)
        {
            strcpy(attr,ch);
            return 11;
        }
        if(strcmp(ch,k12)==0)
        {
            strcpy(attr,ch);
            return 12;
        }
        if(strcmp(ch,k13)==0)
        {
            strcpy(attr,ch);
            return 13;
        }
        if(strcmp(ch,k14)==0)
        {
            strcpy(attr,ch);
            return 14;
        }
        else
        {
            if(isdigit(ch[0])==2)                  ///////
            {
                if(strlen(ch)>1)
                {
                    if(strlen(ch)>2)
                    {
                        if(ch[1]=='x')
                        {
                            i=2;
                            judge=1;
                            while(ch[i]!=NULL)
                            {
                                if(isxdigit(ch[i])==0)
                                {
                                    judge=0;
                                }
                                i++;
                            }
                            if(judge==1)
                            {
                                for(i=2;i<strlen(ch);i++)
                                {
                                    if(ch[i]>='0'&&ch[i]<='9')
                                    {
                                        k=ch[i]-'0';
                                    }
                                    else
                                    {
                                        k=ch[i]-'W';
                                    }
                                    answer=answer+k*pow(16,strlen(ch)-i-1);
                                }
                                    nuattr=answer;
                                    return 16;
                            }
                            else
                            {
                                strcpy(attr,ch);
                                return 18;
                            }
                        }
                    }
                    if(ch[0]=='0')
                    {
                        i=1;
                        judge=1;
                        while(ch[i]!=NULL)
                        {
                            if(isxdigit(ch[i])==0)
                            {
                                judge=0;
                            }
                            i++;
                        }
                        if(judge==1)
                        {
                            for(i=0;i<strlen(ch);i++)
                            {
                                k=ch[i]-'0';
                                answer=answer+k*pow(8,strlen(ch)-i-1);
                            }
                            nuattr=answer;
                            return 17;
                        }
                    }
                    else
                    {
                        i=1;
                        judge=1;
                        while(ch[i]!=NULL)
                        {
                            if(isxdigit(ch[i])==0)
                            {
                                judge=0;
                            }
                            i++;
                        }
                        if(judge==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;
                        }

⌨️ 快捷键说明

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