#include #include #include #include #include /* Esercizio: Costruire l'automa per riconoscere gli identificatori che iniziano con una lettera, eventualmente continuano con misture di lettere e cifre e terminano con un carattere di sottolineatura seguito da al pił 2 cifre */ /* File di test: test2.txt */ /* Matrice di transizione dell'automa | q0 q1 q2 q3 q4 ------------------------ lettera | q1 q1 cifra | q1 q3 q4 _ | q2 ------------------------ */ #define MAX_LUNGHEZZA 100 int main(int argc, char* argv[]) { /* argc e argv funzioni di libreria per l'acquisizione di parametri variabili */ int scan(char*); /* prototipo della funzione per la scansione della stringa letta da file */ char* filename = argv[1]; char buffer[MAX_LUNGHEZZA+1]; FILE* filePtr; filePtr = fopen(filename,"r"); if (filePtr == NULL) { printf("Il file non esiste\n"); return EOF; } while (!feof(filePtr)) { if (fgets(buffer,MAX_LUNGHEZZA,filePtr)) if (scan(buffer)) printf("%s riconosciuto\n",buffer); else printf("%s non riconosciuto\n",buffer); } fclose(filePtr); system("PAUSE"); return 0; } int scan(char* s) { enum {q0,q1,q2,q3,q4,POZZA} stato_corrente = q0; /* stati dell'automa riconoscitore pił POZZA per transizione non definita */ int i = 0; while ((s[i] != '\0' && s[i] != '\n') && (stato_corrente != POZZA)) { switch (stato_corrente) { case q0: if (isalpha(s[i])) stato_corrente = q1; else stato_corrente = POZZA; break; case q1: if (isalpha(s[i]) || isdigit(s[i])) stato_corrente = q1; else if (s[i] = '_') stato_corrente = q2; else stato_corrente = POZZA; break; case q2: if (isdigit(s[i])) stato_corrente = q3; else stato_corrente = POZZA; break; case q3: if (isdigit(s[i])) stato_corrente = q4; else stato_corrente = POZZA; break; case q4: stato_corrente = POZZA; } i++; } if (stato_corrente == q2 || stato_corrente == q3 || stato_corrente == q4) return !0; else return 0; }