jump to navigation

LEX & YACC – Part I mai 17, 2007

Posted by Sylvain A. in Informatique.
trackback

Un des rêves de tout usager est de dialoguer sans problèmes avec l’ordinateur. Ce rêve est depuis possible grâce au couple des programmes LEX et YAC.

Si vous êtes un mordu de la programmation, alors LEX et YAC vous offrent d’énormes opportunités. En effet les compilateurs rendus célèbres par tant de programmeurs en sont issus : C, C++, pascal, PHP, etc.

Donc n’importe quelle langage, venant du fin fond de votre imagination, peut être compris par un ordinateur : De l’analyse d’un fichier de configuration à la création d’un interpréteur de commande, ou même d’un compilateur, ces deux programmes sont d’excellents alliés qui permettent d’implémenter des langages complexes et structurés. Ces deux programmes sont disponibles en environnement UNIX sous licence GNU/Linux et connus sous le nom LEX & BISON. Les itimes l’appellent aLex et Jeanne Y’ac.

Mais que font au juste ces deux programmes ?

A travers quelques exemples simples, nous allons voir à quoi ressemble LEX. Puis son interaction avec YACC, pour des réalisations plus ambitieuses; comme l’écriture d’un compilateur, ou la lecture et l’analyse d’un fichier de configuration.

  1. LEX

    Mon chèr aLEX.
    je t’écrit cette article en honneur à celui qui t’a crée. Tu es un programme qui sait lire un flux de données au clavier et qui sait reconnaitre toutes les langues du monde. Mais quel intelligence ! Si seulement tu pouvais m’apprendre à parler relax.

    Commençons par notre très cher ‘a’LEX. Ce programme, appelé aussi LEXER est un analyser lexical(*). Il prend un flux de caractères de l’entrée stardard, et lorsqu’il rencontre une suite de caractères qui correspond à un mot-clé défini, il exécute certaines actions. Facile non !

    1.1 Structure d’un programme LEX

    %{
    Prologue
    }%
    Declaration
    %%
    Grammaire
    %%
    Epilogue

    Le prologue limité par %{ et }%, contient les types de données et les variables globales utilisées et décrites par la grammaire de votre langage. On peut aussi utiliser les commandes du pré-processeur, des macros, ou encore les bibliothèques du langage C; les fameux ‘#include‘.
    Le gestionnaire des erreurs de grammaire va dans cette partie. La Declatation contient le vocabulaire : C’est à dire les mots clés ou symboles de votre futur langage. La troisième partie, Grammaire, regroupe ses règles de construction. Enfin, la dernière partie, Epilogue, peut contenir des fonctions supplémentaires.
    C’est une sorte de bibliothèque de fonctions au sens simple.

    1.2 Un exemple simple.

    feuxdartifice.l
    %{
    #include <stdio.h>
    }%
    %%
    arret printf("Feux en arret\n") ;
    marche printf("Feux en marche\n");
    %%

    Un simple éditeur comme Bloc-note ou Emac suffit. Mais avant, il nous faut un vocabulaire (syntaxe) et une grammaire. Pour ce faire, les deux mots-clés ‘arret’ et ‘marche’ vont nous servir. Le programme lit les flux de caractères du clavier et lorsqu’il rencontre l’un des mots-clés de notre language, il affiche un message correspondant. Les mots ne correspondant pas sont affichés.
    Pour compiler le programme :

    $ lex feuxdartice.l
    $ cc lex.yy.c -o feuxdartifice -ll

    Pour exécuter le programme :

    $ feuxdartice

    IMPORTANT : Si vous utilisez flex au lieu de lex, changez ‘-ll‘ par ‘-lfl‘ pour la compilation. Ces options permettent d’appeler la librairie de Lex (liblex), qui contient la fonction main() absente du programme feuxdartifice. Le tableau suivant illustre son fonctionnement.

    Mot-clé   Affichage
    arret      Feux en arrêt
    marche     Feux en marche

    L’intégralité de l’article est téléchargeable : aLEX & YACC

About these ads

Commentaires»

1. soumia - novembre 6, 2008

je peux faire un petit exposet sur yacc comme uun outil d’analyse syntaxique . j’ai besoin des informations sur le fonctionnement de cette outil avec son programme ?

2. Sylvain A. - novembre 6, 2008

Comme analyseur Syntaxique, Lex (Alex) est capable de vérifier les mots d’un vocabulaire donnés. Mais avant d’aller plus loin.

Pour ton Exposé,

1. Commence par définir (de manière mathématique) ce qu’est un langage
2. Puis limite le vocabulaire lié à un mini-calculateur, et arrête les lexèmes (tokens)

Pour un exemple de programme reconnaissant le langage LG0 defini par un VTerminal = [1234567890+-*/], ..

1 + 3 , 5*5, 4/0 etc …

Tu recevras une copie du code issue du site IBM developerworks. Ce code a été écrit par Christian Hagen, chagen@de.ibm.com

3. Télécharge l’analyseur GnuWin32 flex-2.5.4a-1 pour Window
4. Il te faudra aussi un Compilateur C/C++.

A bientôt.

3. Benoît - décembre 6, 2010

Au passage l’exemple 1.2 ne fonctionne pas car il y a une erreur de syntaxe sur la terminaison du prologue : il faut remplacer }% par %}

Sylvain A. - décembre 6, 2010

Merci benoit [at] neveuxpaslaissersonmail.com pour ta contribution. Cet article n’a pas été révisé depuis son premier commentaire.


Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Suivre

Recevez les nouvelles publications par mail.

%d bloggers like this: