Как получить сгенерированный AST из лимона?

Как получить корневой узел AST (абстрактного синтаксического дерева) из lemon? Я попытался использовать %extra_argument { Node *rootNode } и использовать следующий код для возврата объекта корневого узла.

program ::= statements(A). { rootNode = A; }

Но корневой узел корневой узел в основной функции разбора остается пустым.

Вот основная функция разбора.

Node parse()
{
    void* parser = ParseAlloc(malloc);
    int token;
    Node astRoot;

    while (token = yylex())
    {
        Parse(parser, token, yytext, &astRoot);
    }

    Parse(parser, 0, NULL, &astRoot);
    ParseFree(parser, free);

    return astRoot;
}

Кто-нибудь может помочь? Заранее спасибо.


person CoffeeTurtle    schedule 07.05.2019    source источник
comment
Пожалуйста, уточните, как вы использовали дополнительный аргумент и проблему, с которой столкнулись. Включите фактический образец кода или, что еще лучше, минимально воспроизводимый пример.   -  person rici    schedule 07.05.2019


Ответы (1)


rootNode — это указатель. Вы обновляете локальную переменную rootNode. Попробуйте разыменовать его при копировании:

program ::= statements(A). { *rootNode = *A; }
person Kelvin Sherlock    schedule 07.05.2019
comment
Спасибо за помощь, но это не сработало, объект astRoot остается пустым. - person CoffeeTurtle; 08.05.2019