《编译原理》实验指导书
}
/* 因子处理 */
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); else { }
getsymdo;
switch(table[i].kind) { }
case constant:
break;
/* 名字为变量 */
/* 找到变量地址并
gendo(lod,lev-table[i].level,table[i].adr); break;
/* 名字为过程 */ /* 不能为过程 */
error(21); break;
/* 名字为常量 */
gendo(lit,0,table[i].val); /* 直接把常量的值入栈 */
/* 查找名字 */
if(i==0)error(11); /* 名字未声明 */
/* 因子为常量或变量 */
} return 0;
mulop=sym; getsymdo;
factordo(nxtlev,ptx,lev); if(mulop==times) { } else { }
gendo(opr,0,5);
/* 生成除法指令 */
gendo(opr,0,4);
/* 生成乘法指令 */
case variable:
将其值入栈 */
case procedur:
《编译原理》课程组 35 of 37
《编译原理》实验指导书
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;
}
《编译原理》课程组 36 of 37