Ismael Moreno wrote: > void cAssigNode::translate(cVM& vm) throw(std::exception) > { > char* Text; > Text = strdup(RValue.c_str()); > > FILE* yyin = fmemopen(Text, strlen(Text), "r"); > if(yyin == NULL) > throw(cError("Can't open yyin stream")); > > yyparse();
yyparse() (well, yylex() really) can't (and won't) use your function-local yyin. Note that adjusting the code to use the global yyin won't necessarily work; flex will only cleanly switch to the new yyin if it got an EOF state on the original one. Using yyrestart(), you to tell flex/bison that a new "file" should be processed, even if the current/previous one wasn't fully processed (so that flex can clear its internal cache). So put a "yyrestart(yyin);" before each yyparse() and things should work. Depending on your lexer you may want to add a function of your own (say, yy_new_file()) to your .l file, that not only calls yyrestart(), but also sets the lexer state back to INITIAL (so that a parse error inside a state in the first yyparse() does not break the second yyparse()). You typically want to test yyparse()'s return value too, so that you can detect parse errors. > [snip] > delete Text; Memory allocated by malloc() (even indirectly via strdup()) should be freed using free(), not delete. I'm not sure the strdup() is even needed - I would expect that fmemopen(RValue.c_str(), RValue.size(), "r"); works just as well. _______________________________________________ Help-bison@gnu.org http://lists.gnu.org/mailman/listinfo/help-bison