/* 项处理 */
int term(bool* fsys,int* ptx,int lev) /* 参数意义见block和enter函数 */
{
enum symbol mulop; /* 用于保存乘除法符号 */
bool nxtlev[symnum];
memcpy(nxtlev,fsys,sizeof(bool)*symnum);
nxtlev[times]=true;
nxtlev[slash]=true;
factordo(nxtlev,ptx,lev); /* 处理因子 */
while(sym==times||sym==slash)
{
mulop=sym;
getsymdo;
factordo(nxtlev,ptx,lev);
if(mulop==times)
{
gendo(opr,0,4); /* 生成乘法指令 */
}
else
{
gendo(opr,0,5); /* 生成除法指令 */
}
}
return 0;
}
/* 因子处理 */
int factor(bool* fsys,int* ptx,int lev) /* 参数意义见block和enter函数 */
{
int i;
bool nxtlev[symnum];
testdo(facbegsys,fsys,24); /* 检测因子的开始符号 */
while(inset(sym,facbegsys)) /* 循环直到不是因子开始符号 */
{
if(sym==ident) /* 因子为常量或变量 */
{
i=postion(id,*ptx); /* 查找名字 */
if(i==0)error(11); /* 名字未声明 */
else
{
switch(table[i].kind)
{
case constant: /* 名字为常量 */
gendo(lit,0,table[i].val); /* 直接把常量的值入栈 */
break;
case variable: /* 名字为变量 */
gendo(lod,lev-table[i].level,table[i].adr); /* 找到变量地址并将其值入栈 */
break;
case procedur: /* 名字为过程 */
error(21); /* 不能为过程 */
break;
}
}
getsymdo;
}
else
{
if(sym==number) /* 因子为数 */
{
if(num>amax)
{
error(31);
num=0;
}
gendo(lit,0,num);
getsymdo;
}
else
{
if(sym==lparen) /* 因子为表达式 */
{
getsymdo;
memcpy(nxtlev,fsys,sizeof(bool)*symnum);
nxtlev[rparen]=true;
expressiondo(nxtlev,ptx,lev);
if(sym==rparen)
{
getsymdo;
}
else error(22); /* 缺少右括号 */
}
test(fsys,facbegsys,23); /* 因子后有非法符号 */
}
}
}
return 0;
}
/* 通过过程活动记录基址求上l层过程的基址活动记录 */
int base(int l,int* s,int b)
{
int b1;
b1=b;
while(l>0)
{
b1=s[b1];
l--;
}
return b1;
}
|