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

Lex, Yacc et C++

13 réponses
Avatar
Erwann
Bonjour,

Je souhaite utiliser Lex et Yacc pour parser un fichier de configuration.
Mon projet est développé en C++. Savez-vous comment utiliser ces outils
pour les intégrer à mon projet, sans avoir à faire des bidouilles pour
adapter le C au C++ ?

--
Erwann Thoraval

3 réponses

1 2
Avatar
plindenbaum
Je souhaite utiliser Lex et Yacc pour parser un fichier de configuration.
Mon projet est développé en C++. Savez-vous comment utiliser ces outils
pour les intégrer à mon projet, sans avoir à faire des bidouilles pour
adapter le C au C++ ?


Salut,
Comme l'on dit les autres, je te conseille d'utiliser FLEX et BISON au
lieu de lex et Yacc. Pour le C++ tu peux tres bien utiliser les codes
C generes par ces deux outils dans un contexte C++. De memoire il te
faudra au moins
ajouter dans le fichier bison 'extern int yylex();', dans le fichier
contenant le main 'extern int yyparse();'. Pour utiliser les iostream
avec flex tu peux redefinir la macro YY_INPUT (voir le manuel de flex)

Pierre

Avatar
Fabien LE LEZ
On 13 Dec 2003 18:06:42 +0100, James Kanze
wrote:

|> Flex et Bison on un mode C++. Lex et Yacc je ne sais pas.

Oui, mais au moins avec la version que j'ai, le généré contient
une ligne :
class istream ;
quelque part près du début. Ce qui pose des problèmes si on
veut utiliser une bibliothèque un peu récent.


Y'a pas moyen de changer ça assez facilement dans les sources de
Flex ?

--
;-)

Avatar
kanze
Fabien LE LEZ wrote in message
news:...
On 13 Dec 2003 18:06:42 +0100, James Kanze
wrote:

|> Flex et Bison on un mode C++. Lex et Yacc je ne sais pas.
Oui, mais au moins avec la version que j'ai, le généré contient une
ligne :
class istream ;
quelque part près du début. Ce qui pose des problèmes si on veut
utiliser une bibliothèque un peu récent.


Y'a pas moyen de changer ça assez facilement dans les sources de
Flex ?


Il y a une option -S pour spécifier la squelette dont il se sert. Selon
le manual : « You'll never need this option unless you are doing flex
maintenance or development. »

Pour spécifier une squelete, il faut en avoir une. A priori, tu vas la
créer en modifiant la version standard. Ce qu'il faut avoir -- la
squelette par défaut est integrée dans l'executable lors du build. C'est
donc probable que tu n'en as pas accès, au moins que c'est toi qui a
installé flex chez vous.

Personellement, je trouve qu'une commande du genre :

flex -t xxx.l | flex2cc

fait très bien l'affaire, où flex2cc est un script simple pour faire des
modifications nécessaires. Selon l'état du compilateur, quelque chose
comme :

(
echo "#include <istream>"
echo "#include <ostream>"
echo "#include <iostream>"
echo "using namespace std;"
cat $*
) | sed '/class istream;/d'

pourrait faire l'affaire. (Le mien est plus complex, parce qu'il
convertit en un .cc qui se compile aussi bien avec les flux classiques
qu'avec les flux standard.)

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16


1 2