Following, sort of, some advice I received earlier I modified my bison by adding this:
open_bracket: '(' | '['; close_bracket: ')' | ']’; And then modified the original code thus: variable: VARIABLE_NAME { variable_t *new = malloc(sizeof(*new)); new->name = $1; new->subscripts = NULL; new->slicing = NULL; $$ = new; } | VARIABLE_NAME open_bracket exprlist close_bracket { variable_t *new = malloc(sizeof(*new)); new->name = $1; new->subscripts = $3; new->slicing = NULL; $$ = new; } This source code works: 130 DIM A$(26),G$(26),L$(1) But this fails: 130 DIM A$[26],G$[26],L$[1] In this case it falls though the first variable case, not the second, it is not treating the [ as an open. The open_bracket is the only place [ appears. I assume I have screwed up the alternation?