Создание AST и одновременное управление таблицей символов с помощью анализаторов Happy Haskell - PullRequest
0 голосов
/ 20 мая 2018

Я создаю простой императивный язык с нуля, у меня уже есть работающее синтаксическое дерево, без особых сложностей, оно просто использует восходящий стиль синтаксического анализа для его создания с использованием простой древовидной структуры данных.Идея теперь состоит в том, чтобы реализовать полную таблицу символов стиля LeBlanc-Cook.Его структура не сложна, проблема в том, что я не знаю, как сделать его счастливым, одновременно создавая дерево.

Идея сделать все это за один проход состоит в том, что в этомТаким образом, AST может быть заполнен только необходимым минимумом, игнорируя такие вещи, как объявления переменных или типов, которые имеют только эффекты в таблице символов.Мой последний вариант - обход AST для заполнения таблицы.

У меня есть основная идея, что это некое глобальное состояние, изменяемое только в определенные моменты времени выбора, например, когда открыт новый блок или когда переменнаяобъявляется, но я понятия не имею, как использовать среду, которая дает мне счастье, вместе с любой монадической структурой, которую я бы создал.

Я знаю, что этот вопрос можно свести к чему-то вроде «как работает счастливая?»,но в любом случае.Любой комментарий приветствуется.

Вот пример, чтобы немного лучше проиллюстрировать мой вопрос.

% monad {MyState}
...
START: INSTRUCTIONS   { (AST_Root $1, Final_Symtable_State) } -- Ideally

INSTRUCTIONS: INSTRUCTIONS INSTRUCTION    { $2:$1 } -- A list of all instructions
    | INSTRUCTION                         { [$1] }

INSTRUCTION : VARDEF    {%???}
    |  TYPEDEF
    |  VARMOD   
    | ...

...

VARDEF: let identifier : Int                   {%???}  -- This should modify the symtable state and not the tree
           | let identifier : Int = number     {%???}  -- This should modify the symtable and provide a new branch for the tree

Кажется, что одно состояние может не сработать, и есть комбинация монадическогоа не монадические действия, какова была бы лучшая структура, чтобы решить это.

...