}
memcpy(nxtlev,fsys,sizeof(bool)*symnum); nxtlev[semicolon]=true;
if(-1==block(lev+1,tx,nxtlev)) {return -1; }
if(sym==semicolon) {getsymdo;
memcpy(nxtlev,statbegsys,sizeof(bool) * symnum); nxtlev[ident]=true; nxtlev[procsym]=true; testdo(nxtlev,fsys,6); } else
{error(5); } }
memcpy(nxtlev,statbegsys,sizeof(bool) * symnum); nxtlev[ident]=true; nxtlev[period]=true;
testdo(nxtlev,declbegsys,7); }while(inset(sym,declbegsys)); code[table[txo].adr].a=cx; table[txo].adr=cx; table[txo].size=dx; cxo=cx;
gendo(inte,0,dx); if(tableswitch)
{printf(\if(txo+1>tx)
{printf(\}
for(i=txo+1;i<=tx;i++) {switch(table[i].kind) {case constant:
printf(\printf(\
fprintf(fas,\
16
fprintf(fas,\break;
case variable:
printf(\
printf(\fprintf(fas,\
fprintf(fas,\break;
case procedur:
printf(\
printf(\fprintf(fas,\
fprintf(fas,\break; } }
printf(\}
memcpy(nxtlev,fsys,sizeof(bool) * symnum); nxtlev[semicolon]=true; nxtlev[endsym]=true;
statementdo(nxtlev,&tx,lev); gendo(opr,0,0);
memset(nxtlev,0,sizeof(bool) * symnum); testdo(fsys,nxtlev,8); listcode(cxo); return 0; }
void enter(enum object k , int * ptx , int lev , int * pdx) {
(*ptx)++;
strcpy(table[(*ptx)].name,id); table[(*ptx)].kind=k; switch(k)
{case constant: if(num>amax)
17
{error(31); num=0; }
table[(*ptx)].val=num; break;
case variable:
table[(*ptx)].level=lev; table[(*ptx)].adr=(*pdx); (*pdx)++; break;
case procedur:
table[(*ptx)].level=lev; break; } }
int position(char*idt,int tx) { int i;
strcpy(table[0].name,idt); i=tx;
while(strcmp(table[i].name,idt)!=0) { i--; }
return i; }
int constdecalration(int *ptx,int lev,int *pdx) {
if(sym==ident) {
getsymdo;
if(sym==eql||sym==becomes) {
if(sym==becomes) error(1); getsymdo;
18
if(sym==number){
enter(constant,ptx,lev,pdx); getsymdo; } else {
error(2); } } else {
error(3); } } else {
error(4); }
return 0; }
int constdeclaration(int * ptx,int lev,int * pdx) { if (sym==ident) { getsymdo; if (sym==eql||sym==becomes) { if (sym==becomes) { error(1); } getsymdo; if (sym ==number) { enter(constant,ptx,lev,pdx); getsymdo;
19
} else { error(2); } } else { error(3); } } else { error(4); } return 0; }
int vardeclaration(int* ptx,int lev,int* pdx) {
if (sym==ident) {
enter(variable,ptx,lev,pdx); getsymdo; } else {
error(4); }
return 0; }
void listcode(int cx0) {
int i;
if (listswitch) {
20