Analyse lexicale avec Lex ou Flex 3

Structure du fichier Lex

Le fichier Lex peut se décomposer en trois parties, séparées chacune par une ligne qui ne comporte que deux signes pourcent (%%).

  1. %{
  2. //declarations en C
  3. %}
  4. //declarations Lex
  5. %%
  6. //regles de traduction
  7. %%
  8. //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.

Inhaltsverzeichnis Haut

Exemple de fichier Lex

  1. %{
  2. #include <stdio.h>
  3. int lineNbr=0;
  4. %}
  5.  
  6. %%
  7. "\n" {++lineNbr;}
  8. . {}
  9.  
  10. %%
  11. int main()
  12. {
  13. yylex();
  14. printf("%d lines found\n",lineNbr);
  15. return 0;
  16. }

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émentation4 de notre compteur lineNbr.
Pour tout autre caractère5 nous n'associons aucune action.

Inhaltsverzeichnis Haut

Première partie du fichier Lex : déclarations

%{...%}

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.

%option ...

Expressions rationnelles6

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.

%s ...

Inhaltsverzeichnis Haut

Deuxième partie du fichier Lex : productions

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.

Inhaltsverzeichnis Haut

Troisième partie du fichier Lex : code

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.

Inhaltsverzeichnis Haut

Commandes Lex à exécuter

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 :

  1. // ...debut du fichier
  2. // ligne 445
  3. char *yytext;
  4. #line 1 "test.l"
  5. #line 2 "test.l"
  6. #include <stdio.h>
  7. int lineNbr=0;
  8. #line 461 "lex.yy.c"
  9. // ...
  10. // ligne 733
  11. /* rule 1 can match eol */
  12. YY_RULE_SETUP
  13. #line 7 "test.l"
  14. {++lineNbr;}
  15. YY_BREAK
  16. // ...
  17. // ligne 1746
  18. #line 10 "test.l"
  19.  
  20.  
  21. int main()
  22. {
  23. yylex();
  24. printf("%d lines found\n",lineNbr);
  25. return 0;
  26. }

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 : https://www.gaudry.be/de/langages-lsd10-source-rf-project/source/lex.yy.c.html.

Inhaltsverzeichnis Haut

Directives spéciales de Lex

  • ECHO permet de copier yytext dans la sortie de l'analyseur.
  • BEGIN suivi d'un nom, place au démarrage l'analyseur dans l'état souhaité.
  • REJECT force l'analyseur à évaluer la "deuxième meilleur règle".
  • yymore() force l'analyseur à concaténer la valeur actuelle de yytext à la prochaine valeur que prendra yytext.
  • unput(c) remplace le caractère c sur le flux d'entrée.
  • YY_FLUSH_BUFFER vide le tampon interne de l'analyseur.
  • yyterminate() normalement appelée lorsque EOF est rencontré. Cette directive arrête l'analyseur et renvoie la valeur 0, comme si tout le texte avait été traité.

Inhaltsverzeichnis Haut

Variables Lex

  • char *yytext élément lexical courant.
  • int yyleng taille de l'élément lexicat courant.
  • FILE *yyin fichier à partir duquel Lex lit.
  • FILE *yyout fichier de sortie (dans lequel Lex affiche les ECHO).
  • int YY_START état courant de démarrage de l'analyseur.

Deutsche Übersetzung

Sie haben gebeten, diese Seite auf Deutsch zu besuchen. Momentan ist nur die Oberfläche übersetzt, aber noch nicht der gesamte Inhalt.

Wenn Sie mir bei Übersetzungen helfen wollen, ist Ihr Beitrag willkommen. Alles, was Sie tun müssen, ist, sich auf der Website zu registrieren und mir eine Nachricht zu schicken, in der Sie gebeten werden, Sie der Gruppe der Übersetzer hinzuzufügen, die Ihnen die Möglichkeit gibt, die gewünschten Seiten zu übersetzen. Ein Link am Ende jeder übersetzten Seite zeigt an, dass Sie der Übersetzer sind und einen Link zu Ihrem Profil haben.

Vielen Dank im Voraus.

Dokument erstellt 26/02/2010, zuletzt geändert 28/10/2018
Quelle des gedruckten Dokuments:https://www.gaudry.be/de/langages-flex.html

Die Infobro ist eine persönliche Seite, deren Inhalt in meiner alleinigen Verantwortung liegt. Der Text ist unter der CreativeCommons-Lizenz (BY-NC-SA) verfügbar. Weitere Informationen auf die Nutzungsbedingungen und dem Autor.

Aufzeichnungen
  1.  Gnu's Not Unix : entspricht « GNU n'est pas UNIX » en français

  2.  GNU : “Gnu's Not Unix” (en français, « GNU n'est pas UNIX ») Groupement de logiciels libres. Il s'agit d'un acronyme récursif, car nous retrouvons l'acronyme dans sa propre définition.

  3.  Lex et Flex : Nous emploierons le terme Lex pour désigner l'outil d'analyse lexicale, mais il peut s'agir de Flex, son équivalant GNU

  4.  Incrémentation : Opération qui consiste à ajouter une valeur (de type entier) à une variable, généralement un compteur.

  5.  Expression "." : Le point dans l'expression de notre fichier Lex correspond à "n'importe quel caractère".

  6.  Expressions rationnelles : Le terme « expressions régulières » est souvent employé comme traduction textuelle de l'anglais “regular expressions”, mais nous devrions bien employer « expressions rationnelles ».

  7.  LSD010 : Langage Simple et Didactique Il existe une un certain nombre d'interprétations de l'acronyme LSD (Langage Symbolique Didactique, Langage Sans Difficulté, Langage Simple et Didactique). LSD010 est la version 2010 de la suite LSD80, LSD_02, LSD03, LSD04, LSD05, LSD06, LSD07, LSD08, et LSD09.

Inhaltsverzeichnis Haut

Referenzen

  1. Buch Sprache des Dokuments:fr IHDCB332 - Théorie des langages : Syntaxe et sémantique : PY Schobbens, Syntaxe et sémantique (January 2010)
  2. Buch Sprache des Dokuments:fr Compilateurs : Dick Grune, Henry E. Bal, Ceriel J.H. Jacobs, Koen G. Langendoen, Cours et exercices corrigés
  3. Buch Sprache des Dokuments:fr Compilateurs : A. Aho, M. Lam, R. Sethi, J. Ulman, Principes; techniques et outils

Diese Verweise und Links verweisen auf Dokumente, die während des Schreibens dieser Seite konsultiert wurden, oder die zusätzliche Informationen liefern können, aber die Autoren dieser Quellen können nicht für den Inhalt dieser Seite verantwortlich gemacht werden.
Der Autor Diese Website ist allein dafür verantwortlich, wie die verschiedenen Konzepte und Freiheiten, die mit den Nachschlagewerken gemacht werden, hier dargestellt werden. Denken Sie daran, dass Sie mehrere Quellinformationen austauschen müssen, um das Risiko von Fehlern zu reduzieren.

Inhaltsverzeichnis Haut