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

📄 ll(1).txt

📁 ll1文法分析。输入要分析的符号串
💻 TXT
字号:
void main()
{
Stack stack;
InitStack(&stack);
Analysis(&stack);

return;
}


void InitStack(Stack *LptoStack)
{

LptoStack->base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
if(LptoStack->base==NULL)
{
   printf("Lack of memory,exit!");
   return;
}
LptoStack->top=LptoStack->base;
LptoStack->stacksize=STACK_INIT_SIZE;
}

void Push(Stack *LptoStack,char ch)
{
if(LptoStack->top-LptoStack->base>=LptoStack->stacksize)
{
   LptoStack->base=(char *)realloc(LptoStack->base,(LptoStack->stacksize+STACKINCREMENT)*sizeof(char));
        if(!LptoStack->base)
   {
    printf("Lack of memory!");
    return;
   }
   LptoStack->top=LptoStack->base+LptoStack->stacksize;
   LptoStack->stacksize+=STACKINCREMENT;
}
*(LptoStack->top++)=ch;
}

char Pop(Stack *LptoStack)
{

if(LptoStack->base==LptoStack->top)
{
   printf("ERROR!"); return -1;
}
return *(--LptoStack->top);
}

int IsTerminal(char X)
{
if(X>='a' && X<='z' || X=='+'||X=='*' || X=='(' || X==')')
   return 1;
else return 0;
}

void Read(char buffer[])
{
int i=0;
char ch;
FILE *fpin;
fpin=fopen("in.txt","rb");
if(fpin==NULL)
{
   printf("Can't open the input file!");
   return;
}
ch=fgetc(fpin);
while(!feof(fpin) && ch!=EOF)
{
   buffer[i++]=ch;
   ch=fgetc(fpin);
}
fclose(fpin);

}

void Print(Stack *LptoStack,char buffer[],int k )
{
char *pointer;
if(flag)
{
   flag=0;
   printf("\n\n ----------------------------------\n");
   printf("   步骤        分析栈      剩余输入串 \n");
   printf(" -----------------------------------\n");
}
printf("   %i         ",buzhou++);
pointer=LptoStack->base;
//while(pointer!=LptoStack->top)
//printf("%c",*pointer++);
do
{
   printf("%c",*pointer++);
}while(pointer<LptoStack->top);
printf("        ");
while(k<=strlen(buffer))
    printf("%c",buffer[k++]);
printf(" \n");

}

int LetterToDigital1(char X)
{
switch(X)
{
case 'E': return 0; break;
case 'M':   return 1; break;
    case 'T': return 2; break;
case 'N': return 3; break;
case 'F':   return 4; break;
    default:
   return -1; break;
}
}

int LetterToDigital2(char a)
{
switch(a)
{
case 'i':return 0; break;
    case '+':return 1; break;
case '*':return 2; break;
case '(':return 3; break;
    case ')':return 4; break;
    case '#':return 5; break;
    default:
   return -1; break; 
}
}
void Analysis(Stack *LptoStack)
{
char *str="@";
char buffer[20]={'\0'};//保存从文件读入的字符串
Read(buffer);///
printf("以下是对%s符号串的分析过程!",buffer);
int j;
int k=0;
int digital1,digital2;
    char a=buffer[k++];
char X; //保存弹出的字符
char *M[5][6]={NULL}; //保存字符串的头指针
    M[0][0]="TM";   M[0][3]="TM";
M[1][1]="+TM";   M[1][4]="@"; M[1][5]="@";
M[2][0]="FN";   M[2][3]="FN";
M[3][1]="@";    M[3][2]="*FN"; M[3][4]="@"; M[3][5]="@"; 
M[4][0]="i";     M[4][3]="(E)";

/////////////////////////////////////////
    Push(LptoStack,'#');
Push(LptoStack,'E');
Print(LptoStack,buffer,k-1);
while(1)
{
   X=Pop(LptoStack);//上托栈顶符号放入X
   if(IsTerminal(X) )
   {
    if(X==a)
    { 
     a=buffer[k++];
     Print(LptoStack,buffer,k-1);
     //Push(LptoStack,X);
              continue;
    }
    //Print();//最右出错输出
   }//
   if(X=='#')
   {
    if(X==a) 
    {
     Print(LptoStack,buffer,k-1);//输出分析成功
       return;//结束
    }
    //Print();//最右错误输出
   }

        digital1=LetterToDigital1(X);
   digital2=LetterToDigital2(a);
   if(M[digital1][digital2]!='\0')
   {
    //逆序进栈
    if(strcmp(M[digital1][digital2],str)!=0) 
    {
            j=strlen(M[digital1][digital2]);
    while(j--!=0) Push(LptoStack,M[digital1][digital2][j]);
    Print(LptoStack,buffer,k-1);                                                                  
    continue;
    }
    //Pop(LptoStack);
    continue;
   }
   printf("分析到此处出错,没有相匹配的文法");

   return;
}
}

⌨️ 快捷键说明

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