%{ void init_auto() ; int yyerror(char * t) { printf("erreur !!!\n") ; } int main() { init_auto() ; return yyparse() ;} // Sructure de données pour stocker un automate : // On suppose qu'on a 26 états possibles, et 26 transitions possibles. // un tableau de 26 par 26 représente la table de transition // le tableau doit être initialisé à -1 int automate[26][26] ; int initial ; int final[26]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} ; void init_auto() { int i, j ; for (i=0 ; i<26 ; i++) for (j=0 ; j<26 ; j++) automate[i][j] = -1 ; } int parcours(char * mot) { int i ; int etat = initial ; for (i=0 ; mot[i]!='\0' ; i++) if (automate[etat][mot[i]-'a'] != -1) etat = automate[etat][mot[i]-'a'] ; else return 0 ; return final[etat] ; } %} %token INIT FINAL STATE TRANS FLG FLD MOT %% S: AFD S | REQ S | /* Epsilon */ REQ: MOT '?' { printf("parcours : %s\n", parcours((char *)$1)?"oui":"non") ; } ; AFD: LStatement '.' { } ; LStatement: Statement {} | Statement ';' LStatement {} ; LState: STATE { /* forcément final */ final[$1 - 'A'] = 1 ; } | STATE { /* forcément final */ final[$1 - 'A'] = 1 ; } ',' LState ; Statement: INIT STATE {initial = $2 - 'A' ; } | FINAL LState { } | STATE FLG TRANS FLD STATE { automate[$1 - 'A'][$3 - 'a'] = $5 - 'A' ; } ; %%