/* * minervini@neuralnoise.com 2004 * automa per riconoscere le stringhe con #(a) dispari e #(b) pari (in teoria); * * X = { a, b } * M = (Q, delta, Q0, F) * Q = { Q0, Q1, Q2, Q3 } * F = { Q1 } * delta Q0 Q1 Q2 Q3 * ------------------- * a Q1 Q0 Q3 Q2 * b Q2 Q3 Q0 Q1 */ #include #include #include #ifndef MAXTOKEN #define MAXTOKEN 256 #endif #define Q0 1 #define Q1 2 #define Q2 3 #define Q3 4 struct token { char name[MAXTOKEN + 1]; unsigned char stato; }; int gettoken (FILE *src, struct token *tkn, int max) { int car, i = 0; tkn->stato = 1; if ((car = getc(src)) != EOF) { while (isspace(car)) car = getc(src); while (car != EOF && !isspace(car) && i <= max) { switch (car) { case 'a': switch (tkn->stato) { case Q0: tkn->stato = Q1; break; case Q1: tkn->stato = Q0; break; case Q2: tkn->stato = Q3; break; case Q3: tkn->stato = Q2; break; default: tkn->stato = 0; break; } break; case 'b': switch (tkn->stato) { case Q0: tkn->stato = Q2; break; case Q1: tkn->stato = Q3; break; case Q2: tkn->stato = Q0; break; case Q3: tkn->stato = Q1; break; default: tkn->stato = 0; break; } break; } tkn->name[i] = car; i++; car = getc(src); } tkn->name[i] = 0; return(1); } else { return(0); } } int main () { FILE *source; char *categories[] = { "non valido", "A pari B pari", "A dispari B pari (finale)", "A pari B dispari", "A dispari B dispari" }; struct token next; source = fopen("source.txt", "r"); while (gettoken(source, &next, MAXTOKEN)) printf("token: %s -> %s\n", next.name, categories[next.stato]); fclose(source); return(0); }