4. Définition des mots : read_config_lex.l

4.1. Format du fichier

Le format du fichier pour flex est celui-ci :

définitions de mots-clés
%%
définitions des mots
%%
code C additionnel

4.2. Le fichier read_config_lex.l

%option nounput
%{
#include "read_config_yy.h"
%}

separator	[\t ]+

%%
{separator}			;
^[#;].*$			;
^{separator}*[Ii]nt[Ss]tr	{ yylval.string = yytext; return INTSTR;}
^{separator}*[Bb]oolean		{ yylval.string = yytext; return UNBOOLEEN;}
^{separator}*[Uu]n[Ee]ntier	{ yylval.string = yytext; return UNENTIER;}
[Tt][rR][Uu][eE]                { yylval.bool = 1; return BOOLEAN; }
[Ff][Aa][Ll][Ss][eE]            { yylval.bool = 0; return BOOLEAN; }
[Yy][Ee][Ss]                    { yylval.bool = 1; return BOOLEAN; }
[Nn][Oo]                        { yylval.bool = 0; return BOOLEAN; }
[0-9]+				{ yylval.val = atoi(yytext); return INTEGER; }
\"[^"]*\"			{ yylval.string = yytext; return QSTRING;}
'[^']*'				{ yylval.string = yytext; return QSTRING;}
[^'" \t\n]+			{ yylval.string = yytext; return STRING;}
^{separator}*\n			;
{separator}*\n			{ return EOL; }
<<EOF>>				{ return 0 ; }
%%

4.3. Les explications

Un peu d'explications car j'ai mis non pas du superflus, mais des choses intéressantes.

Tout d'abord, la première ligne indique que le fichier généré par flex ne comportera pas la fonction unput. Elle peut être génante pour la suite, donc exit la fonction.

Ensuite, le fichier read_config_yy.h que nous n'écrirons pas est nécessaire ici. C'est bison qui le génèrera pour nous. Notons que tout code encapsulé dans %{ et %} est recopié tel quel par flex. Attention à l'ordre des deux caractères : c'est toujours le signe % qui précède l'accolade, qu'elle soit ouvrante ou fermante.

La définition de separator nous évite de retaper ce code par la suite. C'est une sorte d'alias pour la suite du fichier. Par contre, ce n'est pas là qu'on définit que separator est le séparateur. Ici, avant les %%, on ne définit separator qu'en tant qu'alias.

Puis, avant la reconnaissance des trois mots-clé, j'ai défini que separator est un séparateur. Eh oui, sinon, qui l'aurait dit a bison et à flex? Quand on définit le vocabulaire et la grammaire, on définit tout, y compris le caractère de séparation! Et du coup, dans la lignée des définitions évidentes mais qu'il faut quand même définir, on a sur ligne suivante ce qu'est un commentaire, à savoir une ligne commençant par # ou ;.

Viennent ensuite les trois mots-clé qui nous intéressent. Ainsi que quelques autres mots-clé qui nous serviront pour le booléen. Notons qu'ils sont sensibles à la casse.

Et enfin nous avons les définitions les plus générales avec les entiers INTEGER, les chaînes de caractères entre guillemets QSTRING (Q pour Quotes) puis sans guillemets STRING. Et c'est fini! J'ai choisi ces noms moi-même; je l'indique car vu leur nom, ce n'était peut-être pas évident pour tout le monde. Donc non, ces noms ne sont pas définis par défaut.

Nous compilerons ce fichier plus tard car nous avons besoin du fichier read_config_yy.h généré par bison.

création est mise à disposition sous un contrat Creative Commons