#include #include #include static void error (const char *msg, int line) { fprintf(stderr, "erro %s na linha %d\n", msg, line); exit(EXIT_FAILURE); } void checkVar(char var, int idx, int line) { switch (var) { case 'v': if ((idx < 0) || (idx > 19)) error("operando invalido", line); break; default: error("operando invalido", line); } } void checkVarP(char var, int idx, int line) { switch (var) { case 'v': if ((idx < 0) || (idx > 19)) error("operando invalido", line); break; case 'p': if ((idx < 0) || (idx > 2)) error("operando invalido", line); break; default: error("operando invalido", line); } } int main (void) { int line = 1; int c; FILE *myfp; if ((myfp = fopen ("programa", "r")) == NULL) { perror ("nao conseguiu abrir arquivo!"); exit(1); } while ((c = fgetc(myfp)) != EOF) { switch (c) { case 'r': { /* retorno */ int idx; char var; if (fscanf(myfp, "et %c%d", &var, &idx) != 2) error("comando invalido", line); if (var != '$') checkVarP(var, idx, line); printf("ret %c%d\n", var, idx); break; } case 'i': { /* if */ int idx, n1, n2, n3; char var; if (fscanf(myfp, "f %c%d %d %d %d", &var, &idx, &n1, &n2, &n3) != 5) error("comando invalido", line); if (var != '$') checkVar(var, idx, line); printf("if %c%d %d %d %d\n", var, idx, n1, n2, n3); break; } case 'v': { /* atribuicao */ int idx0, idx1, idx2; char var0 = c, var1, var2; char op; if (fscanf(myfp, "%d = %c%d %c %c%d", &idx0, &var1, &idx1, &op, &var2, &idx2) != 6) error("comando invalido", line); checkVar(var0, idx0, line); if (var1 != '$') checkVarP(var1, idx1, line); if (var2 != '$') checkVarP(var2, idx2, line); printf("%c%d = %c%d %c %c%d\n", var0, idx0, var1, idx1, op, var2, idx2); break; } default: error("comando desconhecido", line); } line ++; fscanf(myfp, " "); } return 0; }