📄 ll(1).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 + -