Le lundi 06 août 2007, Laurence Finston a écrit : > On Mon, 6 Aug 2007, cwcaceres wrote: > > For each command, I had to make a new commandlist. How do I do it > > so that I make Commandlist comlist; only once, at the start of the > > program? > > There are various ways: > > 1. Declare it globally and put an `extern' declaration into a header > file that you include in your parser input file. I don't recommend > this, especially if you're planning to use threads somewhere down the > line. > > 2. Declare it somewhere, perhaps in `main', and pass a pointer to it > as a parameter to `yyparse' (cast to `void*'). > > 3. Declare it as a data member of some class or struct and pass a > pointer to an instance of that type as the parameter to `yyparse'. > Instead, you might declare a pointer to it as the data member and > allocated memory for it dynamically. Or you could use an array of > `Commandlist' or an array of pointers to `Commandlist'. If you're > using C++ in your actions, you could use a `vector', a `queue', or > whatever. I would most likely use one of these variants of the basic > idea. > > These are just the possibilities that occur to me off the top of my > head. There may well be others. >
You can do this with the %parse-param directive ; first create a parser struct or class containing the datas you need inside the grammar : typedef struct _MyParser { Commandlist comlist; } MyParser; then add this to your grammar (%parse-lex is only required if you need those datas in yylex) : %parse-param { MyParser * p } %parse-lex { MyParser * p } and finally modify your yyparse and yylex functions to have the following prototypes : int yyparse (MyParser * p); int yylex (MyParser * p); Now you just have to create and initialize a MyParser struct and call yyparse(parser). You'll find more about this in the bison info page. -- Cédric Lucantis _______________________________________________ help-bison@gnu.org http://lists.gnu.org/mailman/listinfo/help-bison