//Progettare il frammento di scanner (automa) che riconosce //i commenti /* ... */ #include #include #include #define MAXTOKEN 256 struct token { char name[MAXTOKEN+1]; int stato; }; #define q0 1 #define F1 2 #define q2 3 #define q3 4 #define F2 5 int main() { FILE *source; struct token next; source = fopen("source.txt","r"); while (gettoken(source, &next, MAXTOKEN)) { if ((next.stato == F1) || (next.stato == F2)) printf("Token %s esatto!\n", next.name); 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 == '/') tkn->stato = F1; else tkn->stato = 0; //stato pozza! break; case F1: if (car == '*') tkn->stato = q2; else tkn->stato = 0; //stato pozza! break; case q2: if (car != '*') tkn->stato = q2; else if (car == '*') tkn->stato = q3; else tkn->stato = 0; //stato pozza! break; case q3: if (car == '*') tkn->stato = q3; else if ((car != '/') && (car != '*')) tkn->stato = q2; else if (car == '/') tkn->stato = F2; else tkn->stato = 0; //stato pozza! break; case F2: if (car != '\0') tkn->stato = 0; //stato pozza! break; } car = getc(src); i++; } tkn->name[i] = 0; return(1); } else return(0); }