Yacc : analyse lexical
Le but de l’analyseur lexical est de convertir un flux de caractères entrant en un flux d’entités lexicales (lexèmes) accompagnées d’un indicateur de valeur.
Les lexèmes ainsi que les valeurs associées sont ensuite transmis à l’analyse syntaxique qui, à partir de ces derniers, va vérifier si la syntaxe de l’expression tapée par l’utilisateur est correcte (par exemple, nombre de parenthèses ouvertes = nombre de parenthèses fermées).
Le fichier Module_lexical.c est le fichier principal, le module_lexical.h et commun.h sont les bibliothèques de ce dernier.
Le fichier d’entête « commun.h » définit les valeurs des fonctions et des types de lexèmes.
Module_lexical.h est le fichier d’interface permettant aux autres d’utiliser notre fonction. Sont indiquées également dans ce fichier, les bibliothèques à utiliser.
Pour cette analyse nous utilisons deux tableaux principaux : - chaine[ ], qui contient l’expression rentrée par l’utlisateur. - Liste_lexeme[ ], qui est composé de 2 colonnes (type_lex et valeur).
Ce tableau nous sert à envoyer l’expression de départ sous forme de lexemes à l’analyseur syntaxique.
Pour l’ajout de fonctions, d’erreurs, de séparateurs ou d’opérateurs supplémentaires, il faut modifier commun.h.
Par exemple, si nous voulons ajouter la fonction ABS (valeur absolue), il suffit de rajouter la ligne « #define ABS 8 » au niveau des types de fonctions.
Dans le programme principal Module_lexical.c, il faudra rajouter la partie de code entière ci-dessous dans le default supplémentaire : // ABS else if ( chaine[in]=='A' && chaine[in+1]=='B' && chaine[in+2]=='S' ) { liste_lexeme[out].type_lex = FONCTION; liste_lexeme[out].valeur = ABS; out++; in += 2; }
Ce code effectue un test au niveau de chaine[], en verifiant que A,B et S sont trois valeurs prises consécutivement par cette chaine de caractères.
Si c’est le cas, on assigne la valeur FONCTION à la cellule courante (« out ») du tableau