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 !
Aller plus loin
- 1ère partie (1923 clics)
- 2nde partie (515 clics)
- Flex, implémentation GNU de lex (513 clics)
- Bison, implémentation GNU de yacc (373 clics)
# Il faut s'accrocher
Posté par Nicolas Ternisien (site web personnel) . Évalué à 3.
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: Comparez et testez les logiciels de forums Internet!
[^] # Re: Il faut s'accrocher
Posté par Gilles Crebassa . Évalué à 3.
Malheureusement, c'est déjà bien complexe, il aurait été plus intéressant de commencer la doc en français.
Merci pour la news
[^] # Re: Il faut s'accrocher
Posté par let antibarbie = xp <- xp - 1 . Évalué à 2.
# Relativisons
Posté par a_jr . Évalué à 10.
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:
PS2. J'ai pas teste. Si ca se trouve, ca marche pas mon code :)
[^] # Re: Relativisons
Posté par Bernez . Évalué à 2.
Faut pas non plus généraliser. XML n'est pas la solution universelle idéale pour tous les fichiers de confs. Pour des trucs vraiment complexes et variés, style fichier de conf de MTA (je ne parle pas de sendmail.cf qui est un cas particulier), c'est mieux d'avoir un fichier très lisible, et dans ce cas lex & yacc sont vraiment parfaits pour le parser.
# Treecc
Posté par Antoine . Évalué à 4.
http://www.southern-storm.com.au/treecc.html(...)
[^] # Re: Treecc
Posté par Philippe F (site web personnel) . Évalué à 6.
http://theory.stanford.edu/~amitp/Yapps/(...)
Bon, l'inconveninent, c'est que c'est pour du python. Par contre, c'est vraiment extremement simple a utiliser (moins d'1h pour faire mon premier programme utile avec).
Sinon, je suis tout a fait de l'avis de Yves plut haut:
- pour un fichier de config, xxx=yyy suffit largement et se parse avec un e regexp. Plus c'est simple, plus ca marche: KISS
- pour un exemple un poil plus elabore, mieux vaut plonger directement dans du xml bien que ce soit un peu verbeux plutot que d'ecrire son propre langage.
J'ajouterai plusieurs choses:
- pour stocker des fichiers de conf, on trouve un certain nombre de lib disponible de nos jours pour faire ca de facon beaucoup plus robuste que ce qu'on obtient en le faisant juste "comme ca"
- les fichiers a la .ini sont a mon avis un modele tres simple a utiliser et tres efficace. C'est ce qui est utilise pour stocker tous les parametres de config de KDE.
Faut voir que ecrire une grammaire reste une operation complexe qui doit etre reservee a des besoins hyper specifiques.
[^] # Re: Treecc
Posté par Jiba (site web personnel) . Évalué à 3.
En plus ça permet d'avoir un langage de haut niveau si quelqu'un veut un fichier de configuration complexe.
[^] # Re: Treecc
Posté par a_jr . Évalué à 0.
Meme systeme en Perl, je crois.
En C avec glib:
GHashTable *config = g_hash_table_new(g_str_hash, g_str_equal);
FILE *fd = fopen(...);
while(!feof(fd)) {
char tmp[BUFSIZ];
gchar**s;
fgets (tmp, BUFSIZ, fd);
s = g_strsplit_set(tmp,"=", 2);
g_hash_table_insert(config, s[0], s[1]);
g_free(s);
}
fclose(fd);
Bah ouaih, un peu plus long, mais plus robuste si on ajoute la verification des erreurs eventuelles de fgets et de g_strplut_set :)
Le bonjour chez vous,
Yves
PS. Code non teste, et en plus, vous voudrez surement virer tout ce qui suit un # en mettant un '\0' a la place indiquee par strchr(tmp, '#'); Et puis peut-etre aussi supprimer les espace avec g_strchug() ?
[^] # Re: Treecc
Posté par TazForEver . Évalué à 2.
[^] # Re: Treecc
Posté par scylla . Évalué à 8.
Pour les alternatives à yacc/bison (LALR(1) + GLR pour bison), j'ai dans mes bookmarks :
Il y a le sempiternel catalogue de comp.compilers ici : [http://www.idiom.com/free-compilers/(...)].
[^] # Re: Treecc
Posté par RodZilla . Évalué à 4.
[^] # Re: Treecc
Posté par Bungee Tux . Évalué à 1.
Les fichiers de grammaire reste très lisibles. Et avec eclipse, y'a la completion automatique grace a un petit plugin.
https://javacc.dev.java.net(...)
http://sourceforge.net/projects/eclipse-javacc(...)
[^] # Re: Treecc
Posté par Croconux . Évalué à 2.
Je confirme. En plus il est très simple à prendre en main. Personellement je n'ai pas envie de mettre les mains dans du C pour traiter du texte à coup de char*. Donc Yacc/Lex c'est simpa mais depuis on a inventé Perl, Python, Java,...
Dans le genre antlr est pas mal non plus mais le parseur généré a besoin du runtime d'Antlr pour fonctionner. C'est un peu lourd de devoir se trainer un gros .jar pour un tout petit parseur.
[^] # Re: Treecc
Posté par Nicolas Chapin . Évalué à 1.
En Caml les générateurs de lexeurs et parseurs sont OCamlLex et OcamlYacc.
Ils s'utilisent comme lex et yacc mais du fait de la programmation fonctionnelle ils sont plus intuitifs et ensuite l'utilisation de l'abre de syntaxe abstraite est largement facilitée.
[^] # CamlP4
Posté par scylla . Évalué à 1.
OCamlYacc est lui un analyseur LALR(1) très conventionnel.
# mon avis
Posté par TImaniac (site web personnel) . Évalué à 5.
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.
[^] # Re: mon avis
Posté par chucky . Évalué à 2.
A ce sujet, XML a pêché dans ses objectifs. Si vous voulez la liste de ses défauts : http://www.concisexml.org/(...)
De toute façon, inventer un nième langage pour le fichier de configuration (et éventuellement introduire des bugs), ça impose à l'utilisateur une fatigue supplémentaire qu'il n'est pas nécessaire de lui imposer. Si vous aimez XML, alors vive les standards :)
Chucky
[^] # Re: mon avis
Posté par ckyl . Évalué à 2.
Hum je suis pas d'accord. Pour etre grossier XML te dis que ton document aura la forme etc.
Mais l'utilisateur a toujours a ingurgiter la DTD pour pouvoir l'utiliser. XML n'apporte donc strictement rien a l'utilisateur (hormis un fichier immonde pour les humains) mais au programmeur qui n'a pas a se faire chier et gerer le tout en 100 lignes de libxml2.
[^] # Re: mon avis
Posté par syj . Évalué à 1.
Il pourra avoir une completion automatique pour rédiger plus rapidement son fichier de conf.
Un système validant que son fichier de conf est valide.
Si ton XS est très bien fait, tu pourras y ajouter des balises a tes elements pour qu'il ait une mini-aide en ligne
Si tu utilise les types des XS intéligeament, tu peux même envisager que ton utilisateur aura accès à des combobox ou des spinners pour les nombres.
Deplus, l'interêt des fichiers XML est qu'il impose de structurer l'information sous la forme d'un arbre. Une organisation qui semble facile à assimiler par l'esprit humain et que bcp d'éditeur XML représente sous forme d'arbre allégé.
Par contre pour offrir des fonctionnalités de scripting dans une application, je pense qu'il est mieux d'envisager d'utiliser des langages de scripts existants genre Perl, Python, Php, JavaScript qui posséde tous des éditeurs propre ou de passer à .Net ;-)
Enfin, Ant montre que réaliser des scripts en XML est aussi possible.
[^] # Re: mon avis
Posté par Rémi Hérilier . Évalué à 3.
Il s'interface avec le C et le C++ (des surcouches comme lunar.h ou luabind facilitent pas mal le travail) mais aussi avec java (via luajava) et bien d'autre langage aussi.
[^] # Re: mon avis
Posté par Snark_Boojum . Évalué à 1.
Snark sur #gnomemeeting
[^] # Re: mon avis
Posté par Philippe F (site web personnel) . Évalué à 2.
[^] # Re: mon avis
Posté par Snark_Boojum . Évalué à 1.
Gnomemeeting utilise gconf pour sa configuration ; je ne cherchais pas à modifier ça. Je me demandais (et je me demande toujours) quel langage utiliser pour dans gnomemeeting et pour faire quoi. Bref, que du prospectif. Pour l'instant, je suis occupé à faire un composant DBUS: ça on sait déjà à quoi ça peut servir :-)
Snark sur #gnomemeeting
[^] # Re: mon avis
Posté par Temsa (site web personnel) . Évalué à 2.
Et je peux vous dire que dans gimp, entre un python-fu et un script-fu, pour un débutant en scheme et en python, ben on a très très vite fait le choix!!!!
PS: faites des plugins pour gimp, c'est facile et ça rend tellement service... ;)
[^] # Re: mon avis
Posté par Stéphane Traumat (site web personnel) . Évalué à 1.
Sinon, réaliser des traitements XML, je trouve ça super chiant donc pour ceux qui font du Java, vous avez xmlbeans qui transforme un fichier xsd en classe java.. vous manipulez ensuite les objets java crées et xmlbeans se charge de traduire en Xml :) c beau non ?
http://about.me/straumat
[^] # Re: mon avis
Posté par Thomas Cataldo (site web personnel) . Évalué à 1.
[^] # Re: mon avis
Posté par パパフラクス . Évalué à 1.
Les codeurs disposent alors des xsd, ce qui simplifie nettement leur tâche.
[^] # Re: mon avis
Posté par syj . Évalué à 1.
http://www.castor.org/(...)
# en CAML light
Posté par vincent LECOQ (site web personnel) . Évalué à 2.
[^] # Re: en CAML light
Posté par Yusei (Mastodon) . Évalué à 4.
[^] # Re: en CAML light
Posté par vincent LECOQ (site web personnel) . Évalué à 1.
# Lex et unicode
Posté par Bertrand D . Évalué à 2.
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.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.