//Progettare il frammento di scanner che riconosce i seguenti token: //Parole chiave GO, GET, SET; identificatori composti da sole lettere //di lunghezza qualunque. #include #include #include #define MAXTOKEN 256 struct token { char name[MAXTOKEN+1]; int stato; int categ; }; char *categories[] = {"Parola riservata", "Identificatore"}; #define q0 1 #define q1 2 #define q2 3 #define q3 4 #define q4 5 #define q5 6 int main() { FILE *source; struct token next; source = fopen("source.txt","r"); while (gettoken(source, &next, MAXTOKEN)) { if ((next.stato == q1) || (next.stato == q2) || (next.stato == q3) || (next.stato == q4) || (next.stato == q5)) printf("Token %s esatto! si tratta di: %s\n", next.name, categories[next.categ]); else printf("Token %s errato!\n", next.name); } fclose(source); system("PAUSE"); return(0); } int gettoken(FILE *src, struct token *tkn, int max) { int car; int i = 0; tkn->stato = q0; if ((car = getc(src)) != EOF) { while (isspace(car)) car = getc(src); while (car != EOF && !(isspace(car)) && i <= max) { tkn->name[i] = car; switch (tkn->stato) { case q0: if ((car == 'g') || (car =='G')) { tkn->stato = q1; tkn->categ = 1; } else if ((car =='s') || (car =='S')) { tkn->stato = q2; tkn->categ = 1; } else if (isalpha(car)) { tkn->stato = q5; tkn->categ = 1; } else tkn->stato = 0; //stato pozza! break; case q1: if ((car == 'o') || (car =='O')) { tkn->stato = q3; tkn->categ = 0; } else if ((car =='e') || (car =='E')) { tkn->stato = q4; tkn->categ = 1; } else if (isalpha(car)) { tkn->stato = q5; tkn->categ = 1; } else tkn->stato = 0; //stato pozza! break; case q2: if ((car =='e') || (car =='E')) { tkn->stato = q4; tkn->categ = 1; } else if (isalpha(car)) { tkn->stato = q5; tkn->categ = 1; } else tkn->stato = 0; //stato pozza! break; case q3: if (isalpha(car)) { tkn->stato = q5; tkn->categ = 1; } else tkn->stato = 0; //stato pozza! break; case q4: if ((car == 't') || (car == 'T')) { tkn->stato = q3; tkn->categ = 0; } else if (isalpha(car)) { tkn->stato = q5; tkn->categ = 1; } else tkn->stato = 0; //stato pozza! break; case q5: if (isalpha(car)) { tkn->stato = q5; tkn->categ = 1; } else tkn->stato = 0; break; } car = getc(src); i++; } tkn->name[i] = 0; return(1); } else return(0); }