def _next_Instruction(instructions, tables, state): # Read instruction at program counter instruction = instructions[state.pc] if isinstance(instruction, I.ID): state = execute_ID(state) elif isinstance(instruction, I.DRP): state = execute_DRP(state, instruction.reason) elif isinstance(instruction, I.CTR): state = execute_CTR(state, instruction.reason) elif isinstance(instruction, I.ADD): state = execute_ADD(state, instruction.field, instruction.size) elif isinstance(instruction, I.RMV): state = execute_RMV(state, instruction.field) elif isinstance(instruction, I.LD): state = execute_LD(state, instruction.destination, instruction.source) elif isinstance(instruction, I.ST): state = execute_ST(state, instruction.location, instruction.source) elif isinstance(instruction, I.OP): state = execute_OP(state, instruction.destination, instruction.left_source, instruction.operator, instruction.right_source) elif isinstance(instruction, I.PUSH): state = execute_PUSH(state, instruction.location) elif isinstance(instruction, I.POP): state = execute_POP(state, instruction.location) elif isinstance(instruction, I.BR): state = execute_BR(state, instruction.left_source, instruction.operator, instruction.right_source, instruction.label) elif isinstance(instruction, I.JMP): state = execute_JMP(state, instruction.label) elif isinstance(instruction, I.LBL): state = execute_LBL(state) elif isinstance(instruction, I.LDt): state = execute_LDt(state, tables, instruction.destinations, instruction.table_id, instruction.index) elif isinstance(instruction, I.STt): state = execute_STt(state, tables, instruction.table_id, instruction.index, instruction.sources) elif isinstance(instruction, I.INCt): state = execute_INCt(state, tables, instruction.table_id, instruction.index) elif isinstance(instruction, I.LKt): state = execute_LKt(state, tables, instruction.index, instruction.table_id, instruction.sources) elif isinstance(instruction, I.CRC): state = execute_CRC(state, instruction.destination, instruction.sources) elif isinstance(instruction, I.HSH): state = execute_HSH(state, instruction.destination, instruction.sources) elif isinstance(instruction, I.CNC): state = _execute_CNC(state, tables, instruction.codes) elif isinstance(instruction, I.ATM): state = _execute_ATM(state, tables, instruction.code) elif isinstance(instruction, I.SEQ): state = _execute_SEQ(state, tables, instruction.code) else: raise RuntimeError() if state.label == syntax.Label(''): state.pc += 1 else: state.pc, _ = get_label(instructions, state.label) return state
def type_check_Instruction(instructions, tables, context): # Read instruction at program counter instruction = instructions[context.pc] # Check if HLT instruction if isinstance(instruction, I.HLT): type_check_HLT(context) else: next_Instruction(instructions, tables, context) if len(context.labels) == 1: if context.labels[0] == syntax.Label(''): context.pc += 1 else: context.pc, _ = get_label(instructions, context.labels[0]) type_check_Instruction(instructions, tables, context) elif len(context.labels) == 2: if context.labels[0] != '': pass else: raise TypeError("taken-branch label (%s) can't be empty." % (context.labels[0])) if context.labels[1] == '': pass else: raise TypeError("not-taken-branch label (%s) must be empty." % (context.labels[1])) # type check taken-branch contextT = deepcopy(context) contextT.pc, _ = get_label(instructions, context.labels[0]) type_check_Instruction(instructions, tables, contextT) # type check not-taken-branch context.pc += 1 type_check_Instruction(instructions, tables, context) else: raise TypeError("invalid labels (%s) count." % context.labels)