YACC : générateur d'analyseur syntaxique

Yacc est un utilitaire fourni avec Unix (1). Il permet de créer automatiquement le code source d'un analyseur syntaxique, à partir d'instructions contenues dans un fichier construit par l'utilisateur. Le code source (en C) obtenu peut compléter celui d'un analyseur lexical obtenu avec l'utilitaire Lex. L'utilisateur peut ainsi créer un compilateur correspondant à son projet. Yacc peut aussi être utilisé, indépendamment de Lex, quand on veut éviter d'écrire directement le code de l'analyseur syntaxique.
Le fichier d'instructions, appelé ici "fichier-yacc", permettant à Yacc de construire l'analyseur est écrit dans un méta-langage propre à Yacc et qui décrit essentiellement les règles d'une grammaire augmentée(2). L'utilitaire Yacc lit ce fichier-yacc et construit le fichier  y.tab.c (et le fichier y.tab.h, si l'option -d est utilisée, noms imposés par Yacc) qui contient le code source de l'analyseur. Comme la quantité de code qu'on peut rajouter au fichier-yacc n'est pas limitée, on peut construire, à l'aide de Yacc et Lex, des programmes dépassant largement la puissance de l'analyse syntaxique.
(1) Il existe deux variante de Yacc sous Unix, celle de AT&T et celle de Berkeley. On peut les distinguer en lançant Yacc sans paramètre. La première affiche "fatal error: cannot open file, line 1" et la seconde affiche un sommaire de commande. La variante de Berkeley est à l'origine de BISON, une version pour Linux de Yacc.
(2) Une grammaire augmentée est une grammaire à laquelle on a associé un ensemble d'actions. Quand la règle de la grammaire est utilisée, ces actions sont exécutées. Pour Yacc, ces actions sont écrites en code C (ou C++). La grammaire utilisée par Yacc doit être une grammaire algébrique de type LALR.

Avantages : gain de temps à la conception ; souplesse ; avantages du C.
Inconvénients : code source volumineux ; méta-langage difficile à maîtriser et parfois peu cohérent ; inconvénients du C.


Utilisation de Yacc sans Lex :
fichier-yacc
    yacc fichier-yacc
y.tab.c
    cc y.tab.c −ly
a.out

Utilisation de Yacc avec Lex :
fichier-lex
    lex fichier-lex
lex.yy.c
  fichier-yacc
    yacc −d  fichier-yacc
y.tab.c + y.tab.h
          ↳ lex.yy.c + y.tab.h + y.tab.c
    cc lex.yy.c y.tab.c −ly −ll
a.out
  ↲

Le détail du fonctionnement de Yacc est précisé dans la description du fichier-yacc