def dectype(parameters): ice9_parser_global.logger.debug("Entering dectype") paramter_identifier_list = ice9_parser_var.idlist() if ice9_parser_global.tok.type == 'COLON': ice9_parser_global.consume() ice9_parser_global.logger.debug(ice9_parser_global.tok) else: print "Line", ice9_parser_global.tok.lineno, ": on token", ice9_parser_global.tok.value, "expecting ':'" sys.exit() if ice9_parser_global.tok.type == 'ID': paramter_identifier_type = ice9_parser_global.tok.value if paramter_identifier_type not in ice9_st_type.st_type: print "Line", ice9_parser_global.tok.lineno, ": on token", ice9_parser_global.tok.value \ + " type", paramter_identifier_type, "not defined" sys.exit() ice9_parser_global.consume() ice9_parser_global.logger.debug(ice9_parser_global.tok) else: print "Line", ice9_parser_global.tok.lineno, ": on token", ice9_parser_global.tok.value, "expecting id" sys.exit() for param in paramter_identifier_list: id_node = ice9_node.id_node(str(param), paramter_identifier_type, 0) parameters.append(id_node) ice9_parser_global.logger.debug("Exiting dectype")
def vartype(): ice9_parser_global.logger.debug("Entering vartype") var_node_list = list() if ice9_parser_global.tok.type == "ID": identifier_list = idlist() else: print "Line", ice9_parser_global.tok.lineno, ": on token", ice9_parser_global.tok.value, "expecting id" sys.exit() if ice9_parser_global.tok.type == "COLON": ice9_parser_global.consume() ice9_parser_global.logger.debug(ice9_parser_global.tok) else: print "Line", ice9_parser_global.tok.lineno, ": on token", ice9_parser_global.tok.value, "expecting ':'" sys.exit() if ice9_parser_global.tok.type == "ID": type_node = typeid() else: print "Line", ice9_parser_global.tok.lineno, ": on token", ice9_parser_global.tok.value, "expecting id" sys.exit() for identifier in identifier_list: # Depending on the scope, calculate location for variable # If scope is GLOBAL, then location is in GLOBAL section # If scope is a procedure, then location is on stack, relative to FP if ice9_parser_global.scope[-1] == "GLOBAL": address = ice9_parser_global.get_next_global_address() ice9_parser_global.global_pointer += type_node.length - 1 else: address = ice9_st_proc.st_proc[ice9_parser_global.scope[-1]].local_variable_line ice9_st_proc.st_proc[ice9_parser_global.scope[-1]].local_variable_line -= type_node.length # Add entry to symbol table identifier_entry = ice9_st_var.st_var_entry( type_node.data_type, type_node.dimension, address, type_node.dimension_length ) ice9_st_var.add_entry_to_st_var(str(identifier), identifier_entry) id_node = ice9_node.id_node(str(identifier), type_node.data_type, type_node.dimension) id_node.set_basic_data_type() var_node_list.append(id_node) var_node = ice9_node.var_node(var_node_list, type_node) ice9_parser_global.logger.debug("Exiting vartype") return var_node