def get_symbol_value(cls, name, index=-1): symbol = cls.get_symbol(name) if index == -1: return symbol.get_value() if len(symbol.get_value().get_value()) < index + 1: raise ErrorInterpret("数组" + name + "越界") if symbol.get_type() in [SymbolItem.ARRAY_INT, SymbolItem.ARRAY_DOU]: value = Value(SymbolItem.ARRAY_INT) value.set_value(symbol.get_value().get_value()[index]) return value
def parse_input(cls, content): try: if re.match('-?([0-9]+.[0-9]+)', content): value = Value(SymbolItem.DOUBLE, string.atof(content)) return value elif re.match('-?[0-9]+]', content): value = Value(SymbolItem.INT, string.atoi(content)) return value raise ErrorInterpret("输入非法") except ErrorInterpret as e: print(e.content)
def get_value(cls, str_id): try: if type(str_id) == float: value = Value(SymbolItem.DOUBLE, str_id) return value elif type(str_id) == int: value = Value(SymbolItem.INT, str_id) return value index = -1 if cls.is_array(str_id): index = cls.get_array_index(str_id) return cls.symbol_table.get_symbol_value(cls.get_identify(str_id), index) except ErrorInterpret as e: print(e.content)
def quaternion_analysis(cls, quaternion): try: instr_type = quaternion.get_first() # 跳转 if instr_type == Quaternion.GO: # 符合跳转条件 if quaternion.get_second( ) is None or cls.symbol_table.get_symbol_value( quaternion.get_second()).get_value() == False: cls.pc = cls.get_value(quaternion.get_forth()).get_value() return elif instr_type == Quaternion.READ: input_content = raw_input() req_type = cls.symbol_table.get_symbol_type( cls.get_identify(quaternion.get_forth())) if req_type in [SymbolItem.INT, SymbolItem.ARRAY_INT]: value = cls.parse_input(input_content) if value.get_type() == SymbolItem.INT: cls.set_value(quaternion.get_forth(), value) else: raise ErrorInterpret("输入类型不匹配") elif req_type in [SymbolItem.DOUBLE, SymbolItem.ARRAY_DOU]: value = cls.parse_input(input_content) cls.set_value(quaternion.get_forth(), value) elif instr_type == Quaternion.WRITE: index = -1 forth = quaternion.get_forth() if type(forth) == int: cls.result.append(forth) else: if cls.is_array(forth): index = cls.get_array_index(quaternion.get_forth()) cls.result.append( cls.symbol_table.get_symbol_value( quaternion.get_forth(), index).get_value()) elif instr_type == Quaternion.IN: cls.scope_level += 1 elif instr_type == Quaternion.OUT: cls.symbol_table.pop(cls.scope_level) cls.scope_level -= 1 elif instr_type == Quaternion.INT: if quaternion.get_third() is not None: symbol = SymbolItem(quaternion.get_forth(), SymbolItem.ARRAY_INT, s_level=cls.scope_level) symbol.get_value().set_value( quaternion.get_third()) # maybe not work cls.symbol_table.insert(symbol) else: int_value = 0 if quaternion.get_second() is not None: int_value = Value(SymbolItem.INT, int(quaternion.get_second())) symbol = SymbolItem(quaternion.get_forth(), SymbolItem.INT, int_value, cls.scope_level) cls.symbol_table.insert(symbol) elif instr_type == Quaternion.DOUBLE: if quaternion.get_third() is not None: symbol = SymbolItem(quaternion.get_forth(), SymbolItem.ARRAY_DOU, s_level=cls.scope_level) symbol.get_value().set_value( quaternion.get_third()) # maybe not work cls.symbol_table.insert(symbol) else: int_value = 0 if quaternion.get_second() is not None: int_value = Value(SymbolItem.INT, quaternion.get_second()) symbol = SymbolItem(quaternion.get_forth(), SymbolItem.DOUBLE, int_value, cls.scope_level) cls.symbol_table.insert(symbol) elif instr_type == Quaternion.ASSIGN: value = cls.get_value(quaternion.get_second()) cls.set_value(quaternion.get_forth(), value) elif instr_type == Quaternion.PLUS: cls.set_value( quaternion.get_forth(), cls.get_value(quaternion.get_second()).plus( cls.get_value(quaternion.get_third()))) elif instr_type == Quaternion.MINUS: if quaternion.get_third() is not None: cls.set_value( quaternion.get_forth(), cls.get_value(quaternion.get_second()).minus( cls.get_value(quaternion.get_third()))) else: cls.set_value( quaternion.get_forth(), Value.negative(cls.get_value(quaternion.get_second()))) elif instr_type == Quaternion.MUL: cls.set_value( quaternion.get_forth(), cls.get_value(quaternion.get_second()).multiple( cls.get_value(quaternion.get_third()))) elif instr_type == Quaternion.DIV: cls.set_value( quaternion.get_forth(), cls.get_value(quaternion.get_second()).division( cls.get_value(quaternion.get_third()))) elif instr_type == Quaternion.GT: cls.set_value( quaternion.get_forth(), cls.get_value(quaternion.get_second()).greater( cls.get_value(quaternion.get_third()))) elif instr_type == Quaternion.GET: cls.set_value( quaternion.get_forth(), cls.get_value(quaternion.get_second()).greater_equal( cls.get_value(quaternion.get_third()))) elif instr_type == Quaternion.LT: cls.set_value( quaternion.get_forth(), cls.get_value(quaternion.get_second()).less( cls.get_value(quaternion.get_third()))) elif instr_type == Quaternion.LET: cls.set_value( quaternion.get_forth(), cls.get_value(quaternion.get_second()).less_equal( cls.get_value(quaternion.get_third()))) elif instr_type == Quaternion.EQ: cls.set_value( quaternion.get_forth(), cls.get_value(quaternion.get_second()).equal( cls.get_value(quaternion.get_third()))) elif instr_type == Quaternion.NEQ: cls.set_value( quaternion.get_forth(), cls.get_value(quaternion.get_second()).not_equal( cls.get_value(quaternion.get_third()))) cls.pc += 1 except ErrorInterpret as e: print(e.content)
def quaternion_analysis(cls, quaternion): try: instr_type = quaternion.get_first() # 跳转 if instr_type == Quaternion.GO: # 符合跳转条件 if quaternion.get_second() is None or cls.symbol_table.get_symbol_value(quaternion.get_second()).get_value() == False: cls.pc = cls.get_value(quaternion.get_forth()).get_value() return elif instr_type == Quaternion.READ: input_content = raw_input() req_type = cls.symbol_table.get_symbol_type(cls.get_identify(quaternion.get_forth())) if req_type in [SymbolItem.INT, SymbolItem.ARRAY_INT]: value = cls.parse_input(input_content) if value.get_type() == SymbolItem.INT: cls.set_value(quaternion.get_forth(), value) else: raise ErrorInterpret("输入类型不匹配") elif req_type in [SymbolItem.DOUBLE, SymbolItem.ARRAY_DOU]: value = cls.parse_input(input_content) cls.set_value(quaternion.get_forth(), value) elif instr_type == Quaternion.WRITE: index = -1 forth = quaternion.get_forth() if type(forth) == int: cls.result.append(forth) else: if cls.is_array(forth): index = cls.get_array_index(quaternion.get_forth()) cls.result.append(cls.symbol_table.get_symbol_value(quaternion.get_forth(), index).get_value()) elif instr_type == Quaternion.IN: cls.scope_level += 1 elif instr_type == Quaternion.OUT: cls.symbol_table.pop(cls.scope_level) cls.scope_level -= 1 elif instr_type == Quaternion.INT: if quaternion.get_third() is not None: symbol = SymbolItem(quaternion.get_forth(), SymbolItem.ARRAY_INT, s_level=cls.scope_level) symbol.get_value().set_value(quaternion.get_third()) # maybe not work cls.symbol_table.insert(symbol) else: int_value = 0 if quaternion.get_second() is not None: int_value = Value(SymbolItem.INT, int(quaternion.get_second())) symbol = SymbolItem(quaternion.get_forth(), SymbolItem.INT, int_value, cls.scope_level) cls.symbol_table.insert(symbol) elif instr_type == Quaternion.DOUBLE: if quaternion.get_third() is not None: symbol = SymbolItem(quaternion.get_forth(), SymbolItem.ARRAY_DOU, s_level=cls.scope_level) symbol.get_value().set_value(quaternion.get_third()) # maybe not work cls.symbol_table.insert(symbol) else: int_value = 0 if quaternion.get_second() is not None: int_value = Value(SymbolItem.INT, quaternion.get_second()) symbol = SymbolItem(quaternion.get_forth(), SymbolItem.DOUBLE, int_value, cls.scope_level) cls.symbol_table.insert(symbol) elif instr_type == Quaternion.ASSIGN: value = cls.get_value(quaternion.get_second()) cls.set_value(quaternion.get_forth(), value) elif instr_type == Quaternion.PLUS: cls.set_value(quaternion.get_forth(), cls.get_value(quaternion.get_second()).plus(cls.get_value(quaternion.get_third()))) elif instr_type == Quaternion.MINUS: if quaternion.get_third() is not None: cls.set_value(quaternion.get_forth(), cls.get_value(quaternion.get_second()).minus(cls.get_value(quaternion.get_third()))) else: cls.set_value(quaternion.get_forth(), Value.negative(cls.get_value(quaternion.get_second()))) elif instr_type == Quaternion.MUL: cls.set_value(quaternion.get_forth(), cls.get_value(quaternion.get_second()).multiple(cls.get_value(quaternion.get_third()))) elif instr_type == Quaternion.DIV: cls.set_value(quaternion.get_forth(), cls.get_value(quaternion.get_second()).division(cls.get_value(quaternion.get_third()))) elif instr_type == Quaternion.GT: cls.set_value(quaternion.get_forth(), cls.get_value(quaternion.get_second()).greater(cls.get_value(quaternion.get_third()))) elif instr_type == Quaternion.GET: cls.set_value(quaternion.get_forth(), cls.get_value(quaternion.get_second()).greater_equal(cls.get_value(quaternion.get_third()))) elif instr_type == Quaternion.LT: cls.set_value(quaternion.get_forth(), cls.get_value(quaternion.get_second()).less(cls.get_value(quaternion.get_third()))) elif instr_type == Quaternion.LET: cls.set_value(quaternion.get_forth(), cls.get_value(quaternion.get_second()).less_equal(cls.get_value(quaternion.get_third()))) elif instr_type == Quaternion.EQ: cls.set_value(quaternion.get_forth(), cls.get_value(quaternion.get_second()).equal(cls.get_value(quaternion.get_third()))) elif instr_type == Quaternion.NEQ: cls.set_value(quaternion.get_forth(), cls.get_value(quaternion.get_second()).not_equal(cls.get_value(quaternion.get_third()))) cls.pc += 1 except ErrorInterpret as e: print(e.content)