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

📄 expression.c

📁 自己开发的c0文法编译器
💻 C
字号:
#include "world.h"

#define MAXLEN 100
int mem = 0;
char tempstr[BSIZE];
int top=-1;



void factor();
void term();
char *expr();
char * exprbuf[MAXLEN];


char * op(int i)  //表达式中的操作符
{
	char * s = (char *)malloc(10);
	switch(i)
	{
	case minus:strcpy(s,"-");break;
	case plus: strcpy(s,"+");break;
	case multiply: strcpy(s,"*");break;
	case divide: strcpy(s,"/");break;
	case LT:strcpy(s,"<");break;
	case LEQ:strcpy(s,"<=");break;
	case GT:strcpy(s,">");break;
	case GEQ:strcpy(s,">=");break;
	case NEQ:strcpy(s,"!=");break;
	case IS_EQ:strcpy(s,"==");break;

	default: strcpy(s,"existerror");
	}
	return s;	
}

char * newtemp()  //新中间变量
{
	char *s = (char *)malloc(30);
	sprintf(s,"#t%d",mem);
	mem++;
	return s;
}



#define LT 15 //"<"
#define LEQ 16 //"<="
#define GT 17 //">"
#define GEQ 18 //">="
#define NEQ 19//"!="
#define IS_EQ 20//"=="



char * expr (void)  //加减两边是term的结果
{
	int t;

	term();   //表达式中的项
	if(sign==-1)//处理正负号
		nodeadd(nodegenerate("-","0",tempstr,tempstr));//|||
	while(1)
	{
		switch(seehead)
		{
		case minus:case plus:
			{	t= seehead;
			tokenget(1);
			term();
			//push(op(t));
			strcpy(tempstr,newtemp());
			   
	

			nodeadd(nodegenerate(op(t),exprbuf[top-1],exprbuf[top],tempstr));

			top -= 2;  //表达式栈
			push(tempstr);
			//strcpy(exprbuf[top],tempstr);
			continue;
			}
		default:
			{
				return exprbuf[top];
			}
		}
	}
}



void  factor(void)   //因子
{
	int temp,i;
	char tempstr[BSIZE],tempbuffer[BSIZE];
	if(seehead==LK)
	{
		tokenget(0);
		expr();  //括号嵌套,去找下一个表达式
		if(seehead==RK)
		{
			tokenget(0);
		}
		else
		{
			existerror("existerror!",lineno);
		}
	}
	else if(seehead==NUM)
	{
		push(buffer);
		tokenget(1);
	//	printf("%s",buffer);
	}
	else if(seehead==ID)
	{
		strcpy(tempbuffer,buffer);
		tokenget(1);
		if(seehead==LK)
		{
			tokenget(0);
			if((temp=lookup_function(tempbuffer))!=-1)
			{
				i = 0;
				if(seehead!=RK)
				{	
					strcpy(tempstr,expr());


						
					nodeadd(nodegenerate("value=",tempstr,"",funTable[temp].paraname[i]));

					i++;

					while(seehead!=RK)
					{
					
				
						tokenget(0);
						strcpy(tempstr,expr());
						if(i < funTable[temp].paranum)
						{
							nodeadd(nodegenerate("=",tempstr,"",funTable[temp].paraname[i]));

			
						}
						else
						{
							i++;
						}

					}
				}
				if(seehead==RK)
				{
					tokenget(0);
					if(i==funTable[temp].paranum)
					{
						if(funTable[temp].returnKind == INT)
						{
							strcpy(tempstr,newtemp());
						

							nodeadd(nodegenerate("Callvalue",tempbuffer,"",tempstr));

							push(tempstr);
						}
						else
						{
							existerror("funcRegist return mode not right",lineno);
						}

					}
					else
					{
					
						existerror("calling funcRegist existerror!",lineno);
					}
				}
				else
				{
					existerror("calling funcRegist existerror!",lineno);

				}
			}
			else
			{
				while(seehead!=RK)
				{
					tokenget(0);
				}
				tokenget(0);
				existerror("the funcRegist called undefined!",lineno);

			}
		}
		else
		{
			push(tempbuffer);
			if(lookforward(tempbuffer,funNum)==-1)
			{
		
			//	existerror("variable undefined!",lineno);
			}
		}
	}
}






void term(void)  //乘法两边是因子
{
	int t;
	factor();
	while(1)
	{
		switch(seehead)
		{
		case multiply:case divide:
			t = seehead;
			tokenget(0);
			factor();
			strcpy(tempstr,newtemp());


			nodeadd(nodegenerate(op(t),exprbuf[top-1],exprbuf[top],tempstr));

			top -= 2;
			push(tempstr);
			continue;
		default :return ;
		}
	}
}

⌨️ 快捷键说明

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