2009-12-06 4 views
0

Lorsque je redirige l'entrée vers mon programme yacc à partir d'un fichier d'entrée, une fois l'analyse du fichier terminée, je souhaite que l'analyseur yacc imprime un résumé de ce qu'il a fait. Je veux qu'il fasse la même chose si j'entre la saisie par le clavier et puis j'appuie sur Ctrl + D. Y-a-t-il un moyen de faire ça?Comment mettre un message récapitulatif final dans un programme yacc?

+2

Voulez-vous le dans yacc/bison ou (f) lex? Vous pouvez simplement fournir votre propre fonction 'main()' qui appelle 'yyparse()', puis imprime un message à la fin. –

+0

Je le veux dans yacc au lieu de flex. – neuromancer

+2

La réponse à cette question devrait être évidente pour toute personne qui a réellement essayé d'écrire un programme en utilisant yacc. J'ai remarqué un motif de poser des questions par Phenom comme ceci. –

Répondre

-4

J'ai découvert que la solution à mon problème est de créer une fonction yywrap() dans le fichier .y. Cette fonction sera exécutée quand yacc rencontre un EOF, qui est soit la fin d'un fichier d'entrée, soit l'utilisateur qui appuie sur Ctrl-D. C'est la solution.

+1

Ceci s'exécute quand _lex_ rencontre EOF, pas quand yacc le fait. Ce sont deux moments différents. C'est une distinction importante à faire. 'yywrap' ne devrait rien faire de toute façon - c'est une forme terrible de" contrôle de flux "intégré dans lex. Le genre d'actions que vous pourriez faire dans 'yywrap' devrait être traité dans la fonction' main() 'de votre programme. –

+0

-1: d'accord avec Chris, il est là pour que vous puissiez passer au fichier d'entrée suivant, lors du traitement de nombreux fichiers. –

+0

Je n'ai pas de fonction principale, et même si je l'ai fait, je doute qu'il puisse faire quoi que ce soit puisque le principal serait dans le fichier .l et toutes mes variables sont dans le fichier. – neuromancer

0

sur la grammaire, vous pouvez appeler une fonction la fonction doit être sur la troisième partie

FIRST PART 

%% 
second PART 

GRAMMAR { CALL YOUR FUNCTION();} 
GRAMMAR2 VAR1 VAR2 VAR3 {CALL YOUR FUNCTION2($1,$2,$3);} 

%% 
third PART 

YOUR FUNCTION(){} 
YOUR FUNCTION2(int c, char*y , int z){} 

int main (void) { 
} 
    void yyerror (char *s) {fprintf (stderr, "%s\n", s);} 

votre fonction peut imprimer tout ce que vous voulez aussi la grammaire becouse vous maintenant d'où il appelle la fonction par la paramètre que vous donnez

Questions connexes