Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
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
%{
#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 :