Sounds like the parse tree is reduced from the right instead of the left.
The grammar looks properly left-recursive to me:
| m_expr_list: { $$=0; } | | m_expr_list2 optional_comma | ; | | m_expr_list2: assoc_pair | | m_expr_list2 ',' assoc_pair | { | if ($3) { | $$=mknode(F_ARG_LIST,$1,$3); | } else { | /* Error in assoc_pair */ | $$=$1; | } | } | | m_expr_list2 ',' error | ; | | assoc_pair: expr0 expected_colon expr0 | { | $$=mknode(F_ARG_LIST,$1,$3); | } | | expr0 expected_colon error { free_node($1); $$=0; } | ;
My guess is that the problem lies somewhere in the optimizer or code-generator.