Il permet de générer un programme en C qui est un analyseur lexicale que l'on a décrit au préalable.
Le programme qui est généré s'appelle yylex
. Il peut être utilisé dans un programme Yacc pour combiner analyse syntaxique et lexicale.
%% [ \t]+$ " "+ printf(" ");
Il supprime les espaces et les tabulations en fin de ligne et il remplace toute séquence d'espace, par un seul espace. Le programme porte l'extension .l
. La compilation se fait comme suit :
$ lex test.l
Un programme C est sortit.
Structure d'un programme Lex : 3 parties
- Définition %% - Règles %% - Procédures utilisateurs
Chaque partie est optionnelle.
Elles ont un format en 2 parties: regexp action
.
Les méta-symboles utilisés pour décrire les expressions régulières :
Expression régulière | Chaîne de caractères |
---|---|
x | x |
"x" | x même s'il est opérateur |
\x | x même s'il est opérateur |
[xy] | x ou y |
[x-y] | Char entre x et y |
. | N'importe quel caractère |
^x | x en début de ligne |
x$ | x en fin de ligne |
x? | x facultatif |
x* | 0 ou plusieurs x |
x+ | 1 ou plusieurs x |
x.y | x ou y |
x/y | x si suivit de y |
Elles sont écrites en C :
Par défaut, le programme recopie l'entrée vers la sortie. Sinon :
Action | Description |
---|---|
; | Action vide, ignorer la chaîne. |
Variables :
Variable | Description |
---|---|
yytext | Variable qui contient le la chaîne reconnue. |
yyleng | Taille de la chaîne reconnue. |
La fonction doit renvoyer un 1 pour arrêter le traitement après son exécution. Cette fonction s'exécute à la fin du fichier d'entrée.
S'il est combiné avec Lex :
#include "y.tab.h"
Il contient, entre autres, les symboles terminaux du Yacc.
#include "lex.yy.c"
La compilation se fait comme suit :
$ yacc -d parse.y $ lex fichier.l $ gcc y.tab.c -ly -ll
L'option -d
génère le fichier y.tab.h
.
La structure d'un programme Yacc est composée également de 3 parties :
- Déclaration %% - Règles actions %% - Procédures utilisateurs
Une rèlge E -> E + T | T
devient, en Yacc :
E : E + T | T ;
Variables associées :
Variable | Description | Valeur |
---|---|---|
$$ | Règle courante | E |
$1 | E | |
$2 | + | |
$3 | T |
Dans les actions Lex, on retrouvera en dernière position, un return de l'unité syntaxique.
La variable yylval
est présente dans le Lex mais connue par le Yacc.