7
votes

Plusieurs analyseurs Flex / Bison

Quelle est la meilleure façon de gérer plusieurs analyseurs Flex / Bison à l'intérieur d'un projet?

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 parser1.y j'ai inséré la méthode principale (..) et appelé yyparse de là.

Ce que je veux obtenir, c'est avoir deux analyseurs différents ( parser1.y et parser2.y ) et être capable de les utiliser à partir d'une fonction externe (supposons < Code> principale dans main.cpp ).

Quelles précautions dois-je utiliser pour exporter YyParse Fonctions extérieures à .y Fichiers et comment dois-je gérer deux analyseurs?

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).


0 commentaires

5 Réponses :


11
votes

Notez que Bison fournit l'option '-p zz' aux symboles préfixaux avec 'ZZ' au lieu de "YY".

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.


0 commentaires

12
votes

En plus de la réponse de Leffler, j'aimerais fournir une autre approche ici:

dans le fichier .lex Vous pouvez utiliser % option prefix = "préfixe" , et dans le fichier .y que vous pouvez utiliser < Code>% Définir API.PREFIX PREFIX , qui fait la même chose que de passer -p préfixe à bison et -p préfixe à flex.

AVIS Après le remplacement du préfixe par défaut YY , vous pouvez accéder aux noms internes via l'original yy * et votre préfixe préfixe * , Bien que évidemment pour les noms externes, vous devez utiliser votre préfixe * pour y accéder.


1 commentaires

Notez que dans les versions de bison modernes, vous devez faire % définir API.PREFIX {PREFIX} ou vous obtenez un avertissement.



5
votes

Si vous utilisez Bison 3.0 ou mieux, consultez % Définir API.PREFIX {FOO _} , qui remplace tout AA et AA Préfixes avec FOO _ et FOO _ .

Voir le Documentation sur plusieurs analyseurs .

entre Bison 2.6 et 3.0, il n'y avait pas d'accolades: % Définir API.PREFIX FOO _ .


0 commentaires

-1
votes

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.


0 commentaires

0
votes

La variable API.PREFIX ne fonctionne plus pour moi (il produise une erreur de compilation) xxx

J'ai dû utiliser la syntaxe suivante xxx


0 commentaires