Je veux analyser une chaîne que je donne à l'analyseur dans la fonction principale de YACC. Je sais que cela pourrait être fait en utilisant yy_scan_string code> mais je ne sais pas comment l'utiliser. J'ai fouillé sur le web et les pages de l'homme mais ce n'est toujours pas clair pour moi. S'il vous plaît aidez-moi. P>
6 Réponses :
Je recommande toujours Cette page aux personnes qui veulent apprendre lex / yacc ( ou flex / bison) p>
Plus quand je l'ai vérifié juste maintenant.
L'exemple fourni n'utilise pas scan_string. Utile pour le prospose général, mais pas pour la question
Ce document ne contient aucune référence à yy_scan_string. Cette réponse est plus nocive puis serviable pour quelqu'un qui cherche des informations sur cette fonction.
J'ai trouvé et par exemple ici pour moi-même. Puisse-t-il être utile pour vous: p>
http://osdir.com/ml/lex .flex.windows / 2003-04 / msg00008.html P>
Le lien est cassé
Cela fonctionne pour moi. J'ai ce code dans la section des sous-routines
(C'est-à-dire la troisième section) de mon fichier de bison:
Comment déclarez-vous yy_scan_string dans la première partie de Bison? Aussi, dois-je ajouter quelque chose dans Flex?
Str_input devrait mieux être constitué de Cons-car * dans ce cas.
Si quiconque a besoin de l'échantillon pour un re-entrant Lexer:
int main(void) { yyscan_t scanner; YY_BUFFER_STATE buf; yylex_init(&scanner); buf = yy_scan_string("replace me with the string youd like to scan", scanner); yylex(scanner); yy_delete_buffer(buf, scanner); yylex_destroy(scanner); return 0; }
Si quelqu'un d'autre obtient le symbole n'est pas défini ou d'autres erreurs de telles erreurs lorsque vous essayez ceci: N'oubliez pas d'inclure % option reentrant code> dans le fichier LXER.
Cela a fonctionné pour moi ... Utilisez yy_scan_string ()
Il y a déjà quelques bonnes réponses ici. Mais à mes fins, je devais échanger à plusieurs reprises entre les tampons à cordes qui devaient être analysés. Le problème ici est que Flex doit nettoyer après chaque exécution de traitement et réinitialiser ses paquets / comptoirs internes / etc. au moment de la rédaction de em>, aucune des réponses existantes ne le démontre. Cela constitue essentiellement cela pour maintenir un J'ai essayé de montrer un point de vue raisonnablement Exemple complet, mais l'argent-shot est par exemple: p> donc ce Vous permet d'exécuter une boucle de contrôle comme: p> Cet exemple a été exécuté via Valgrind pour vérifier la mémoire-correction. p> p> yy_buffer_state yy_buffer_state; code> autour de quelque part et appeler
yy_delete_buffer ( yy_buffer_state) code> quand il est temps de basculer entre les chaînes. Lorsque Flex est attribué une nouvelle chaîne à numériser (avec
yy_scan_string () code>), un nouveau yy_buffer_state est généré, que vous devez suivre, que vous devez suivre. P>
setlexerbuffer () code> près du bas ~ p>
Étroitement lié à: Stackoverflow.com/q/1920604/15168 et Stackoverflow.com/q/1909166/15168 (bien que pas tout à fait un duplicata de l'une quelconque).