lex & yacc

Posté par  . Modéré par trollhunter.
Étiquettes :
0
22
mai
2001
Doc
Extrait:
"Une personne désirant écrire un compilateur ou un interpréteur utilisera sûrement les utilitaires lex et yacc (yet another compiler compiler) ou des outils en dérivant. Cet ouvrage a pour but d'expliquer l'utilisation de ces programmes. "





























lex & yacc, 2nd Edition
Auteur By John Levine, Tony Mason & Doug Brown
Editeur O'Reilly
ISBN 1-56592-000-7
Pages 386
Prix Prix indicatif $29.95
Rédacteur BugattiFan




alt="Couverture">
<!-- Ceci est a mettre comme texte de la news annoncant la revue<br/> du livre -->


Une personne désirant écrire un compilateur ou un interpréteur
utilisera sûrement les utilitaires lex et yacc
(yet another compiler compiler) ou des outils en dérivant.
Cet ouvrage a pour but d'expliquer l'utilisation de ces programmes.


<!-- Fin du texte de la news -->




Le premier chapitre est une introduction à ces utilitaires.
Il nous introduit les notions importantes pour prendre en main lex et yacc
qui sont :


  • Les expressions régulières : Celles que vous utilisez sur emacs, ou bien avec rgrep.
  • Les grammaires : Quelle sont les relations entre les expressions régulières et les grammaires.

Dans ce chapitre nous avons la comparaison entre un analyseur syntaxique
écrit à la main ou avec lex.
L'exemple est marquant car celui écrit à la main prend environ une page et en
utilisant lex on réduit de 50% le code, ce qui est un excellent argument.



Le chapitre 2 est consacré à l'utilisation de lex ou plutôt la boite à
outils de lex. Y est indiqué comment rentrer ces expressions régulières et trois exemples assez simple pour comprendre comment marche lex (compter le nombre de mots, analyse d'une ligne de commande, et un analyseur de coude source de C).
Pour une utilisation plus avancée de lex les auteurs nous recommandent de lire le chapitre 6.



L'utilisation de yacc( chapitre 3) : Après la description des grammaires et l'analyse par déplacement/réduction( construction de l'automate à pile).
Les auteurs nous indiquent que yacc n'est pas la panacée pour certaines grammaires. En effet, yacc ne sait pas résoudre certains problèmes,
mais les auteurs dédramatisent ces problèmes. Ils nous expliquent comment rentrer une grammaire sur yacc et associer des actions sur la grammaire pour former
par exemple la grammaire abstraite d'un langage. Puis ils attirent notre attention sur un problème important sur les grammaires : l'ambiguïté, avec l'exemple classique des expressions arithmétiques.
On résout ces problèmes soit en modifiant la grammaire soit en précisant les associativités des opérandes avec les déclarations left, right.
Puis dans ce chapitre, on nous montre comment intégrer ces utilitaires dans un Makefile.
Les exemples sont complets et n'appelent aucune critique.



Le sixième chapitre est consacré à Lex avancé. C'est une partie plus complexe que le second chapitre avec les différentes possibilités
en changeant de mode. En expliquant la bibliothèque lex , et les contextes.
Puis on nous expose les différentes bibliothèques.

Mais je regrette la duplication de certaines informations comme la grammaire des expressions rationnelles.


Après lex avancé, on a Yacc avancé.
Sur ce chapitre on nous détaille la bibliothèque yacc et comment on effectue la recupération de données et aussi la gestion d'erreur de yacc mais il y a un
chapitre qui rentre plus en détail dans les explications. Nous avons la description des Bogue des différents yacc.



Le chapitre 8 est une partie intéressante car il nous indique comment desambiguër les grammaires classiques sur les compilateur
par exemple comment fait on pour que le else se raporte au deuxième If dans l'exemple suivant :


If cond
I1
If cond
I2
Else
I4



Le dernier chapitre explique le fonctionnement d'erreurs c'est
à dire comment on précise les erreurs dans le
code et comment on saute les erreurs pour écrire un compilateur
qui détecte plusieurs erreurs.



Les Annexes A, B, C, D, E, F, G, H décrivent les principaux lex
et yacc du marché (free ou commerciaux)


Dans les Annexe I, J l'on trouve les codes source des exemples des chapitres 4,5.






En conclusion ce livre peut être intéressant pour les personnes voulant s'initier aux problèmes de langage.
Aussi l'utilisateur de lex et de yacc voulant approfondir la connaissance des ces outils.
COncernant la présentation du livre, je trouve qu'elle est bien faite avec un nombre de schémas suffisant et des exemples bien choisis.
Mais je regrette que les solutions des exercices ne soient pas dans le livre et que les exemples ne soit pas fournis sous forme de CDROM
ou de disquette.
( Il semble que les solutions sont sur le site FTP mais je n'ai pas réussi à les trouver. )









Table des matières



  • Chapitre 1 : Lex et Yacc
  • Chapitre 2 : Utilisation de Lex
  • Chapitre 3 : Utilisation de Yacc
  • Chapitre 4 : Langage de génération de menus
  • Chapitre 5 : Analyseur SQL
  • Chapitre 6 : Règle d'écriture des spécifications Lex
  • Chapitre 7 : Règle d'écriture des grammaires Yacc
  • Chapitre 8 : Gestion des ambiguïtés
  • Chapitre 9 : Signalisation des erreurs et reprise
  • Annexe A : AT&T Lex
  • Annexe B : AT&T Yacc
  • Annexe C : Berkeley Yacc
  • Annexe D : Nu Bison
  • Annexe E : Flet
  • Annexe F : Lex et Yaccde MKS
  • Annexe G : Lex et Yacc de Abraxas
  • Annexe H: Lex et Yacc de POSIX
  • Annexe I : Source du Compilateur
  • Annexe J: Source de l'analyseur SQL



Références



Aller plus loin

  • # Nu Bison ?

    Posté par  . Évalué à 0.

    Dans le même genre:
    | Les compilateurs
    | théorie. construction. génération.
    | R.Wilhem , D. Maurer , Masson

    Ca parle des analyses lexicales et syntaxiques mais aussi de plein d'autres choses: langages objets, logiques, fonctionnels, etc.
    --
    En fin de compte, quel est le mieux : Lex ou Yacc ?
    • [^] # Re: Nu Bison ?

      Posté par  (site web personnel) . Évalué à 1.

      "En fin de compte, quel est le mieux : Lex ou Yacc ?"

      C'est une blague ou une vrai question ?

      --
      Thomas, pas sûr sur ce coup-là...
      • [^] # Re: Nu Bison ?

        Posté par  . Évalué à 0.

        C'est une blague ou une vrai question ?

        A ton avis ?
        • [^] # Re: Nu Bison ?

          Posté par  . Évalué à 1.

          Je me lance.
          L'auteur de la question ayant donné le nom d'un livre sur les compilos, il s'y connait donc un minimum, donc cela ne peut etre qu'une blague.
          • [^] # Re: Nu Bison ?

            Posté par  . Évalué à 1.

            Moi aussi j'ai des livres de physique, pourtant je suis loin de comprendre ce qui est ecrit dedans :+)

            Et puis bon, la reponse aidera surement ceux qui ne savent pas et qui n'ont pas (ose) pose(r) la question.
    • [^] # Re: Nu Bison ?

      Posté par  . Évalué à 1.

      Lex fait de l'analyse lexicale.(en tres gros, il analyse l'orthographe des mots, mais ne touche pas a la grammaire du texte)
      Yacc fait de l'analyse syntaxique(il analyse la grammaire mais pas l'orthographe).

      --> 2 softs qui font 2 choses totalement differentes.

      Il est impossible de comparer les 2, c'est comme comparer un caillou avec une pomme, ca n'a rien a voir.
      • [^] # Re: Nu Bison ?

        Posté par  . Évalué à 0.

        Ca marche aussi avec une poire et un rocher ? :)
        • [^] # Re: Nu Bison ?

          Posté par  . Évalué à -1.

          Ca marche aussi avec un pingouin et une fenêtre? :)
          • [^] # Re: Nu Bison ?

            Posté par  . Évalué à -1.

            ca marche aussi avec l'EPITA et une ecole d'informatique ? ;-)
            • [^] # Re: Nu Bison ?

              Posté par  . Évalué à 0.

              On peut reprocher beaucoup de choses a l'epita, mais pas qu'on y fait pas d'info...
      • [^] # Re: Nu Bison ?

        Posté par  (site web personnel) . Évalué à -1.

        Pourtant une pomme c'est quand même mieux qu'un caillou.
      • [^] # Re: Nu Bison ?

        Posté par  . Évalué à 0.

        Il y a moyen de les comparer ! Bien sur !

        D'un point de vue théorique les langages réguliers (Lex) sont strictement inclus dans les langages
        libre du contexte (Yacc - qui en realité est un sous ensemble de CFG, LALR, mais reste un sous ensemble). Cependant du coté pratique, on se rend compte que l'expressivité de lex et yacc sont identiques du à l'ajout d'extension et la manipulation des règles sémantiques. Ils permettent tous 2 de décrire des langages généraux équivalent à une machine de Turing. Alors pourquoi utiliser les 2 ? L'explication est triviale : c'est plus simple ! Ils sont adapter chacun à leur travail.

        Il est aussi à remarquer que Lex et YACC sont des outils qui commencent à dater... Il y a des parseurs bcps mieux pensés (voire http://www.compilers.net(...) pour une liste). Il y a clairement des inepties dans ces outils (par exemple : on défini les tokens dans YACC alors qu'un token c'est bien ce que contruit un Lexer).

        Mais c'est vrai ce sont des standards, ils sont libre (enfin pas lex et yacc mais flex et bison). Il existe pour toutes les plateformes. Ce qui fait leur atouts majeurs. Mais il ne faut pas se leurer ce ne sont surement pas les meillleurs ! Utilisez-les c'est mon conseil mais soyez critique vis a vis de leur qualité !

        -- Anthony
  • # La bible

    Posté par  (site web personnel) . Évalué à 1.

    N'oublions pas la bible en la matière :

    Compilation : Principes, techniques et outils de Aho, Sethi et Ullman chez Addison Wesley
    http://cseng.aw.com/book/toc/0,3830,0201100886,00.html(...)

    Le Lex & Yacc de Levine est bien et contient de nombreuses astuces et solutions pratiques. Il manque à mon avis des explications plus générales et théoriques. L'ouvrage que j'ai cité comble largement cette lacune.
    Bref, ces deux ouvrages sont complémentaires.

    Il y a aussi ce lien, où j'ai trouvé des documents très intéressants :
    http://citeseer.nj.nec.com/290359.htm(...)
  • # ATTENTION C'EST EN ANGLAIS !!!

    Posté par  . Évalué à 1.

    Comme je vais être judicieusement scoré 0 par un avisé modérateur (pas loggé et puisque c'est comme ça je ne donnerai pas mon nom, na!), tout est dans le titre... Plus sérieusement, la table des matières traduite en français peut à ce sujet prêter à confusion.
    • [^] # Re: ATTENTION C'EST EN ANGLAIS !!!

      Posté par  (site web personnel) . Évalué à 1.

      Authentifie toi et tu seras "scoré" +1. Ca n'a aucun rapport avec un quelconque modérateur...
    • [^] # Re: ATTENTION C'EST EN ANGLAIS !!!

      Posté par  . Évalué à 1.

      Comme je vais être judicieusement scoré 0 par un avisé modérateur (pas loggé et puisque c'est comme ça je ne donnerai pas mon nom, na!), tout est dans le titre... Plus sérieusement, la table des matières traduite en français peut à ce sujet prêter à confusion.

      Le score de 0 n'a rien à voir avec la modération, petit scarabée. RTFM!
      Pas Autentifié => Score=0 par défaut
      Autentifié => Score=1 par défaut
      Ensuite, la modération permet de changer ça entre -1 et +oo

      De plus, si tu ne lis pas l'anglais, je pense que ton avenir dans l'informatique est assez gravement compromis. Que ce soit sur support papier ou électronique, les meilleures docs sont dans la langue de Shakespeare...

      Enfin, j'aimerais signaler que Lex et Yacc sont avantageusement remplacés par Flex et Bison qui ont le mérite en plus de supporter des syntaxes et des grammaires de plus de 3 lignes sans exploser.

      Et pour ceux que ça intéresse, un bon bouquin:
      "Crafting a Compiler" : http://cseng.aw.com/catalog/title/0,3835,0+crafting+a+compiler,00.h(...)
      • [^] # Re: Flex & Bison

        Posté par  (site web personnel) . Évalué à 1.

        Enfin, j'aimerais signaler que Lex et Yacc sont avantageusement remplacés par Flex et Bison qui ont le mérite en plus de supporter des syntaxes et des grammaires de plus de 3 lignes sans exploser.

        Comme d'habitude, le gros inconvénient des outils GNU se sont les ajouts et les écarts aux standards. Toutefois, Bison à bien une option de compatibilité.
        Leur avantage, par contre, est qu'ils sont libre.
      • [^] # Re: ATTENTION C'EST EN ANGLAIS !!!

        Posté par  . Évalué à 0.

        Crafting a compiler, je confirme : excellent livre (vachement mieux que les recettes de cuisine du Dragon Book)
      • [^] # Re: ATTENTION C'EST EN ANGLAIS !!!

        Posté par  . Évalué à 1.

        C'était moi, ce matin au boulot, où je n'ai pas mon mot de passe. C'était maladroit d'une certaine manière, certes. Cependant...
        1- Je parle et lis l'anglais, ce qui n'est pas rare. Pourtant, quand j'ai le choix entre l'original en anglais et, quand elle existe, sa traduction en français, je trouve plus confortable la version française, sauf bien entendu si le traducteur est inepte.
        2- La petite pique au sujet du score, c'est parce que je vois souvent des commentaires anonymes pertinents et intéressants scorés 0 des heures après qu'ils aient été postés, et parfois des âneries signées éternellement à 1... Au départ, les deux liens au bas de chaque nouvelle, j'ai aimé, je me suis dit : "Chouette ! je vais lire les commentaires les plus intéressants, parce que filtrés", et puis euh... non, ça marche pas comme ça. En l'occurence, je voulais juste indiquer à ceux que ça intéresse que le livre est en anglais. Donc, pour le coup, fallait me laisser à 0, ça aurait été plus cohérent.
        Bon, ça fait beaucoup de mots pour pas grand chose. La prochaine fois j'essaierai de poster à meilleur escient.
    • [^] # Re: ATTENTION C'EST EN ANGLAIS !!!

      Posté par  . Évalué à 1.

      il y a une édition française chez O'REILLY International Thomson
      ISBN 2-84177001-X
  • # Honte sur lui

    Posté par  (site web personnel) . Évalué à 1.

    "Une personne désirant écrire un compilateur ou un interpréteur utilisera sûrement les utilitaires lex et yacc"

    Hier j'ai trouve un bug dans w3m et j'ai eu le malheur de vouloir regarder son parseur HTML: il est ecrit tout en C a la main avec des if et des case!
    • [^] # Re: Honte sur lui

      Posté par  (site web personnel) . Évalué à 1.

      > il est ecrit tout en C a la main
      Et alors ? TeX aussi est écrit « à la main »

      Lex et Yacc sont des outils qui simplifient la vie, mais l'on peut très bien être amené, pour des raisons de performance ou de langage complexe (ou tordu), à écrire complètement les analyseurs.
      • [^] # Re: Honte sur lui

        Posté par  (site web personnel) . Évalué à 1.

        Je suis d'accord, qu'il y a des cas ou c'est mieux de le refaire a la main.
        Dans le cas de w3m je n'ai pas reussi a lui trouver de raison! Surtout pour parser du HTML pour lequel il existe deja de nombreux parseurs.
    • [^] # Une explication possible

      Posté par  . Évalué à 0.

      Les pages HTML n'étant pas toujours conformes à une grammaire donnée (l'erreur est humaine ...), il est peut-être plus facile de passer outre les erreurs de syntaxe avec un parser custom plutot qu'avec un parser généré automatiquement pour une grammaire fixée. -dlc
      • [^] # Re: Une explication possible

        Posté par  (site web personnel) . Évalué à 1.

        En l'occurence, meme des pages conformes a la grammaire ne passent pas...
        Et je veux bien un parser "custom" mais au moins le faire proprement. En fait, je pense qu'il ne savait pas ce qu'est un parser. Et je reconnais que ca a ete le cas de tout le monde. Mais bon pour gerer un truc comme le HTML, surtout en ayant acces au net, j'aurais regarde s'il n'existe pas des outils.

        A part ca je trouve ce logiciel tres bien et l'utilise tous les jours donc je vais arreter de critiquer son auteur :)
      • [^] # Re: Une explication possible

        Posté par  . Évalué à 0.

        S'il n'existe pas de grammaire LALR(1) de HTML (c'est à dire pas implantable à l'aide de yacc), ça voudrai surtout dire que HTML serai un langage mal conçu. Je ne connais pas très bien le HTML mais il me semble à priori que ce n'est pas le cas.
        Déjà que c'est parfois le bordel pour maintenir un compilo avec une grammaire bien propre, alors avec un parser custom accroche toi ! Il doit être buggé !
  • # critique de lex et yacc ...

    Posté par  . Évalué à 0.

    Le sujet de la news est la critique du bouquin sur lex et yacc, j'aimerais bien aussi faire une critique de lex et yacc.

    lex :
    1 - Les lexer générés par lex ne sont pas des lexer à pile, la conséquence de ceci est que comme certains tokens ne peuvent pas être exprimé à l'aide d'une expression régulière (par ex : les commentaires du langage C) il faut donc se palucher à la main la reconnaissance de ces tokens avec du code C (crado beurk!)

    yacc :
    1 - yacc n'a pas été concus pour générer des parser réentrants.
    2- Il n'y a pas de clauses multi-start.
    3 - Lorsque le parser généré par yacc détecte une erreur de syntaxe, il faut écrire soit même le code chargé de libérer les ressources mémoire référencés par les éléments de la pile d'analyse.

    Bien sûr aucun de ses inconvénients ne provoque de problème insoluble et on peut toujours s'en sortir, mais c'est un ensemble de chose qui fait que c'est parfois vraiement pas pratique à utiliser.
    Y a t-il qlq'un ici qui a expérimenté l'utilisation d'autres générateurs de lexer/parser qui n'ont pas les inconvénients que j'ai cité ?

    Pierre
    • [^] # Re: critique de lex et yacc ...

      Posté par  . Évalué à 0.

      > 1 - Les lexer

      Il existe les états qui solutionnent le problème...

      > yacc

      1 - Il y a moyen de faire des parseurs réentrant en redéfinissant un certain nombre de macros... Il existe des versions étendues de ces parseurs qui peuvent le faire aussi.

      2 - Multi-start késako ?

      3 - Les parseurs que j'ai écrit se terminait sur erreur(s) donc pas ce problème.

      C'est vrai c'est pas la panacée mais c'est bien util lex&yacc ;-)

      Des parseurs qui avaient l'air bien sont ceux défini par fischer et leblanc dans "Crafting a compiler with C" (SCANGEN, LLGEN, LALRGEN ftp://ftp.csc.ncsu.edu/pub/compilers/crafting_compiler/tools(...)
      ). Je ne les ai pas utilisés autant que lex et Yacc mais ils sont bien mieux pensés à la base. J'ai entendu dire de professionnel que JavaCC était bien... mais pas d'expérience personnelle.

      -- Anthony
      • [^] # Re: critique de lex et yacc ...

        Posté par  . Évalué à 0.

        lex
        1 - Je ne te suis pas bien ??? Y aurait il qlqchose de lex qui m'aurai échappé ?

        yacc
        1 - c'est vrai, mais pas pour tous les yacc, en plus je trouve ça assez mal foutu.
        2 - ça sert à faire de la compilation partielle, c'est à dire que ça permet d'analyser un sous ensemble du langage.
        3 - à moins d'avoir uniquement des structures plates dans ta pile d'analyse, le pb se pose forcement.

        On est d'accord, c'est pas la panacée ;)

        Pierre
        • [^] # Re: critique de lex et yacc ...

          Posté par  . Évalué à 0.

          Pour lex (Peut-etre une extension flex)

          from manpage:
          Three routines are available for manipulating stacks of
          start conditions:

          void yy_push_state(int new_state)
          pushes the current start condition onto the top of
          the start condition stack and switches to new_state
          as though you had used BEGIN new_state (recall that
          start condition names are also integers).

          void yy_pop_state()
          pops the top of the stack and switches to it via
          BEGIN.

          int yy_top_state()
          returns the top of the stack without altering the
          stack's contents.

          The start condition stack grows dynamically and so has no
          built-in size limitation. If memory is exhausted, program
          execution aborts.
    • [^] # Re: critique de lex et yacc ...

      Posté par  . Évalué à 0.

      From comp.compilers:

      Subject:
      Announce: YaYacc-1.0.0. is aviable
      Date:
      13 May 2001 01:13:39 -0400
      From:
      Ruslan Shevchenko <rssh@MailAndNews.com>
      Organization:
      Posted via Supernews, http://www.supernews.com(...)
      Newsgroups:
      comp.compilers




      What is this?

      YaYacc -- an abbreviation for Yet Another Yacc. The programm was
      created as a syntactical analyzer, which is compatible with original
      on algorithm analysis and perceived language with yacc. It generate
      C++ code. Resulting code can be used in multithreaded applications.

      YaYacc is available in source code with BSD-like license.

      It can be downloaded immediatly from our website:

      http://www.gradsoft.com.ua/eng/Products/YaYacc/yayacc.html(...)

      Ruslan Shevchenko
      GradSoft: Chief Software Architector
      http://www.gradsoft.com.ua/eng/(...)
  • # Pourquoi parler d'un bouquin si ancien ?

    Posté par  . Évalué à 0.

    Ok, c'est interessant mais paru en 1992 et en anglais !
    Il existe une autre publication sortie chez Eyrolles en 1994 (c'est vieux aussi) mais ... en francais "Realiser un compilateur" Silverio y parle de Lex et Yacc dont les versions pour TurboPascal sont fournies.
    Reference : 2-212-008834-5
    (pas d'accent pour compat. je m'excuse d'etre sous M$ NT)
    jm.guerville@netcourrier.com

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.