Я пытался проанализировать простой код Lisp/scheme-like
E.g. (func a (b c d) )
и создайте дерево из него, я мог сделать парсинг в C без использования bison
(т.е., с помощью только flex
возвратить маркеры и создание дерева с рекурсией). Но, с bison
грамматика, я не уверен, где добавить код для создания списка (т.е., которые управляют для соединения с накоплением терминальных символов и где связать созданный список для порождения узла).
Моя грамматика подобна той здесь: грамматика Lisp в yacc грамматика корректна и может распознать код.
Пробовали ли вы разместить код для добавления элемента в текущий список в каждом атоме, и код для управления деревом списков при обработке скобок? Это кажется самым простым способом, если только вы не столкнетесь с другими проблемами:
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");}
;
Это предполагает, что вы сохраняете родительскую точку в каждом списке struct.