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

📄 ll(1)v(over new)v12.c

📁 一个关于LL(1)的分析器 希望对大家有一点帮助
💻 C
字号:
#include<stdio.h>
#include<string.h>
#include <conio.h>
#define VNlength 20
#define VTlength 20
#define length 20

 FILE *fp;
char VNmember[VNlength];
char VTmember[VTlength];
int VNnum=0,VTnum=0;


struct content
{
    char data[VTlength][length];
};
typedef struct content preTable;



typedef char DataType;
typedef int position;
typedef struct node
{
  DataType info;
  struct node *link;
}*Stack;



void storeVN_VT()
{
    strcpy(VNmember,"EMTNF");
    VNnum=5;
    strcpy(VTmember,"i+*()");
    VTnum=5;
}



int judgeVNnum(char ch)
{
    int i;
     for(i=0;i<VNnum;i++)
     {
        if(VNmember[i]==ch)
            return i;
     }
     return VNnum+1;
}



int judgeVTnum(char ch)
{
    int i;
    if(ch=='#')     return VTnum;
    for(i=0;i<VTnum;i++)
     {
        if(VTmember[i]==ch)
            return i;
     }
   return VTnum+1;
}

void storePredict(preTable table[VNlength])
{
    preTable *preOne;
    int i; 
    for(i=0;i<VNnum;i++)
    {
        if(i==0)
        {
            strcpy(table[i].data[0],"E->TM");
            strcpy(table[i].data[3],"E->TM");
        }
        else if(i==1)
        {
            strcpy(table[i].data[1],"M->+TM");
            strcpy(table[i].data[4],"M->$");
            strcpy(table[i].data[5],"M->$");
        }
        else if(i==2)
        {
            strcpy(table[i].data[0],"T->FN");
            strcpy(table[i].data[3],"T->FN");
        }
        else if(i==3)
        {
            strcpy(table[i].data[1],"N->$");
            strcpy(table[i].data[2],"N->*FN");
            strcpy(table[i].data[4],"N->$");
            strcpy(table[i].data[5],"N->$");
        }
        else if(i==4)
        {
            strcpy(table[i].data[0],"F->i");
            strcpy(table[i].data[3],"F->(E)");
        }
    }
    if((fp=fopen("store.txt","wb+"))==NULL)
    {exit(0);}
    preOne = table;
    fwrite(preOne,sizeof(struct content),VNnum,fp);

    fclose(fp);
}

void printTable()
{
    int i,j,k;
    preTable *readFile;
    preTable Store[VNlength];
    readFile = Store;
    if((fp=fopen("store.txt","r"))==NULL)
    {exit(0);}
    fread(readFile,sizeof(struct content),VNnum,fp);
    printf("\t");
    for(i=0;i<VTnum;i++)
        printf("%c\t",VTmember[i]);
    printf("#\t\n");
    for(i=0;i<VNnum;i++,readFile++)
        {
            printf("%c\t",VNmember[i]);
            for(j=0;j<VTnum+1;j++)
                {
                    if(!strcmp(readFile->data[j],""))
                    printf("null\t");
                    else
                    printf("%s\t",readFile->data[j]);
                }
                printf("\n");
        }
   fclose(fp);
}  

Stack createNullStack(void)
{
  Stack h;
  h=(Stack)malloc(sizeof(struct node));
  h->link=NULL;
  h->info=5;
  return h;
}

IsEmptyStack(Stack S)
{
    if(S->link==NULL) return 1;
    else return 0;
}


push(Stack S,DataType x)
{
  Stack p;
  p=(Stack)malloc(sizeof(struct node));
  p->info=x;
  p->link=S->link;
  S->link=p;
}

pop(Stack S)
{
  Stack p;
  p=S->link;
  S->link=p->link;
  free(p);
}

DataType top(Stack S)
{
  return S->link->info;
}

void printProcess(preTable table[VNlength],Stack stack,Stack temp,int tag,DataType *input,char VN,int Vt,int line)
{
    char ch,i=0,k,t;
    while(!IsEmptyStack(stack))
    {
        push(temp,top(stack));
        pop(stack);
    }
    if(line==1)
    {
        printf("\n");
        printf("\t Analysis process\n");
        printf("step\tstack\tstring\tmatch\n");
    }
    printf("%d\t",line);
    while(!IsEmptyStack(temp))
    {
        i++;
        ch=top(temp);
        push(stack,ch);
        pop(temp);
        printf("%c",ch);
    }
    for(k=i;k<8;k++) printf(" ");
    i=0;
    for(k=tag;input[k]!='\0';k++) {printf("%c",input[k]); i++;}
    for(k=i;k<8;k++) printf(" ");
    k=judgeVNnum(VN);
    if(k<VNnum&&Vt<=VTnum)  printf("%s",table[k].data[Vt]);
    else if(k>VNnum&&VN==input[tag]&&VN!='#')     printf("\"%c\" match",VN);
    else if(k>VNnum&&VN==input[tag]&&VN=='#')     printf("accept");
    printf("\n");
}

int Analysis(char *input,preTable table[VNlength])
{
    int tag=0,i,flag,k,Vt,l,m,line=1;
    char chFirst;
    Stack strContent,temp;
    strContent=createNullStack();
    temp=createNullStack();
    push(strContent,'#');
    push(strContent,VNmember[0]);
    strcat(input,"#");
    while(1)
    {
        chFirst=top(strContent);
        k=judgeVTnum(chFirst);
        Vt=judgeVTnum(input[tag]);
        printProcess(table,strContent,temp,tag,input,chFirst,Vt,line);
        pop(strContent);
        line++;
        if(k<VTnum)
        {
            if(chFirst!=input[tag]) return 0;
            tag++;
            continue;
        }
        else if(k>VTnum)
        {
            k=judgeVNnum(chFirst);
            if(Vt<VTnum)
            {
                if(!strcmp(table[k].data[Vt],"")) return 0;
            }
            for(i=0;table[k].data[Vt][i]!='\0';i++) {m=i;}
            for(l=m;table[k].data[Vt][l]!='>';l--)
            {
                if(table[k].data[Vt][l]=='$')    break;
                push(strContent,table[k].data[Vt][l]);
            }
            continue;
        }
        else
        {
            if(chFirst!=input[tag]) return 0;
            return 1;
        }
    }
}


void main()
{
    preTable table[VNlength];
    char input[20];
    storeVN_VT();
    storePredict(table);
    printTable();
    printf("Please input the string:\n");
    scanf("%s",input);
    if(!Analysis(input,table))   printf("error!");
    else
        printf("Success.");
    getch();
}

⌨️ 快捷键说明

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