Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Question (F)LEX et C] appels externes

3 réponses
Avatar
bernard.barbier
Bonjour,

J'ai un petit souci d'ignorance...

Objectif g=E9n=E9rique :
Ecrire une fonction =E0 mettre en biblioth=E8que qui v=E9rifie le contenu=
=20
d'une cha=EEne de caract=E8res conforme =E0 un certain mod=E8le (ex. avan=
t de=20
faire un atoi, du genre : int iStatus =3D iControleEntier (char * pc))

Contrainte obligatoire :
La v=E9rification doit =EAtre faire avec (f)lex (ex. [+-]?[0-9]+ pour=20
valider une cha=EEne avant atoi)

Question :
Comment communiquer SIMPLEMENT(*) avec un programme (f)lex sachant que=20
la source de donn=E9es de (f)lex est yyin, pointeur sur un type FILE* ?

(*) C'est l=E0 la contrainte 2 : pas de fork, pipe, shm, ni de creation d=
e=20
fichiers temporaires... Est-ce une chim=E8re sans les IPC ou bien je n'ai=
=20
pas lu assez la doc ?...

Merci du temps que je vous vole !

--=20
Cordialement,
Bernard.

--=20
"Vous avez beau dire, y'a pas seulement que de la pomme, y'a
autre chose, ce serait pas des fois de la betterave ? Hein ?"
Paul Volfoni (Jean Lefebvre) - Les Tontons Flingueurs.

3 réponses

Avatar
Laurent Deniau
bernard.barbier wrote:
Bonjour,

J'ai un petit souci d'ignorance...

Objectif générique :
Ecrire une fonction à mettre en bibliothèque qui vérifie le contenu
d'une chaîne de caractères conforme à un certain modèle (ex. avant de
faire un atoi, du genre : int iStatus = iControleEntier (char * pc))

Contrainte obligatoire :
La vérification doit être faire avec (f)lex (ex. [+-]?[0-9]+ pour
valider une chaîne avant atoi)


Lex est un peu lourd pour faire que ca. Un parser ecrit a la main fait a
50-100 lignes de C.

Question :
Comment communiquer SIMPLEMENT(*) avec un programme (f)lex sachant que


Le programme Flex et le parser (lexical) generer sont deux choses
differentes. On utilise Flex pour generer le code C du parser que l'on
inclus ensuite dans la compilation de son programme. Donc il n'a pas de
notion de communication inter process, seulement des appels de fonctions.

la source de données de (f)lex est yyin, pointeur sur un type FILE* ?


Travailler sur des chaines de characteres. Flex c'est faire ca aussi
(voir yy_scan_string, yy_scan_buffer), donc lire la doc...

a+, ld.

Avatar
bernard.barbier
Laurent Deniau wrote:
Travailler sur des chaines de characteres. Flex c'est faire ca aussi
(voir yy_scan_string, yy_scan_buffer), donc lire la doc...
C'est EXACTEMENT ce qu'il me fallait !!! Merci, je n'avais donc pas lu

la doc à fond (J'ai honte !)

un grand merci !

%{
int iValide = 0 ;
%}


exposant [eE][-+]?[0-9]+
constante_fractionnaire [+-]?([0-9]*"."[0-9]+)|([0-9]+".")
constante_reelle
(({constante_fractionnaire}{exposant}?)|([0-9]+{exposant}))[FfLl]?

suffixe_entier_optionel ([uU]?[lL]?)|([lL][uU])
constante_entiere [+-]?[1-9][0-9]*{suffixe_entier_optionel}

%%

{constante_entiere} {printf ("nombre entier : %sn",yytext); iValide = 1 ;}
{constante_reelle} {printf ("nombre réel : %sn",yytext); iValide = 2 ;}

. {printf ("autre chose : %sn",yytext);
iValide = 0 ;
yyterminate () ;}


%array

%%

int iTest (char * chaine) {
printf ("Chaine à analyser : %sn",chaine);
yy_scan_bytes (chaine,strlen(chaine)) ;
yylex ();
return iValide ;
}



a+, ld.




--
Cordialement,
Bernard.

--
"Vous avez beau dire, y'a pas seulement que de la pomme, y'a
autre chose, ce serait pas des fois de la betterave ? Hein ?"
Paul Volfoni (Jean Lefebvre) - Les Tontons Flingueurs.

Avatar
Laurent Deniau
bernard.barbier wrote:
Laurent Deniau wrote:

Travailler sur des chaines de characteres. Flex c'est faire ca aussi
^^^^^


lire: Flex sait aussi faire ca

Je suis vraiment dans la lune...

(voir yy_scan_string, yy_scan_buffer), donc lire la doc...


C'est EXACTEMENT ce qu'il me fallait !!! Merci, je n'avais donc pas lu
la doc à fond (J'ai honte !)

un grand merci !


Pas de quoi

%{
int iValide = 0 ;
%}


exposant [eE][-+]?[0-9]+
constante_fractionnaire [+-]?([0-9]*"."[0-9]+)|([0-9]+".")
constante_reelle
(({constante_fractionnaire}{exposant}?)|([0-9]+{exposant}))[FfLl]?

suffixe_entier_optionel ([uU]?[lL]?)|([lL][uU])
constante_entiere [+-]?[1-9][0-9]*{suffixe_entier_optionel}

%%

{constante_entiere} {printf ("nombre entier : %sn",yytext); iValide = 1 ;}
{constante_reelle} {printf ("nombre réel : %sn",yytext); iValide = 2 ;}

. {printf ("autre chose : %sn",yytext);
iValide = 0 ;
yyterminate () ;}



C'est un peu lourd, en partant de (extrait de mon parseur C99):

O [0-7]
D [0-9]
H [a-fA-F0-9]
L [a-zA-Z_]
E [eE][+-]?{D}+
HE [pP][+-]?{D}+


US (u|U)
LS (l|ul|L|UL)
LLS (ll|ull|LL|ULL)


FS (f|F)
LFS (l|L)


On a tout en qques lignes simples, type entier ou flottant, precision
simple, double ou quadruple (ou long double), representation octal,
decimal ou hexadecimal.


%array

%%

int iTest (char * chaine) {
printf ("Chaine à analyser : %sn",chaine);
yy_scan_bytes (chaine,strlen(chaine)) ;


qqchose contre yy_scan_string() quand la string est NULL-terminated ce
qui a l'air d'etre le cas si tu utilises strlen() ?

yylex ();
return iValide ;
}


a+, ld.