Я создаю простой императивный язык с нуля, у меня уже есть работающее синтаксическое дерево, без особых сложностей, оно просто использует восходящий стиль синтаксического анализа для его создания с использованием простой древовидной структуры данных.Идея теперь состоит в том, чтобы реализовать полную таблицу символов стиля 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
Кажется, что одно состояние может не сработать, и есть комбинация монадическогоа не монадические действия, какова была бы лучшая структура, чтобы решить это.