#include #include #include static void error (const char *msg, int line) { fprintf(stderr, "erro %s na linha %d\n", msg, line); exit(EXIT_FAILURE); } int main (void) { int line = 1; int c; FILE *myfp; if ((myfp = fopen ("programa", "r")) == NULL) perror ("nao conseguiu abrir arquivo!"); while ((c = fgetc(myfp)) != EOF) { switch (c) { case 'f': { /* function */ char c0; if (fscanf(myfp, "unction%c", &c0) != 1) error("comando invalido", line); printf("function\n"); break; } case 'e': { /* end */ char c0; if (fscanf(myfp, "nd%c", &c0) != 1) error("comando invalido", line); printf("end\n"); break; } case 'c': { /* call */ int f, idx; char var; if (fscanf(myfp, "all%d%c[%d]", &f, &var, &idx) != 3) error("comando invalido", line); printf("call%d%c[%d]\n", f, var, idx); break; } case 'r': { /* ret */ int idx; char var; if (fscanf(myfp, "et?%c[%d]", &var, &idx) != 2) error("comando invalido", line); printf("ret?%c[%d]\n", var, idx); break; } case 'v': case 'p': { /* assignment */ 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); 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; }