diff --git a/ChangeLog b/ChangeLog index 33b038c2..15d9871d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2003-01-13 Akim Demaille , + Quoc Peyrot , + Robert Anisko + + * data/lalr1.cc (parse::yyerrlab1): When popping the stack, stop + when the stacks contain one element, as the loop would otherwise + free the last state, and then use the top state (the one we just + popped). This means that the initial elements will not be freed + explicitly, as is the case in yacc.c; it is not a problem, as + these elements have fake values. + 2003-01-11 Paul Eggert * NEWS: %expect-violations are now just warnings, reverting diff --git a/data/lalr1.cc b/data/lalr1.cc index bab5e5f6..a2329e3a 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -302,7 +302,10 @@ yy::]b4_parser_class_name[::parse () int nerrs = 0; int errstatus = 0; - /* Initialize stack. */ + /* Initialize the stacks. The initial state will be pushed in + yynewstate, since the latter expects the semantical and the + location values to have been already stored, initialize these + stacks with a primary value. */ state_stack_ = StateStack (0); semantic_stack_ = SemanticStack (1); location_stack_ = LocationStack (1); @@ -545,7 +548,7 @@ b4_syncline([@oline@], [@ofile@])[ } /* Pop the current state because it cannot handle the error token. */ - if (!state_stack_.height ()) + if (state_stack_.height () == 1) goto yyabortlab; #if YYDEBUG