Pour les puristes : Yacc (Yet Another Compiler Compiler) est un programme destiné à compiler une grammaire du type LALR(1) et à produire le texte source d'un analyseur syntaxique du langage engendré par cette grammaire. Il est aussi possible, en plus de la vérification de la syntaxe de la grammaire, de lui faire effectuer des actions sémantiques.
De la même manière que pour un fichier Lex, un fichier Yacc se compose de trois parties, de cette façon :
declarations %% productions %% code additionnelseul le premier séparateur
%%
et la deuxième partie étant
obligatoires.
La première partie d'un fichier Yacc peut contenir :
%{
et %}
, ces deux symboles étant obligatoirement en
début de ligne.
%token
%union
%start
(si celui-ci
n'est pas précisé, l'axiome de la grammaire est la première
production de la deuxième partie).La variable yylval
, déclarée implicitement du type de
%union
a une importance fondamentale dans le fichier, puisque
celle-ci contient la description du dernier terminal lu.
Cette partie, qui ne peut pas être vide, contient :
%{
et
%}
.
notion_non_terminale: corps_1 { action_semantique_1 } | corps_2 { action_semantique_2 } | ... | corps_n { action_semantique_n } ;sachant que les 'corps_i' peuvent être des notions terminales ou non terminales du langage.
Et enfin, on trouve...
Cette partie, qui comporte le code additionnel, devra obligatoirement
comporter une déclaration du main()
(qui devra appeler la
fonction yyparse()
), et de la fonction yyerror(char
*message)
, appelée lorsqu'une erreur de syntaxe est trouvée.
Ici aussi, nous sommes loin d'avoir fait le tour de Yacc, et je ne t'ai d'ailleurs pas tout expliqué. Nous allons préciser certains points dans l'exemple qui va suivre.