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
Ejemplo n.º 2
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)
Ejemplo n.º 3
0
    def visit_VarDecl(self, node):
        type_name = node.type_node.value
        type_symbol = self.symtab.lookup(type_name)

        # We have all the information we need to create a variable symbol.
        # Create the symbol and insert it into the symbol table.
        var_name = node.var_node.value
        var_symbol = VarSymbol(var_name, type_symbol)
        self.symtab.insert(var_symbol)
Ejemplo n.º 4
0
    def visit_VarDecl(self, node):
        type_name = node.type_node.value
        type_symbol = self.scope.lookup(type_name)

        # Create the symbol and insert it into the symbol table.
        var_name = node.var_node.value
        var_symbol = VarSymbol(var_name, type_symbol)

        self.scope.insert(var_symbol)
Ejemplo n.º 5
0
    def visit_VarDecl(self, node):
        # For now, manually create a symbol for the INTEGER built-in type
        # and insert the type symbol in the symbol table.
        type_symbol = BuiltinTypeSymbol('INTEGER')
        self.symtab.insert(type_symbol)

        # We have all the information we need to create a variable symbol.
        # Create the symbol and insert it into the symbol table.
        var_name = node.var_node.value
        var_symbol = VarSymbol(var_name, type_symbol)
        self.symtab.insert(var_symbol)
    def visit_VarDecl(self, node):
        type_name = node.type_node.value
        type_symbol = self.current_scope.lookup(type_name)
        var_name = node.var_node.value
        var_symbol = VarSymbol(var_name, type_symbol)
        if self.current_scope.lookup(var_name, current_scope_only=True):
            raise Exception("Error: Duplicate identifier '%s' found" %
                            var_name)

        self.current_scope.insert(var_symbol)
        scope_level = str(self.current_scope.scope_level)
        return "   var %s : %s0;" % (var_name + scope_level, type_name)
Ejemplo n.º 7
0
    def visit_VarDecl(self, node):
        type_name = node.type_node.value
        type_symbol = self.symtab.lookup(type_name)

        # We have all the information we need to create a variable symbol.
        # Create the symbol and insert it into the symbol table.
        var_name = node.var_node.value
        var_symbol = VarSymbol(var_name, type_symbol)

        # Signal an error if the table alrady has a symbol
        # with the same name
        if self.symtab.lookup(var_name) is not None:
            raise Exception("Error: Duplicate identifier '%s' found" %
                            var_name)

        self.symtab.insert(var_symbol)
Ejemplo n.º 8
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
Ejemplo n.º 9
0
    def visit_VarDecl(self, node):
        type_name = node.type_node.value
        type_symbol = self.current_scope.lookup(type_name)

        # We have all the information we need to create a variable symbol.
        # Create the symbol and insert it into the symbol table.
        var_name = node.var_node.value
        var_symbol = VarSymbol(var_name, type_symbol)

        # Signal an error if the table alrady has a symbol
        # with the same name
        if self.current_scope.lookup(var_name, current_scope_only=True):
            raise Exception("Error: Duplicate identifier '%s' found" %
                            var_name)

        self.current_scope.insert(var_symbol)
        scope_level = str(self.current_scope.scope_level)
        return '   var %s : %s;' % (var_name + scope_level, type_name)
Ejemplo n.º 10
0
        return s

    __repr__ = __str__

    def insert(self, symbol):
        print('Insert: %s' % symbol.name)
        self._symbols[symbol.name] = symbol


if __name__ == '__main__':
    text = """
program SymTab1;
   var x, y : integer;
begin
end.
"""
    lexer = Lexer(text)
    parser = Parser(lexer)
    tree = parser.parse()

    symtab = SymbolTable()
    int_type = BuiltinTypeSymbol('INTEGER')
    symtab.insert(int_type)

    var_x_symbol = VarSymbol('x', int_type)
    symtab.insert(var_x_symbol)

    var_y_symbol = VarSymbol('y', int_type)
    symtab.insert(var_y_symbol)
    print(symtab)