From: Philip H. <her...@go...> - 2009-09-20 21:41:57
|
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 John Levine wrote: >> I think i posted a few days ago about using gnu readline and flex >> and if anyone had any ideas and there today i played around and i >> have a nice hack so I'll post it here :) > > This seems awfully overcomplicated, due to the usual problem that > nobody bothers to read the section of the man page that starts at > MULTIPLE INPUT BUFFERS. > > C version: > > while(1) { YY_BUFFER_STATE *bp; char *f = readline(">>> "); > > bp = yy_scan_string(f); free(f); yy_switch_to_buffer(bp); > > yyparse(); /* eat the input */ > > yy_delete_buffer(bp); } > > R's, John Hey Thanks, i have always been hesitant on touching much of lex/yacc internals in-case some may have *ism's that break in certain ways or something or if it meant doing changes to the actual generated code or anything. So i thought it would be easier to make a pipe to get me a file descriptor that yyin can equal and i don't have to worry about it. But this works well i adapted your code it works nicely: int parse( FILE* fin ) { int err= 0; if( fin == stdin ) { char *line, *prompt= ">>> "; YY_BUFFER_STATE bp; while( 1 ) { line= readline(prompt); if( line == 0 ) break; else if( strlen(line) > 0) { add_history(line); bp= yy_scan_string( line ); yy_switch_to_buffer(bp); err= yyparse(); yy_delete_buffer(bp); } } } else { yyin= fin; err= yyparse(); } return err; } Just I didn't need YY_BUF to be a pointer as switch to buf does return a pointer and gives warnings :) - --Phil -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iEYEARECAAYFAkq2oZMACgkQAhcOgIaQQ2H77QCfcVQCghHJyHVRfNDDndj7i/2i Mt0An3d7wwmlMvy3sPr7EUmXv3q8o4vB =Xw0t -----END PGP SIGNATURE----- |