Quelle est la meilleure façon de gérer plusieurs analyseurs Flex / Bison à l'intérieur d'un projet? P>
J'ai écrit un parser et j'ai maintenant besoin d'une seconde dans le même projet. Jusqu'à présent dans la troisième section de Ce que je veux obtenir, c'est avoir deux analyseurs différents ( Quelles précautions dois-je utiliser pour exporter ps. J'utilise g ++ pour compiler mais pas les versions C ++ de Flex and Bison et je voudrais le garder de cette façon (afin d'éviter d'encapsuler l'analyseur à l'intérieur d'un objet). P> parser1.y code> j'ai inséré la méthode
principale (..) code> et appelé
yyparse code> de là. P>
parser1.y code> et
parser2.y code>) et être capable de les utiliser à partir d'une fonction externe (supposons < Code> principale code> dans
main.cpp code>). p>
YyParse CODE> Fonctions extérieures à
.y code> Fichiers et comment dois-je gérer deux analyseurs? P>
5 Réponses :
Notez que Bison fournit l'option '-p zz' aux symboles préfixaux avec 'ZZ' au lieu de "YY". P>
De même, Flex fournit l'option "-p zz" aux symboles préfixaux avec "ZZ" au lieu de "YY". Il utilise '-P' pour la déclaration de performance. C'est une pitié qu'ils ne soient pas cohérents les uns avec les autres. P>
En plus de la réponse de Leffler, j'aimerais fournir une autre approche ici: P>
dans le fichier AVIS Après le remplacement du préfixe par défaut .lex code> Vous pouvez utiliser
% option prefix = "préfixe" code>, et dans le fichier
.y code> que vous pouvez utiliser < Code>% Définir API.PREFIX PREFIX CODE>, qui fait la même chose que de passer
-p préfixe code> à bison et
-p préfixe code> à flex. p>
YY code>, vous pouvez accéder aux noms internes via l'original
yy * code> et votre préfixe
préfixe * code> , Bien que évidemment pour les noms externes, vous devez utiliser votre
préfixe * code> pour y accéder. p>
Notez que dans les versions de bison modernes, vous devez faire % définir API.PREFIX {PREFIX} CODE> ou vous obtenez un avertissement.
Si vous utilisez Bison 3.0 ou mieux, consultez Voir le Documentation sur plusieurs analyseurs . P>
entre Bison 2.6 et 3.0, il n'y avait pas d'accolades: % Définir API.PREFIX {FOO _} CODE>, qui remplace tout
AA code> et
AA Code> Préfixes avec
FOO _ code> et
FOO _ code>. P>
% Définir API.PREFIX FOO _ code>. P>
En plus de ce qui a déjà été déclaré, si vous utilisez un% de définition d'API.PREFIX {préfixe} ', il renommera également YyText && Yyparse au PréfixText et PrefixParse. N'oubliez pas le {} autour du préfixe!
Il en va de même pour "% Option Prefix =" Prefix "'dans Lex, votre LXXER sera renommée de Préfixex.
P>
La variable API.PREFIX ne fonctionne plus pour moi (il produise une erreur de compilation) J'ai dû utiliser la syntaxe suivante p>