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) 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_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)
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)
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)
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)
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
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)
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)