With Bison, I figured out how to get everything into one long string as follows:
arg_list:
WORD arg_list { strcat( $1, \"IFS\" ); $$ = strcat($1, $2); }
If you have an array type with a push_front operation, this is trivially:
arg_list:
WORD arg_list { $$ = $2.push_front($1); }
WORD { $$ = new Array($1); }
without that, it requires more work. You can use a vector and add the strings on the end (which will be in the reversed order). Or you can use a linked list (which is easier if you're using straight C):
arg_list:
WORD arg_list { $$ = malloc(sizeof(struct list_elem));
$$->next = $2;
$$->val = $1; }
WORD { $$ = malloc(sizeof(struct list_elem));
$$->next = 0;
$$->val = $1; }