Как компилятор запоминает объявленную переменную при использовании в выражении? - PullRequest
0 голосов
/ 28 октября 2018

Как компилятор отслеживает объявление переменной, когда она используется в выражении?

Например, если у меня есть следующий код:

int num = 1; //declaration
num = 2; //expression

Я знаючто синтаксическое дерево будет генерировать ветвь для объявления и ветвь для выражения, но как оно поддерживает связь между ними в семантическом анализаторе?

1 Ответ

0 голосов
/ 28 октября 2018

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

Итак, когда анализатор «видит» объявление, он создает новый символ (например, 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", поиск завершается неудачно, что сигнализирует об ошибке.

...