Université du Littoral – Côte d'Opale L3 Informatique
Aspects Théoriques de l'Informatique
TP / Mini-Projet : un calculateur en ligne
Introduction
Un analyseur lexical analyse un flux de caractères (typiquement un fichier source que vous voulez
compiler) et isole dans ce fichier les "tokens" c'est à dire les éléments "de vocabulaire" du langage
dans lequel est écrit votre code source. Par exemple parmi les tokens d'un source Java on va trouver
des identifiants comme des noms de variables ou de méthodes (a, compteur, val_max, c3,
CréerTableau, System…), des nombres (123, -45, 3.141592), des opérateurs (+, -, *, /, <, <=, …) et
autres éléments lexicaux (parenthèses, accolades, point-virgule, =, …). Comme vu en cours ces
classes de tokens sont définies généralement par des langages réguliers spécifiés par des
expressions rationnelles (ex : un identifiant appartient au langage décrit par : une lettre suivie de
autant de lettres, chiffres ou blanc soulignés qu'on veut). Au niveau supérieur, la succession de ces
token est contrainte par une grammaire, généralement algébrique, qui vérifie que le programme est
syntaxiquement correct (par exemple : à toute accolade fermante correspond une unique accolade
ouverte précédemment).
Dans le cadre de ce mini-projet, on va programmer un calculateur, qui va chercher ses instructions
de calcul dans un fichier. Chaque calcul s'écrit comme une unique ligne de "commandes", mais le
fichier à traiter peut contenir plusieurs lignes (plusieurs calculs), et on veut disposer de variables où
affecter des résultats temporaires, réutilisables dans les calculs suivants du fichier. Pour réaliser ce
calculateur il faut donc être capable d'analyser le contenu d'un fichier : notre calculateur se
comporte donc comme un interpréteur capable de reconnaître et de comprendre des instructions,
de manière similaire à ce que fait un compilateur (mais un compilateur doit en plus sortir une
traduction dans un autre langage). L'analyse du fichier se fait typiquement en 2 grandes étapes :
l'analyse lexicale, basée sur des grammaires régulières, pour reconnaître le vocabulaire (les
tokens) ; et l'analyse syntaxique, basée sur une grammaire algébrique, pour vérifier l'organisation
du vocabulaire et en comprendre le sens.
Note : pour faciliter le travail, on considérera que tout nombre est converti en flottant même s'il est
écrit sans point décimal, et que l'affectation à une variable est notée de manière préfixée, avec le
symbole d'affectation suivi de la variable puis de la donnée, par exemple = a 28 (et non pas a = 28).
Étape 1 : écrire un analyseur lexical "à la main"
Dans cette première étape on se limite à explorer le travail que réalise un analyseur lexical sur un
exemple simple.
Soit le langage L sur l'alphabet {a, b, c} spécifié par l'expression rationnelle : (a|b)*acab(c|a)+
où * désigne l'étoile des rationnels, + est l'étoile propre et | est l'opérateur d'union.
1. Trouver un automate fini déterministe reconnaissant L. Faites un automate complet, avec un
état puits (non terminal) : si on ne peut pas lire une lettre dans l'état courant, alors on va dans
l'état puits ; et si on est dans l'état puits, alors toute lettre renvoie dans l'état puits.
2. Coder cet automate en Java, sans bien sûr utiliser de librairie toute faite. Vous organiserez
votre code de la façon suivante :
- 1 -