def visit_ProcedureDecl(self, node): proc_name = node.proc_name proc_symbol = ProcedureSymbol(proc_name) self.current_scope.insert(proc_symbol) print('ENTER scope: %s' % proc_name) # Scope for parameters and local variables procedure_scope = ScopedSymbolTable( scope_name=proc_name, scope_level=self.current_scope.scope_level + 1, enclosing_scope=self.current_scope) self.current_scope = procedure_scope # Insert parameters into the procedure scope for param in node.params: param_type = self.current_scope.lookup(param.type_node.value) param_name = param.var_node.value var_symbol = VarSymbol(param_name, param_type) self.current_scope.insert(var_symbol) proc_symbol.params.append(var_symbol) self.visit(node.block_node) print(procedure_scope) self.current_scope = self.current_scope.enclosing_scope print('LEAVE scope: %s' % proc_name)
def visit_ProcedureDecl(self, node): proc_name = node.proc_name proc_symbol = ProcedureSymbol(proc_name) self.current_scope.insert(proc_symbol) result_str = "procedure %s%s" % (proc_name, self.current_scope.scope_level) procedure_scope = ScopedSymbolTable( scope_name=proc_name, scope_level=self.current_scope.scope_level + 1, enclosing_scope=self.current_scope) self.current_scope = procedure_scope if node.params: result_str += "(" formal_params = [] for param in node.params: param_type = self.current_scope.lookup(param.type_node.value) param_name = param.var_node.value var_symbol = VarSymbol(param_name, param_type) self.current_scope.insert(var_symbol) proc_symbol.params.append(var_symbol) scope_level = str(self.current_scope.scope_level) formal_params.append("%s : %s0" % (param_name + scope_level, param_type.name)) result_str += "; ".join(formal_params) if node.params: result_str += ")" result_str += ";" result_str += "\n" result_str += self.visit(node.block_node) result_str += "; {END OF %s}" % proc_name result_str = "\n".join(" " + line for line in result_str.splitlines()) self.current_scope = self.current_scope.enclosing_scope return result_str
def visit_ProcedureDecl(self, node): proc_name = node.proc_name proc_symbol = ProcedureSymbol(proc_name) self.current_scope.insert(proc_symbol) result_str = 'procedure %s%s' % (proc_name, self.current_scope.scope_level) # Scope for parameters and local variables procedure_scope = ScopedSymbolTable( scope_name=proc_name, scope_level=self.current_scope.scope_level + 1, enclosing_scope=self.current_scope) self.current_scope = procedure_scope if node.params: result_str += '(' formal_params = [] # Insert parameters into the procedure scope for param in node.params: param_type = self.current_scope.lookup(param.type_node.value) param_name = param.var_node.value var_symbol = VarSymbol(param_name, param_type) self.current_scope.insert(var_symbol) proc_symbol.params.append(var_symbol) scope_level = str(self.current_scope.scope_level) formal_params.append('%s : %s' % (param_name + scope_level, param_type.name)) result_str += '; '.join(formal_params) if node.params: result_str += ')' result_str += ';' result_str += '\n' result_str += self.visit(node.block_node) result_str += '; {END OF %s}' % proc_name # indent procedure text result_str = '\n'.join(' ' + line for line in result_str.splitlines()) self.current_scope = self.current_scope.enclosing_scope return result_str