Создание дерева синтаксического анализа Lisp/Scheme-like с гибким проводом/бизоном

Я пытался проанализировать простой код Lisp/scheme-like

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

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

Моя грамматика подобна той здесь: грамматика Lisp в yacc грамматика корректна и может распознать код.

10
задан Community 23 May 2017 в 12:19
поделиться

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

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

3
ответ дан 4 December 2019 в 04:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: