10
votes

Comment utiliser yy_scan_string dans lex

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


1 commentaires

Étroitement lié à: Stackoverflow.com/q/1920604/15168 et Stackoverflow.com/q/1909166/15168 (bien que pas tout à fait un duplicata de l'une quelconque).


6 Réponses :


3
votes

Je recommande toujours Cette page aux personnes qui veulent apprendre lex / yacc ( ou flex / bison)


3 commentaires

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.



-1
votes

J'ai trouvé et par exemple ici pour moi-même. Puisse-t-il être utile pour vous:

http://osdir.com/ml/lex .flex.windows / 2003-04 / msg00008.html


1 commentaires

Le lien est cassé



9
votes

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: xxx


2 commentaires

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.



19
votes

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;
}


1 commentaires

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 dans le fichier LXER.



4
votes

Cela a fonctionné pour moi ... Utilisez yy_scan_string () xxx


0 commentaires

0
votes

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 , aucune des réponses existantes ne le démontre.

Cela constitue essentiellement cela pour maintenir un yy_buffer_state yy_buffer_state; autour de quelque part et appeler yy_delete_buffer ( yy_buffer_state) quand il est temps de basculer entre les chaînes. Lorsque Flex est attribué une nouvelle chaîne à numériser (avec yy_scan_string () ), un nouveau yy_buffer_state est généré, que vous devez suivre, que vous devez suivre.

J'ai essayé de montrer un point de vue raisonnablement Exemple complet, mais l'argent-shot est setlexerbuffer () près du bas ~

par exemple: xxx

donc ce Vous permet d'exécuter une boucle de contrôle comme: xxx

Cet exemple a été exécuté via Valgrind pour vérifier la mémoire-correction.


0 commentaires