/* 表达式处理 */
int expression(bool* fsys,int* ptx,int lev) /* 参数意义见block和enter函数 */
{
enum symbol addop; /* 用于保存正负号 */
bool nxtlev[symnum];
if(sym==plus||sym==minus) /* 开头的正负号,此时当前表达式被看作一个正的或负的项 */
{
addop=sym; /* 保存开头的正负号 */
getsymdo;
memcpy(nxtlev,fsys,sizeof(bool)*symnum);
nxtlev[plus]=true;
nxtlev[minus]=true;
termdo(nxtlev,ptx,lev); /* 处理项 */
if(addop==minus)gendo(opr,0,1); /* 如果开头为负号生成取负指令 */
}
else /* 此时表达式被看作项的加减 */
{
memcpy(nxtlev,fsys,sizeof(bool)*symnum);
nxtlev[plus]=true;
nxtlev[minus]=true;
termdo(nxtlev,ptx,lev); /* 处理项 */
}
while(sym==plus||sym==minus)
{
addop=sym;
getsymdo;
memcpy(nxtlev,fsys,sizeof(bool)*symnum);
nxtlev[plus]=true;
nxtlev[minus]=true;
termdo(nxtlev,ptx,lev); /* 处理项 */
if(addop==plus)
{
gendo(opr,0,2); /* 生成加法指令 */
}
else gendo(opr,0,3); /* 生成减法指令 */
}
return 0;
}
/* 条件处理 */
int condition(bool* fsys,int* ptx,int lev) /* 参数意义见block和enter函数 */
{
enum symbol relop;
bool nxtlev[symnum];
if(sym==oddsym) /* 准备按照odd运算处理 */
{
getsymdo;
expressiondo(fsys,ptx,lev);
gendo(opr,0,6); /* 生成odd指令 */
}
else
{
/* 逻辑表达式处理 */
memcpy(nxtlev,fsys,sizeof(bool)*symnum);
nxtlev[eql]=true;nxtlev[neq]=true;
nxtlev[lss]=true;nxtlev[leq]=true;
nxtlev[gtr]=true;nxtlev[geq]=true;
expressiondo(nxtlev,ptx,lev);
if(sym!=eql&&sym!=neq&&sym!=lss&&sym!=leq&&sym!=gtr&&sym!=geq)error(20);
else
{
relop=sym;
getsymdo;
expressiondo(fsys,ptx,lev);
switch(relop)
{
case eql:
gendo(opr,0,8);
break;
case neq:
gendo(opr,0,9);
break;
case lss:
gendo(opr,0,10);
break;
case geq:
gendo(opr,0,11);
break;
case gtr:
gendo(opr,0,12);
break;
case leq:
gendo(opr,0,13);
break;
}
}
}
return 0;
}
|