Le fichier Lex peut se décomposer en trois parties, séparées chacune par une ligne qui ne comporte que deux signes pourcent (%%).
%{ //declarations en C %} //declarations Lex %% //regles de traduction %% //code C additionnel
Pour le code additionnel, ainsi que pour les méthodes utilisées dans les règles de traductions, nous utiliserons le langage C.
%{ #include <stdio.h> int lineNbr=0; %} %% "\n" {++lineNbr;} . {} %% int main() { yylex(); return 0; }
Ce fichier Lex nous permet de compter le nombre de lignes rencontrées dans le fichier analysé.
Il capture l'expression \n et associe comme action l'incrémentation[4] de notre compteur lineNbr.
Pour tout autre caractère[5] nous n'associons aucune action.
Nous retrouverons ici les déclarations, dans notre cas en langage C, entourées par %{ et %}.
Tout ce que nous écrirons entre ces accolades sera placé dans le fichier lex.yy.c.
Dans notre cas, comme nous utiliserons Lex avec Yacc, nous définirons nos constantes dans le fichier Yacc, mais nous pouvons les définir ici.
Nous pouvons définir dans cette première partie du fichier Lex des notations raccourcies pour des expressions rationnelles que nous utiliserons par la suite, entourées par des accolades.
Nous retrouverons ici les les règles de traduction de la grammaire, chaque règle étant composée d'une production suivie le plus souvent par l'action sémantique qui correspond.
Si nous ne spécifions pas une fonction main, celle par défaut de la bibliothèque Lex sera utilisée. La fonction main par défaut de la bibliothèque Lex se contente de boucler sur un appel de la fonction yylex jusqu'à la fin du fichier, et dans ce cas elle renvoie la valeur 0.
Voici un exemple d'utilisation des commandes Lex ou Flex.
Convensions
Les commandes introduites dans le terminal sont affichées de cette manière, et les réponses du terminal de cette manière.steph@astate:∼$ cd /mnt/steph_docs/FUNDP/lsd010
steph@astate:/mnt/steph_docs/FUNDP/lsd010$ flex *l
steph@astate:/mnt/steph_docs/FUNDP/lsd010$
Reprenons notre exemple (fichier test.l)... Une fois que nous avons exécuté la commande flex test.l, nous avons un nouveau fichier lex.yy.c qui comporte le code compilé par Lex.
Lex inclut à ce moment le fichier y.tab.c qui a été généré par Yacc, dans lequel nous pouvons retrouver les déclarations des différents jetons sous la forme de constantes (il est ensuite nettement plus facile de manipuler ces constantes sous la forme d'entiers au lieu du jeton lui-même).
Lex génère ensuite un analyseur lexical dans un fichier lex.yy.c qui inclut entre-autres la fonction yylex.
Pour un simple exemple comme celui-ci, Lex nous génère un fichier de 1755 lignes de codes C.
Voici quelques extraits de ce fichier, qui montrent certaines correspondances avec ce que nous avions défini dans le fichier test.l :
// ...debut du fichier // ligne 445 #line 1 "test.l" #line 2 "test.l" #include <stdio.h> #line 461 "lex.yy.c" // ... // ligne 733 /* rule 1 can match eol */ YY_RULE_SETUP #line 7 "test.l" {++lineNbr;} YY_BREAK // ... // ligne 1746 #line 10 "test.l" { yylex(); return 0; }
Nous pouvons remarquer la déclaration que nous avions fait de lineNbr, son incrémentation quand un saut de ligne est rencontré dans le fichier, et la fonction main.
Vous pouvez consulter le code source de l'exemple du compilateur LSD010 pour un fichier lex.yy.c complet à cette adresse : http://www.gaudry.be/langages-lsd10-source-rf-project/source/lex.yy.c.html.
Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher les interactions avec les réseaux sociaux sur ces pages.
52 mots clés dont 45 définis manuellement (plus d'information...).
Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher le nuage de mots clés.
Syntaxe et sémantique(Janvier 2010)
Cours et exercices corrigés
Principes; techniques et outils
Ces références et liens indiquent des documents consultés lors de la rédaction de cette page, ou qui peuvent apporter un complément d'information, mais les auteurs de ces sources ne peuvent être tenus responsables du contenu de cette page.
L'auteur de ce site est seul responsable de la manière dont sont présentés ici les différents concepts, et des libertés qui sont prises avec les ouvrages de référence. N'oubliez pas que vous devez croiser les informations de sources multiples afin de diminuer les risques d'erreurs.
Recherche (afficher)
Utilisateur (masquer)
Navigation (masquer)
Apparence (afficher)
Stats (afficher)
Citation (masquer)