Liens connexes

Dépêche modérée par

Dépêche éditée par

: Utiliser lex et yacc dans vos programmes C/C++

Posté par patatorz (page perso, ). Modéré le 26 août 2004.
0
On a tous entendu parler un jour ou l'autre de lex et yacc, ne serait-ce que pour compiler certains logiciels ... mais à quoi peut servir cet ensemble d'outils ?

Entre autres, il vous sera très utile si votre programme C/C++ a par exemple recours à un fichier de données structurées et qu'il vous faut le parcourir, en vérifier sa validité, en extraire les données utiles etc... lex et yacc vous permettent de décrire la syntaxe du fichier (les mots clefs structurants) ainsi que sa grammaire (les enchaînements de mots clefs et l'exploitation des données parsées) dans un langage de haut niveau. Une fois ce travail accompli, ces deux outils génèrent une fonction C facilement intégrable dans votre projet C/C++.

Cet article se présente sous forme d'un tutoriel et permet de vite appréhender l'utilisation de lex et yacc par l'exemple. L'article n'aborde donc pas les aspects avancés de ces outils mais sachez qu'ils permettent de faire bien plus que ce qui y est décrit... d'ailleurs une des utilisations avancées les plus communes est la création de compilateurs.
À découvrir !

> Lire les commentaires (33 commentaires, moyenne: 2,5).  

Cette discussion est archivée, il n'est plus possible de laisser des commentaires.

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.

Il faut s'accrocher

Posté par Nicolas Ternisien (page perso, ) le 26/08/2004 à 12:04. (lien). Évalué à 3.

C'est clair que c'est vraiment puissant comme outils, mais faut vraiment y passer du temps avant de comprendre quoi que ce soit.

Mais sinon, c'est vrai que pour faire une calculatrice faisant du calcul formel (simpliste quand même), ya rien de plus simple que ça.

Créateurs de nouveaux langages (il doit bien rester encore le E++ ou le F++), amusez-vous !

--
Forum Software Reviews
Trouvez le meilleur logiciel de forum Internet pour votre communauté !

Relativisons

Posté par a_jr () le 26/08/2004 à 12:46. (lien). Évalué à 10.

Ayant moi-meme ecrit des programmes avec lex et yacc, en particulier pour lire le fichier de conf, ayant moi-meme aussi ecrit un article un jour a ce sujet, voici mon experience...

Pour une calculatrice, ou tout autre genre de compilateur, utilisez lex et yacc.

Par contre, pour un fichier de configuration, il n'est pas trop complique de coder quelque chose qui sait lire clef=valeur. C'est plus simple, c'est moins difficile a maintenir, bref, c'est meilleur. Pour un fichier de configuration un peu plus complexe, preferez une syntaxe XML, et lisez la doc de libxml2 (ou expat). C'est bien plus simple a maintenir qu'un parseur en lex+yacc.

Si vous devez faire quelque chose de simple avec des expressions rationnelles, ne pensez pas que lex ou yacc sont le seul moyen de faire cela en C (ou C++). Utilisez regcomp et regexec. Leur page de manuel est plus difficile a lire que ces outils a utililiser. Une fois la doc digeree, ca se programme bien, au risque meme parfois d'en abuser comme en Perl (a part qu'en Perl, c'est pas de l'abus) !

Enfin, il est des cas ou lex&yacc sont l'outil adapte. Alors n'hesitez pas, utilisez-les.

Le bonjour chez vous,
Yves

PS:


regex_t preg;
regmatch_t pmatch[N];
char*une_chaine = "une chaine";

/* compilation de l'expression */
regcomp(&preg, "regexp (.*)", REG_EXTENDED);

/* test de l'expression */
if(!regexec(&preg, une_chaine, N, pmatch, 0)) {
/* affichage du contenu des parentheses) */
int i;
char*tmp = strdup(une_chaine);
for(i=1; i<=preg.re_nsub; i++) {
strncpy(tmp, une_chaine+pmatch[i].rm_so,
pmatch[i].rm_eo - pmatch[i].rm_so);
printf("%s\n", tmp);
}
free(tmp);
}


PS2. J'ai pas teste. Si ca se trouve, ca marche pas mon code :)

Treecc

Posté par Antoine () le 26/08/2004 à 12:48. (lien). Évalué à 4.

Sans l'avoir jamais utilisé, il me semble qu'il y a une alternative très intéressante à lex et yacc (ou plutôt flex et bison) qui s'appelle treecc.

http://www.southern-storm.com.au/treecc.html(...)

mon avis

Posté par TImaniac (Jabber id, page perso, ) le 26/08/2004 à 13:01. (lien). Évalué à 5.

Le truc c'est qu'il faut pas mal de notion d'analyse gramamtical, parcque franchement quand yacc va sortir des erreurs shift/reduce, voilà quoi. Même en ayant suivit une formation adéquate, ces outils sont puissant mais très déroutant, et ne s'adresse pas aux amateurs à mon avis.

Sinon y'a une alternative pour tous ceux qui ont besoin d'un fichier de donnée ou de config, rien ne vaut un document XML dont il existe de nombreux validateur (XML a été conçu aussi pour faciliter tous ces traitements grâce à une syntaxe générique), ou pour les gros fichiers de données un vrai SGBD (SQLite ou plus gros)

A noter aussi que ces outils ont également été adapté pour être utilisé avec d'autres langage que C et C++, je pense notamment à Java.

en CAML light

Posté par vincent LECOQ (Jabber id, page perso, ) le 26/08/2004 à 13:27. (lien). Évalué à 2.

Pour ceux qui ne comprennent pas les méandres de lexx et yacc, utilisez sont implementation en CAML light (dispo sur le site de l´INRIA) ou autre (sais pas). Elle est vraiment bien integree et tres agréable.

--
Ma signature ici

Lex et unicode

Posté par Bertrand D () le 27/08/2004 à 08:48. (lien). Évalué à 2.

Il y a qq années, je m'étais penché sur l'implémentation d'un parseur XML basé sur flex (juste pour m'amuser).

J'avais tout de suite laissé tombé parce que selon la norme XML, le fichier peut être encodé en ASCII (ou tout jeu de caractères sur 8 bits -- Latin1, etc.), en UCS16, en UCS32 ou en UTF8. Et pour gérer UCS16 ou UCS32 il faut pouvoir gérer des wchar.

Il me semble que flex supporte les char et les wchar, mais le choix devait être fait à la compilation, alors que pour parser un fichier XML, il faut déterminer l'encodage à la lecture, entre autres en se basant sur le fait que le fichier commence par <?, selon les recommendations du W3C.
Intégrer la variabilité de l'encodage dans les expressions régulières était ingérable!

Morale: lex et yacc font déjà beaucoup, mais ils ne peuvent pas tout faire.

Rq: Tout ça date un peu, donc excusez les erreurs ou imprécisions.

Revenir en haut de page