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

📄 by4.cpp

📁 一个算符优先的算法
💻 CPP
字号:
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<stdarg.h>
#include<stdlib.h>

#define PLUS 0
#define MINUS 1
#define TIMES 2
#define DIV 3
#define LP 4
#define RP 5
#define ID 6
#define ED 7		//#
#define E 8
#define T 9
#define F 10


FILE *fp;
int inputline[10];
int stack[20];
int top=-1;
int count=0;

/* -------------------------------- */ 
/*     +   -   *   /   (   )   i   #  */ 
/* +   >   >   <   <   <   >   <   >  */ 
/* -   >   >   <   <   <   >   <   >  */ 
/* *   >   >   >   >   <   >   <   >  */ 
/* /   >   >   >   >   <   >   <   >  */ 
/* (   <   <   <   <   <   =   <   ?  */ 
/* )   >   >   >   >   ?   >   ?   >  */ 
/* i   >   >   >   >   ?   >   ?   >   */ 
/* #   <   <   <   <   <   ?   <   =  */ 
/* -------------------------------- */ 
/****************************************/ 

int table[8][8]={{1,1,-1,-1,-1,1,-1,1}, 
    {1,1,-1,-1,-1,1,-1,1}, 
    {1,1,1,1,-1,1,-1,1}, 
    {1,1,1,1,-1,1,-1,1}, 
    {-1,-1,-1,-1,-1,0,-1,1}, 
    {1,1,1,1,0,1,0,1}, 
    {1,1,1,1,0,1,0,1}, 
    {-1,-1,-1,-1,-1,-1,-1,0}};	/*存储算符优先关系表,大于为1,小于是-1,等于或表示出错为0*/ 

int exp[8][3]={{8,0,9},{8,1,9},{9,20,20},
{9,2,10},{9,3,10},{10,20,20},
{4,8,5},{6,20,20}
};

int explen[8]={3,3,1,3,3,1,3,1};


void readFF(){		//将字符编码转换为数字,存储在inputline[]中
char ch;
char t[4];
int i=0;
int j=0;
int bianma;

   ch=fgetc(fp);
   while(ch!=EOF){
	   i=0;
	while((ch!='(')&&(ch!=EOF))
	ch=fgetc(fp);

	if(ch!=EOF)
	ch=fgetc(fp);

	while((ch!=',')&&(ch!=EOF))
	{
		t[i]=ch;
		i++;
		ch=fgetc(fp);
	}
	t[i]='\0';
	bianma=atoi(t);

	if(ch!=EOF){
	inputline[j]=bianma;
	j++;}

	ch=fgetc(fp);
   }
	j=0;
	while(inputline[j]!=7){
		printf("%d ",inputline[j]);
		j++;
	}
				printf("\n");

}

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


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

int isVt(int a){
if((a>=0)&&(a<=7))
	return 1;		//是Vt
else return 0;
}


int isHigherThan(int a,int b){
if(table[a][b]==1)
	return 1;		//a>b
else return 0;
}

int isLowerThan(int a,int b){
if(table[a][b]==-1)
	return 1;		//a<b
else return 0;
}


int isEqualTo(int a,int b){
if(table[a][b]==0)
	return 1;		//a=b
else return 0;
}


int reduce(int begin,int end,int len){
int temp;
int Vn;
int i;
//count++;
//printf("%d\n",count);
if(len==3){
	temp=stack[begin+1];
	switch(temp){
	case 0:Vn=8;break;
	case 1:Vn=8;break;
	case 2:Vn=9;break;
	case 3:Vn=9;break;
	case 8:{
		if((stack[begin]==4)&&(stack[end]==5))
			Vn=10;
		else printf("err1\n");
		break;
		   }
	default:printf("err2\n");
	}
}
else if(len==1)
{temp=stack[begin];
switch(temp){
	case 9:Vn=8;break;
	case 10:Vn=9;break;
	case 6:Vn=10;break;
	default:printf("err3\n");
}
}
else printf("err4\n");

for(i=0;i<len;i++)
pop();

return Vn;
}


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

}
			printf("\n");

}


int parser(){
int m,n,r,newVn;
int tt;
m=0; 
push(7);	//#
do{
	n=top;
	int j;
	r=inputline[m++];
	if(isVt(stack[n]))	j=n;  else  j=n-1;  
//	t1=j;
	while(isHigherThan(stack[j],r))
	{
		int q;
		n=top;
		do
		{q=stack[j];
		if(isVt(stack[j-1]))  j--;  else j=j-2;
		}while(!isLowerThan(stack[j],q));
		newVn=reduce(j+1,n,n-j);
		push(newVn);

		printcur();
		/*tt=r;
		do{
			printf("%d ",tt);
		}while(tt!=7);
		printf("\n");*/
//		j=top;
	}//while

	if(isLowerThan(stack[j],r)||isEqualTo(stack[j],r))
		push(r);
	else return 0;
}while(r!=7);
if((stack[0]==7)&&((stack[1]==8)||(stack[1]==9)||(stack[1]==10))&&(stack[2]==7))
return 1;
else return 0;

}



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

⌨️ 快捷键说明

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