1

В настоящее время я создаю компилятор для языка с функцией глобальной переменной и вложенной подпрограммы. Раньше я только когда-либо создавал компилятор для языков, у которых есть только локальная переменная без вложенной подпрограммы.Повторное использование таблицы символов из фазы семантического анализа для генерации кода

У меня возникла проблема с повторным использованием таблицы символов, заполненной во время фазы семантического анализа в фазе генерации кода. Я делаю таблицу символов как стек связанного списка, где каждый связанный список представляет идентификаторы, объявленные в определенной области. Каждый раз, когда он входит в область действия, создается новый список и помещается в стек, и он становится текущей областью. Аналогично, каждый раз, когда он покидает область действия, появляется список сверху стека. В конце концов, после того, как семантический анализ заканчивается, у меня практически есть пустая таблица символов, как и когда она начинается. Однако генератор кода нуждается в полностью заполненной таблице символов, чтобы правильно генерировать код. Как это можно сделать без повторения того, что было сделано во время семантического анализа (т. Е. Ввода идентификаторов в таблицу символов)?

+0

Вы считали структурирование вашей таблицы символов как дерева, а не стека, так что в конце есть целая дерево областей? –

+0

Вы имеете в виду, что это следует за иерархией AST? Я думаю, что лучше, чтобы соответствующие данные области были частью узла AST так же, как и принятый ответ, поэтому мне не нужно проходить два раза при входе/выходе из области – LeleDumbo

+0

no, scope следует своей собственной иерархии. Вы сохраняете все переменные и области, к которым они принадлежат, по многим причинам, включая символический листинг и для отладчика. АСТ должен все же указывать на символы, которые использовались в анализе. –

ответ

1

Это будет немного абстрактно - как ваш вопрос - поскольку я не знаю ничего конкретного о внутренних структурах вашего компилятора.

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

+0

Я был настолько глуп, действительно, я могу сделать указатель на данные области как часть соответствующего члена узла AST. Его можно выбросить вместе с AST позже. – LeleDumbo

4

Вы должны решить, какой объем вашего компилятора будет сохранен для поддержки оптимизации и генерации кода.

Вы можете создать генератор кода «чистый на лету», который отбрасывает информацию таблицы символов при выходе из области действия, если она сгенерировала весь код (или ИК), который он будет генерировать для этой области. Это может работать, если вы строите быстрый и грязный компилятор, и это полезно, когда на вашем компьютере не так много памяти. (На современных ПК вы не можете сделать последний аргумент).

Если вы не проводите анализ/оптимизацию кода/генерирование или генерацию кода до тех пор, пока не достигнете конца процесса синтаксического анализа, вам придется больше вставлять информацию о символьных таблицах в область видимости. В этом случае вы обнаружите, что вам тоже придется висеть на АСТ, иначе вам нечего будет генерировать код. (На современных ПК это не проблема).

Чтобы построить компилятор с простой архитектурой, вы, вероятно, захотите изолировать синтаксический анализ, семантический анализ и генерации кода в любом случае. В этом случае ваш синтаксический анализатор работает и просто строит АСТ; не беспокойтесь о создании таблицы символов. Пройдите две прогулки по дереву и создайте таблицы символов, которые соответствуют частям АСТ, и сохраняют это отношение; теперь у вас есть АСТ и связанные таблицы символов. Пасс 3 теперь может проходить АСТ и использовать информацию о символах для генерации и ИК. Пасс 4 оптимизирует ИК; он может по-прежнему ссылаться на записи таблицы символов, украшенные информацией типа и возможными назначениями места хранения. После этого вы можете сделать оптимизацию и окончательное создание кода.

Главное в этом, не отбрасывайте таблицы символов. Сохраните их и свяжите их с структурами кода, которые необходимы для генерации кода. У вас много памяти для их сохранения.

+0

Это на самом деле то же самое, что и принятый ответ, но нуждается в дальнейшем копании в последних двух параграфах. поскольку я могу принять только один ответ, дается преимущество. – LeleDumbo

+0

согласился, но это также более сложный/лучший ответ с рассуждением +1 – Mark