Вам, вероятно, нужно более одного AST. Ваш первый AST, созданный парсером, вероятно, полон лишних вещей, всего синтаксического сахара, который делает ваш исходный язык простым в использовании. Перед тем, как вы начнете генерировать IR, вам нужно удалить эту избыточность, иначе ваш шаг генерации кода станет повторяющимся образцом.
В данном случае - if
оператор. У вас есть две формы - одна с ветвью true
, а другая с ветвями true
и false
. Первое является особым случаем второго, поэтому имеет смысл сделать обход вашего AST, заменив все однорукие операторы if
на двухрукие фиктивной веткой false
. Тогда ваша процедура генерации ИК будет иметь дело только с одним видом if
.
Еще одним важным соображением является набор текста. Это проще сделать на дереве, чем на каком-то плоском IR, для подавляющего большинства систем типов.
Кроме того, рассматривайте ваш плоский IR как еще одну форму AST и относитесь к нему так же. Преобразование сложного AST в какой-нибудь низкий и простой внутренний AST (или IR, называйте его как хотите) небольшими шагами намного проще, чем делать все за один огромный проходной шаблон.