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

📄 by3.cpp

📁 LL1语法程序
💻 CPP
字号:
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<stdarg.h>
#include<stdlib.h>

#define ID 0
#define PLUS 1
#define MINUS 2
#define TIMES 3
#define DIV 4
#define LP 5
#define RP 6
#define ED 7		//#
#define E 8
#define E1 9
#define T 10
#define T1 11
#define F 12
#define A 13
#define M 14
  

				// i,+,-,*,/,(,),#
int martrix[7][8]={{1,0,0,0,0,1,0,0},
{0,2,2,0,0,0,11,11},{3,0,0,0,0,3,0,0,},
{0,11,11,4,4,0,11,11},{6,0,0,0,0,5,0,0},
{0,7,8,0,0,0,0,0},{0,0,0,9,10,0,0,0}
};//E,E',T,T',F,A,M,数字代表表达式编号,0出错,epsilon11

int exp[11][4]={{10,9,20,20},{13,10,9,20},{12,11,20,20},
{14,12,11,20},{5,8,6,20},{0,20,20,20},{1,20,20,20},
{2,20,20,20},{3,20,20,20},{4,20,20,20},{20,20,20,20}
};//数字代表非终结符符号编码,20为空,有VN,有VT

int top=-1;
int stack[20];
int remain;              //
int error_flag=0;           //
char ch;
FILE *fp;



void push(int i){			//入栈
	top++;
	stack[top]=i;
}


void pop(){					//出栈
	top--;
}


void printcur(){			//打印分析栈中的内容
int m;
m=0;
int alph;
while(m<=top){
	alph=stack[m];
	switch(alph)
	{
	case 0:printf("i");break;
	case 1:printf("+");break;
	case 2:printf("-");break;
	case 3:printf("*");break;
	case 4:printf("/");break;
	case 5:printf("(");break;
	case 6:printf(")");break;
	case 7:printf("#");break;
	case 8:printf("E");break;
	case 9:printf("E'");break;
	case 10:printf("T");break;
	case 11:printf("T'");break;
	case 12:printf("F");break;
	case 13:printf("A");break;
	case 14:printf("M");break;

	}
	m++;
}
printf("\n");
}



int advance(){
char t[2];
int i=0;
int bianma;
ch=fgetc(fp);
while((ch!='(')&&(ch!=EOF))
	ch=fgetc(fp);
ch=fgetc(fp);
if(ch!=EOF)
{
	t[0]=ch;
	i++;
}
t[i]='\0';
bianma=atoi(t);      //将一个文件转化为数字
return bianma;
}//取二元式中的数字


void check(){
   
   int t;
   int i1=0;
   int expbm;
   int j=0;
   int n;
   char fir[2];

   push(ED);
   push(E);
   
   printcur();

   ch=fgetc(fp);
   while((ch!='(')&&(ch!=EOF))
	ch=fgetc(fp);
   ch=fgetc(fp);
   if(ch!=EOF)
   {
	fir[0]=ch;
	i1++;
   }
   fir[i1]='\0';
   remain=atoi(fir);

   while(ch!=EOF){
	   if((remain==7)&&(stack[top]==7)){
		   error_flag=0;
		   return;
	  }

     else if((stack[top]>=8)&&(stack[top]<=14))	//非终结
	 {
	   t=stack[top]-8;
	   expbm=martrix[t][remain];

       if(expbm==0)			//出错
	   {
	   printf("不能匹配\n");
	   error_flag=1;
	   return;
	   }
	   else{
	      pop();
	      while(exp[expbm-1][j]!=20)
		    j++;
	      j--;//此处j为产生式的长度
          for(n=j;n>=0;n--)
		    push(exp[expbm-1][n]); //从Yk-Y1压栈
	   }
	   printcur();
		j=0;
	 }
     else					//终结符
	 {
	   if(stack[top]==remain){
			pop();
			remain=advance();
	   }
	   else
	   {
	   printf("不能匹配\n");
	   error_flag=1;
	   return;
	   }
	   printcur();
	 }
   }//while
}



void main(){
fp=fopen("test.txt","r");
if(fp==NULL)
  printf("cannot open file\n");
else check();

if(error_flag==0)
printf("匹配成功\n");
}

⌨️ 快捷键说明

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