Hello, everyone.

I am currently working on a Yacc parser, using GNU Bison. I have the following grammar rules:

block_list:
    block_expr '\n'
    {$$ = new_expression(exprBlock, 1, $1);}
  | block_list block_expr '\n'
    {expression_add_child($1, $2);
     $$ = $1;
    }
  ;

With new_expression creating an expression with the exprBlock type. Yet the following assertion in expression_add_child fails :

assert(expr->type == exprBlock); // expr is $1

An extract of the verbose Bison output, with the assertion failure :

Next token is token '\n' ()
Shifting token '\n' ()
Entering state 97
Stack now 0 2 7 12 31 69 97
Reducing stack by rule 17 (line 115):
   $1 = nterm block_list ()
   $2 = nterm block_expr ()
   $3 = token '\n' ()
flang: src/parser_utils.c:158: expression_add_child: Assertion `expr->type == exprBlock' failed.

Upon inspection with GDB, it seems like when the assertion fails, $1 is of type exprVar (a possible expression type for a block_expr) and more surprisingly, $1 == $2

I am on Debian 12, and the output of bison -V is the following :

bison (GNU Bison) 3.8.2

Thank you in advance.


Reply via email to