Пример #1
0
    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
Пример #3
0
    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