ENSEIRB 2009-2010 - Département informatique - Première année IF114 - Automates finis et applications - http://www.enseirb.fr/~herbrete/IF114 TD 6 : Introduction à l’analyse lexicale Les exercices suivants sont dédiés à l’application des automates finis à l’analyse lexicale. Les automates finis sont utilisés comme un modèle d’algorithme pour décider si un flux de données est valide. Nous voyons également qu’il suffit alors d’enrichir l’algorithme pour exploiter les données contenues dans le flux. 1 Nombres flottants Nous souhaitons décider si un entrée saisie au clavier par l’utilisateur représente un nombre flottant ou non. La définition des nombres flottants dans la grammaire du langage C est la suivante : f loatnum ::= sign value exponent sign ::= | − | + value ::= num | num . num num ::= digit | digit num digit ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 exponent ::= | expsym sign num expsym ::= E | e Exercice 1: Formalisation 1. Quel est l’alphabet de travail ? Quels sont les symboles qui peuvent apparaı̂tre dans la représentation d’un nombre flottant ? 2. Donner une expression régulière qui décrit le langage des nombres flottants 3. Donner l’automate minimal qui accepte le langage décrit par l’expression régulière précédemment obtenue. Exercice 2: Mise en œuvre Mettre en œuvre l’automate fini par un programme C qui décide si une entrée saisie au clavier par l’utilisateur représente un nombre flottant. Exercice 3: Évaluation Enrichir votre programme pour qu’en plus de décider si l’entrée saisie est bien formée, il calcule le nombre flottant correspondant. 1 2 Un fichier indexé Nous souhaitons écrire un programme qui lit en entrée un fichier saisi au clavier par l’utilisateur, puis décide s’il a la structure suivante : A2 B1 A1 C4 B27 C2 B3 ... 12.45 2.0 13.47 1.45 23.78 4.0 6.8 Les lignes du fichier définissent les entrées des tableaux A, B et C (dans cet exemple). Chaque ligne a la structure suivante : – une lettre en première colonne, – immédiatement suivie d’un nombre (entier naturel), – puis une séquence non vide d’espaces (’ ’ et ’\t’), – un nombre flottant, – et enfin, le caractère ”fin de ligne” ’\n’. Des espaces supplémentaires peuvent se trouver en début ou en fin de ligne (i.e. immédiatement avant ’\n’. Ils doivent être ignorés. Enfin, la fin du fichier est marquée par la lecture du caractère ”Fin de fichier” représenté par la constante symbolique EOF (définit dans stdlib.h pour le langage C). Exercice 4: Formalisation Donnez un l’automate fini minimal qui accepte le langage des fichiers (vus comme des mots) qui ont la structure ci-dessus. Exercice 5: Mise en œuvre Mettez en œuvre l’automate fini minimal obtenu à l’exercice précédent par un programme C qui lit le fichier sur son entrée standard et qui indique s’il a la bonne structure ou non. Exercice 6: Mémorisation des données Enrichissez votre programme pour qu’il mémorise les valeurs des tableaux A et B uniquement. Sur l’exemple ci-dessus, le tableau A contient 12.45 en case d’indice 2 et 13.47 en case d’indice 1. Les cases du tableau pour lesquelles aucune valeur n’a été fournie doivent contenir 0.0. Avant de stocker un élément dans un tableau, vous vérifierez que l’indice donné dans le fichier ne provoque pas de débordement de capacité du tableau. Une fois l’intégralité du fichier lue, votre programme affichera les contenus des tableaux A et B. 2