gettoken(void) { int token; skipspaces(); lexeme[1] = 0; if (token = isvar()) return token; if (token = iscte()) return token; if (token = isaddop()) return token; if (token = ismulop()) return token; return lexeme[0] = token = getc(stdin); }
/*term parser:*/ void term (void) { fact (); /*geração de código de máquina*/ {printf("\tpush %%eax\n");} while (lookahead == '*' || lookahead == '/' || lookahead == DIV || lookahead == MOD || lookahead == AND) { match (lookahead); fact (); if(ismulop(lookahead)){ /*geração de código de máquina*/ {printf("\timul (%%esp)\n"); printf("\tmov %%eax, (%%esp)\n");} } if(isdivop(lookahead)){ /*geração de código de máquina*/ {printf("\tmov %%eax, -4(%%esp)\n"); printf("\tmov (%%esp), %%eax\n"); printf("\tcltd\n"); printf("\tidiv -4(%%esp)\n"); printf("\tmov %%eax, (%%esp)\n");} } if(isandop(lookahead)){ /*geração de código de máquina*/ {printf("\tand (%%esp)\n"); printf("\tmov %%eax, (%%esp)\n");} } } /*geração de código de máquina*/ {printf("\tadd $4, %%esp\n");} }
void term() { factor(); while(ismulop(look)) { emitLine("push %rax"); switch(look) { case '*': multiply(); break; case '/': divide(); break; default: expected("mulop"); break; } } }