Vous êtes sur la page 1sur 2

Université Oran 1

Faculté des sciences exactes et appliquées 3 année LMD


Département d'informatique Année : 22/23

TP Compilation
Découverte de YACC

1- Analyseur Syntaxique
Yacc est un compilateur de compilateur. À l’instar de Lex, il produit un code C, permettant de
reconnaître un langage décrit par un ensemble de règles d’une grammaire LALR sous une forme
proche de la forme BNF décrite par BACKUS-NAUR.
Yacc s’utilise conjointement à Lex, qui lui fournit les unités lexicales (tokens), afin d’analyser leur
organisation syntaxique.
Les fichiers Yacc se découpent eux aussi en 4 zones correspondant respectivement :
(I) aux déclarations C à inclure dans le fichier C produit, Ces déclarations commencent par un
%{ et se terminent par %} .
(II) aux déclaration propres à Yacc, on trouve aussi la déclaration des entités lexicales (token ),
le typage des symboles non-terminaux, les règles d’associativité et de priorité (ou de
précédence). (voir Manuel bison )
(III) aux règles de grammaire,
(IV) au code C à inclure dans le fichier C produit.

%{
Déclarations C
%}
Déclarations Yacc
%%
Règles de grammaire
%%
Code C additionnel

Découpage d’un fichier Yacc

Exemples de découverte d Yacc


1- Soient la spécification suivante ‘ex.y’ :

%{
#include <stdio.h>
int yylex() ;
void yyerror(char *s);
%}
%%
S : T '\n' {printf("Analyse réussie\n"); return 0 ;}
T : 'a' T 'b'
| 'a' 'b'
;
%%
int yylex() {
return getchar(); }
int main(void){
yyparse();
}
2- Soient les spécifications suivantes (ex.l et ex.y) qui permettent de générer un analyseur de dates
du type par exemple : 16/11/2022
ex.l : ex.y :
%{ %{
#include "ex.tab.h" #include <stdio.h>
%} int yylex();
%% int yyerror(char *s);
[0-9]+ return NUMBER;
%}
\/ return SLASH;
\n return NL;
%% %token NUMBER SLASH NL

%%
date : NUMBER SLASH NUMBER SLASH NUMBER NL { printf("Date
correcte\n"); return 0 ; }
;
%%

int main(void) {
if(yyparse()==0) { printf("Fin d'évaluation!\n"); }
}

Exercices :

1- Soit la grammaire suivante :


S ---> T
T --> a T b | a b
Générer l'analyseur qui reconnaît le langage produit par la grammaire en utilisant la routine yylex()
générée par Flex.

2- Soit la grammaire : S --> a S / b S / ʎ


Donner l'analyseur qui comptabilise le nombre de 'a' et de 'b'.

3- Soit la grammaire suivante :


E --> E+T/ T
T --> T * F / F
F --> nb
1- Donner l'analyseur en Yacc qui génère les expressions arithmétiques.

Vous aimerez peut-être aussi