Строение Lisp/Схема, подобная дереву синтаксического анализа с использованием flex/bison

Я пытался разобрать простой Lisp/код-код

E.g. (func a (b c d) )

и построить из него дерево, Я мог бы выполнить синтаксический анализ на C без использования bison (т.е. Используя только flex, чтобы возвращать маркеры и строить дерево с рекурсией). Но, с грамматикой bison, я не уверен, где добавить код в построить список (т.е. какое правило связывать с накопительным терминалом символы и ссылки на встроенный список в родительский node).

Моя грамматика похожа на таковую здесь: Lisp грамматика в yacc грамматика правильна и может распознать код.

Ответ 1

Вы пытались помещать код для добавления элемента в текущий список в каждом атоме и код для управления деревом списков при обработке скобок? Это самый простой способ, если вы не столкнетесь с другими проблемами:

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");}
    ;

Это предполагает, что вы сохраняете родительскую точку в каждой структуре списка.