在表达式中使用时,编译器如何记住声明的变量?
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"
,则查找失败,从而发出错误信号。
在表达式中使用变量时,编译器如何跟踪变量的声明?
例如,如果我有以下代码:
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"
,则查找失败,从而发出错误信号。