Таблица символов отображает идентификаторы (обычно с префиксом имени области) на информацию об этом идентификаторе, такую как его тип символа (локальная переменная / параметр / функция / класс и т. Д.), Тип данных, его порядок относительно других идентификаторов.в той же области видимости, строке исходного кода и т. д. Таблицу символов можно сгенерировать путем обхода абстрактного синтаксического дерева, всегда отслеживая, в какой области вы находитесь, и добавляя информацию в таблицу символов при каждом обращении к объявлению переменной.В вашем примере часть таблицы символов может выглядеть следующим образом (сопоставление с типом символа, типом данных, положением и строкой исходного кода):
MULTIPLY.A -> {"LOCAL", "INT", 0, 4}
MULTIPLY.B -> {"LOCAL", "INT", 1, 4}
MULTIPLY.C -> {"LOCAL", "INT", 2, 4}
MULTIPLY.Aop -> {"FUNCTION", "INT", 3, 4}
MULTIPLY.Aop.A -> {"INOUTPARAM", "INT", 0, 6}
Теперь вы можете разрешить все ссылки на переменные.Например, в выражении A := A + 1
, если вы знаете, что ваша текущая область действия MULTIPLY.Aop
, таблица symnbol позволит вам узнать, что этот A
является параметром ввода / вывода типа INT
, и что онявляется первым параметром (эта информация позволит вам сгенерировать смещение адреса стека, чтобы вы могли загрузить / сохранить переменную).