В настоящее время я создаю компилятор для языка с функцией глобальной переменной и вложенной подпрограммы. Раньше я только когда-либо создавал компилятор для языков, у которых есть только локальная переменная без вложенной подпрограммы.Повторное использование таблицы символов из фазы семантического анализа для генерации кода
У меня возникла проблема с повторным использованием таблицы символов, заполненной во время фазы семантического анализа в фазе генерации кода. Я делаю таблицу символов как стек связанного списка, где каждый связанный список представляет идентификаторы, объявленные в определенной области. Каждый раз, когда он входит в область действия, создается новый список и помещается в стек, и он становится текущей областью. Аналогично, каждый раз, когда он покидает область действия, появляется список сверху стека. В конце концов, после того, как семантический анализ заканчивается, у меня практически есть пустая таблица символов, как и когда она начинается. Однако генератор кода нуждается в полностью заполненной таблице символов, чтобы правильно генерировать код. Как это можно сделать без повторения того, что было сделано во время семантического анализа (т. Е. Ввода идентификаторов в таблицу символов)?
Вы считали структурирование вашей таблицы символов как дерева, а не стека, так что в конце есть целая дерево областей? –
Вы имеете в виду, что это следует за иерархией AST? Я думаю, что лучше, чтобы соответствующие данные области были частью узла AST так же, как и принятый ответ, поэтому мне не нужно проходить два раза при входе/выходе из области – LeleDumbo
no, scope следует своей собственной иерархии. Вы сохраняете все переменные и области, к которым они принадлежат, по многим причинам, включая символический листинг и для отладчика. АСТ должен все же указывать на символы, которые использовались в анализе. –