Этап семантического анализа компилятора включает в себя работу с таблицей символов , которая, как следует из названия, отслеживает все символы (имена), используемые в программе.Это также позволяет обнаруживать необъявленные имена, например.
Итак, когда анализатор «видит» объявление, он создает новый символ (например, Symbol(type=Int, offset=0)
) и вставляет его в карту name -> Symbol
.Например, symbol_table["num"] = Symbol(type=Int, offset=0)
.
Затем, анализируя выражение или оператор (это оператор в вашем примере), компилятор может, например, анализировать типы своих членов.Для этого он ищет имена, используемые в таблице символов:
assign_to_symbol = symbol_table["num"]
if assign_to_symbol.type == right_hand_side.type:
DoStuff()
else:
ThatIsAnError()
Если в этой области нет имени "num"
, поиск завершается неудачно, что сигнализирует об ошибке.