.. . .. . .
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 term(bool*fsys,int *ptx,int lev) {
enum symbol mulop; /*用于保存乘除法符号*/ bool nxtlev[symnum];
S. . . . . ..
.. . .. . .
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) {
int i;
bool nxtlev[symnum];
testdo(facbegsys,fsys,24); /*检测因子的开始符好号*/
while(inset(sym,facbegsys)) /*循环直到不是因子开始符号*/ {
if(sym==ident) /*因子为常量或者变量*/ {
i=position(id,*ptx); /*查找名字*/ if(i==0) {
error(11); /*标识符未声明*/ } else { switch(table[i].kind) { case constant: 常量*/ gendo(lit,0,table[i].val); S. . . . /*名字为/*直接把常量
. ..
.. . .. . .
的值入栈*/ 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 {
S. . . . /*不能为 /*因子 /*因子 . ..
.. . .. . .
error(22); /*缺少右括号*/ } } testdo(fsys,facbegsys,23); /*银子后有非法符号*/ } } } return 0; } /*
条件处理*/
int condition(bool* fsys,int* ptx,int lev) {
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) {
S. . . . . ..
.. . .. . .
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;
} /*解释程序*/
void interpret() { int p,b,t; /*指令指针,指令基址,栈顶指针*/ struct instruction i; /*存放当前指令*/ int s[stacksize]; /*栈*/ printf(\ t=0; b=0; p=0; s[0]=s[1]=s[2]=0; do{ i=code[p]; /*读当前指令*/ p++; switch(i.f) { case lit: /*将a的值取到栈顶*/ s[t]=i.a; t++; break;
S. . . . . ..