Вы пытались разместить код для добавления элемента в текущий список в каждом атоме и код для управления деревом списков при обработке скобок? Это кажется самым простым способом, если вы не столкнетесь с другими проблемами:
listend: members ')' { cur = cur->parent; }
| ')' { cur = cur->parent; }
;
list: '(' listend { cur = newList(cur);}
;
atom: ID { appendAtom(cur, "ID"); }
| NUM { appendAtom(cur, "NUM");}
| STR { appendAtom(cur, "STR");}
;
Это предполагает, что вы сохраняете родительскую точку в каждой структуре списка.