getsymdo; memcpy(nxtlev,fsys,sizeof(bool)*symnum); nxtlev[semicolon]=true; nxtlev[endsym]=true; statementdo(nxtlev,ptx,lev); while(inset(sym,statbegsys)||sym==semicolon) { if(sym==semicolon) { getsymdo; } else { error(10); }statementdo(nxtlev,ptx,lev); } if(sym==endsym) { getsymdo; } else { error(17); } } else {
if(sym==whilesym) {
cxl=cx; getsymdo;
memcpy(nxtlev,fsys,sizeof(bool)*symnum); nxtlev[dosym]=true; conditiondo(nxtlev,ptx,lev); cx2=cx; gendo(jpc,0,0); if(sym==dosym) {
26
getsymdo; } else { error(18); } statementdo(fsys,ptx,lev); gendo(jmp,0,cxl); code[cx2].a=cx; } else { testdo(fsys,nxtlev,19); } } } } }}} return 0; }
int expression(bool * fsys,int * ptx,int lev) { 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); } }
27
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]; memcpy(nxtlev,fsys,sizeof(bool)*symnum); nxtlev[times]=true; nxtlev[slash]=true; factordo(nxtlev,ptx,lev); while(sym==times||sym==slash) { mulop=sym; getsymdo;
28
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); break; case variable: gendo(lod,lev-table[i].level,table[i].adr); break;
29
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); } }
30