Exemple #1
0
 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
Exemple #2
0
 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)
Exemple #3
0
    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)
Exemple #4
0
 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)
Exemple #5
0
 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)