Question

Quel est le meilleur moyen de gérer plusieurs analyseurs syntaxiques Flex / Bison dans un projet?

J'ai écrit un analyseur et il me faut maintenant un second dans le même projet. Jusqu'ici, dans la troisième section de parser1.y , j'ai inséré la méthode main (..) et appelé yyparse à partir de là.

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

Quelles précautions dois-je prendre pour exporter les fonctions yyparse en dehors des fichiers .y et comment dois-je gérer deux analyseurs syntaxiques?

PS. J'utilise g ++ pour compiler, mais pas les versions C ++ de Flex et Bison, et j'aimerais le conserver de cette façon (afin d'éviter d'encapsuler l'analyseur dans un objet).

Était-ce utile?

La solution

Notez que Bison fournit l'option "-p zz" pour préfixer les symboles avec "zz" au lieu de "yy".

De même, Flex fournit l'option "-P zz" pour préfixer les symboles avec "zz" au lieu de "yy". Il utilise '-p' pour les rapports de performance. C'est dommage qu'ils ne soient pas cohérents les uns avec les autres.

Autres conseils

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

Dans le fichier .lex , vous pouvez utiliser % option prefix = "PREFIX & , et dans le fichier .y , vous pouvez utiliser % define api.prefix PREFIX , qui fait la même chose que de transmettre -p PREFIX à Bison et -P PREFIX à Flex.

Après le remplacement du préfixe par défaut yy , vous pouvez accéder aux noms internes à la fois par le yy * d'origine et votre PREFIX * remplacé. Bien entendu, pour les noms externes, vous DEVEZ utiliser votre PREFIX * pour y accéder.

Si vous utilisez Bison 3.0 ou une version supérieure, consultez % define api.prefix {foo _} , qui remplace tout yy et YY les préfixes foo _ et FOO _ .

Voir le Documentation sur plusieurs analyseurs .

Entre Bison 2.6 et 3.0, il n'y avait pas d'accolades: % define api.prefix foo _ .

La variable api.prefix ne fonctionne plus pour moi (elle génère une erreur de compilation)

%define api.prefix {PREFIX}

J'ai dû utiliser la syntaxe suivante

%name-prefix="PREFIX"

En plus de ce qui a déjà été dit, si vous utilisez un '% define api.prefix {PREFIX}', il sera également renommé yytext & amp; & amp; yyparse à PREFIXtext et PREFIXparse. N'oubliez pas le {} autour du préfixe!
La même chose s'applique à '% option prefix = " PREFIX &'; '' dans Lex, votre lexer sera renommé PREFIXlex.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top