[Question (F)LEX et C] appels externes

Le
bernard.barbier
Bonjour,

J'ai un petit souci d'ignorance

Objectif gnrique :
Ecrire une fonction mettre en bibliothque qui vrifie le contenu=

d'une chane de caractres conforme un certain modle (ex. avan=
t de
faire un atoi, du genre : int iStatus = iControleEntier (char * pc))

Contrainte obligatoire :
La vrification doit tre faire avec (f)lex (ex. [+-]?[0-9]+ pour
valider une chane avant atoi)

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

(*) C'est l la contrainte 2 : pas de fork, pipe, shm, ni de creation d=
e
fichiers temporaires Est-ce une chimre sans les IPC ou bien je n'ai=

pas lu assez la doc ?

Merci du temps que je vous vole !

--
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.
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Laurent Deniau
Le #627649
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.

bernard.barbier
Le #627366
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.

Laurent Deniau
Le #627365
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.


Publicité
Poster une réponse
Anonyme