📄 expression.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 + -