ar = ActivationRecord( name=proc_name, type=ARType.PROCEDURE, nesting_level=2, )
在活动记录中保存过程实参
以下是描述解释器在活动记录中保存过程参数所需采取的步骤:
获取过程的形参列表
获取过程的实参列表
对于每个形参,获取对应的实参,以形参名称为键,实参求值后作为值保存在过程的活动记录中
过程调用的形参被保存在 ProcedureSymbol 中:
1 2 3 4 5 6 7 8 9 10 11
classSymbol: def__init__(self, name, type=None): self.name = name self.type = type
classProcedureSymbol(Symbol): def__init__(self, name, formal_params=None): super().__init__(name) # a list of VarSymbol objects self.formal_params = [] if formal_params isNoneelse formal_params
代码令 ProcedureCall 节点持有 ProcedureSymbol 数据:
1 2 3 4 5 6 7
classProcedureCall(AST): def__init__(self, proc_name, actual_params, token): self.proc_name = proc_name self.actual_params = actual_params # a list of AST nodes self.token = token # a reference to procedure declaration symbol self.proc_symbol = None
这样在语义分析的时候就可以获取到过程调用节点的形参:
1 2 3 4 5 6 7 8
classSemanticAnalyzer(NodeVisitor): defvisit_ProcedureCall(self, node): for param_node in node.actual_params: self.visit(param_node)
proc_symbol = self.current_scope.lookup(node.proc_name) # accessed by the interpreter when executing procedure call node.proc_symbol = proc_symbol