在表达式中使用时,编译器如何记住声明的变量?

How does a compiler remember declared variable when used in expression?

在表达式中使用变量时,编译器如何跟踪变量的声明?

例如,如果我有以下代码:

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

我知道语法树会为声明生成一个分支,为表达式生成一个分支,但是它如何在语义分析器中保持它们之间的联系?

编译器的语义分析阶段包括处理一个符号table,顾名思义,它会跟踪编译器中使用的所有符号(名称)程序。这也允许检测未声明的名称,例如。

因此,当分析器 "sees" 声明时,它会创建一个新符号(如 Symbol(type=Int, offset=0))并将其插入到映射 name -> Symbol 中。例如,symbol_table["num"] = Symbol(type=Int, offset=0).

然后,在分析表达式或语句(在您的示例中是语句)时,编译器可以例如分析其成员的类型。为此,它会查找符号 table:

中使用的名称
assign_to_symbol = symbol_table["num"]
if assign_to_symbol.type == right_hand_side.type:
    DoStuff()
else:
    ThatIsAnError()

如果此范围内没有名称 "num",则查找失败,从而发出错误信号。