Построение Lisp / Scheme-подобного дерева разбора с помощью flex / bison - PullRequest
10 голосов
/ 30 июня 2010

Я пытался проанализировать простой код, похожий на Lisp / схему

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

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

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

1 Ответ

3 голосов
/ 08 июля 2010

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

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

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

...