Note : 8 ; Une référence de grand choix pour Lex et Yacc. En tout cas, la mienne !
Comme son nom l’indique, ce volume traite les utilitaires de la famille Lex & Yacc, dont Flex et Bison, du GNU, qui ont la préférence des auteurs. Ce guide introduit progressivement l’outil d’analyse lexicale d’abord, puis l’outil grammatical ensuite, en introduisant progressivement les concepts particuliers de ces outils.
Le texte tient en 240 pages structurées en 9 chapitres. Il ne faudra pas oublier les 70 pages d’annexes dont l’utilité est assez variable, mais précieuses pour certaines. Le premier chapitre s’intitule sobrement « Lex & Yacc » et nous invite à produire un premier analyseur syntaxique avec son analyseur associé. Les 25 pages de cette mise en bouche sont pas mal denses, et sont d’ailleurs bien plus qu’une mise en bouche : on un produit un analyseur syntaxique simple avec toutes ses composantes !
Le second chapitre se focalise uniquement sur Lex et au travers de deux exemples en explore tout le potentiel. Un travail soigné même si là encore il n’est pas question de relâcher son attention ! Au chapitre 3, l’analyseur syntaxique Yacc a droit au même niveau d’attention. On y développe la notion d’arbre syntaxique et toutes les subtilités de la construction d’une grammaire. C’est du solide.
Le chapitre 4 nous accorde une pause avec une étude de cas sur la construction d’un système de menus qui fait intervenir nos connaissances des deux chapitres précédents. C’est encore une étude de cas, mais de niveau supérieur que nous propose le chapitre 5 : un analyseur SQL complet ! Il faut près d’une quarantaine de pages pour en venir à bout, beaucoup d’entre-elles étant dédiées au code source. Si le sujet est intéressant, il apporte peu aux connaissances déjà acquises.
Le chapitre 6 revient sur Lex, mais pour en aborder des fonctionnalités avancées : analyseurs lexicaux multiples, mémorisation de contexte, etc. Nous sommes ici plus dans un style « manuel de référence » mais en plus pédagogique. Nombre de fonctionnalités développées ici s’avèrent toutefois indispensables dans un contexte réel. Le chapitre 7 fait le pendant au précédent, mais pour l’analyseur syntaxique Yacc. On y aborde des fonctionnalités telles qu’actions imbriquées, attributs hérités ou grammaires multiples, etc.
La gestion des conflits est un domaine à part entière de Yacc et le chapitre lui est complètement dédié. Ils ont lié à la combinaison de deux types d’actions possibles : les déplacements (de pointeur) et les réductions (de pile). Il faudra bien s’être échauffé avec l’outil pour bien appréhender la substance de cette section assez difficile d’abord. L’ouvrage se referme sur le chapitre 9, assez court qui aborde les erreurs et la reprise sur erreur. Enfin les annexes qui suivent forment une référence assez succincte sur les versions AT&T, Berkeley et GNU des outils.
Même si le sujet est abordé, ce livre n’est pas un cours sur l’écriture d’une grammaire, il vous est recommandé d’avoir les connaissances théoriques sur le sujet au préalable. Par contre, il se veut exhaustif sur les outils Lex et Yacc. Ce n’est pas une lecture dilettante et il est recommandé de se salir les mains au fur et à mesure de lecture, faute de quoi il sera difficile d’aborder les concepts suivants sur des bases peu solidifiées.
Référence complète : Lex & Yacc – John R. Levine, Tony Mason & Doug Brown – O’Reilly & Associates 1995 (V.O.: Lex & Yacc ; O’Reilly 1993 ; ISBN : 978-1565920002) – ISBN : 9782841770014