Re: Bison parser exhibiting weird behavior

Fr <[email protected]> Sun, 7 Sep 2025 14:36:43 +0200
Newsgroups gmane.comp.parsers.bison.general
Message-ID <[email protected]>
Solved it ! The reallocation of the expression in expression_add_child 
moved the block every time except when running in Valgrind (until a few 
minutes ago). That then caused the following expression, that was a 
parent of the previous one, to overwrite it except for the children 
list, thus causing a recursion.

Thank you everyone for the help !

PS : I am posting this here as "Nathanael" seems to have responded 
outside of the mailing list.

On 9/7/25 00:20, James K. Lowden wrote:
> On Sat, 6 Sep 2025 11:01:47 +0200
> Fr <[email protected]> wrote:
>
>> Upon inspection with GDB, it seems like when the assertion fails, $1
>> is of type exprVar (a possible expression type for a block_expr)
> You might try adding assertions to your actions up at the Bison level.
> If all is as you say, then
>
>       block_expr '\n'
>       {$$ = new_expression(exprBlock, 1, $1);
> 	assert( $$->type == exprBlock);
> 	}
>
> should be true and
>
>     | block_list block_expr '\n'
>       {
> 	assert($1->type == exprBlock);
> 	assert($1 != $2);
> 	expression_add_child($1, $2);
>
> should be true.
>
> My guess would be that block_expr can be constructed by some other rule
> (possibly one that doesn't require \n) that produces an exprVar, and
> then the list is constructed.  Or new_expression() is not doing what's
> expected.
>
>> and more surprisingly, $1 == $2
> I just don't think that's possible, if $1 and $2 are pointers.  If they
> are values and operator== is overloaded, that's another story.
>
> HTH.
>