Пример #1
0
class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.file_name = ''
        self.file_flag = False
        self.sic = None
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.input_file_name.clicked.connect(self.set_file_name)
        self.ui.op_table.clicked.connect(self.op_table)
        self.ui.symbol_table.clicked.connect(self.symbol_table)
        self.ui.object_code.clicked.connect(self.object_code)
        self.ui.object_program_format.clicked.connect(
            self.object_program_format)
        self.ui.language.activated[str].connect(self.change_language)

    def create_sic(self):
        clear_global_variable()
        self.sic = sic.SIC(self.file_name)

    def set_message(self, index):
        if self.ui.language.currentText() == self.ui.languages[0]:
            self.ui.textBrowser.insertPlainText(self.ui.english[index - 1] +
                                                '\n')
        elif self.ui.language.currentText() == self.ui.languages[1]:
            self.ui.textBrowser.insertPlainText(
                self.ui.traditional_chinese[index - 1] + '\n')
        else:
            self.ui.textBrowser.insertPlainText(self.ui.japanese[index - 1] +
                                                '\n')

    def change_language(self):
        self.ui.change_language()
        if not self.file_name == '' and self.ui.push_button == 1:
            self.ui.textBrowser.clear()
            if self.file_flag is True:
                self.set_message(3)
                self.set_message(4)
            else:
                self.set_message(2)
        elif self.file_name == '':
            self.ui.textBrowser.clear()
            if self.ui.push_button == 1:
                self.set_message(1)
            elif self.ui.push_button > 1:
                self.set_message(5)

    def set_file_name(self):
        self.ui.push_button = 1
        file_name = self.ui.textEdit.toPlainText()
        if file_name.find('.txt') == -1:
            file_name += '.txt'

        d_list = os.listdir()
        self.ui.textBrowser.clear()

        if file_name not in d_list:
            self.set_message(1)
            self.file_name = ''
        elif file_name == self.file_name:
            self.file_flag = False
            self.set_message(2)
        else:
            self.ui.textBrowser.clear()
            self.file_name = file_name
            self.file_flag = True
            self.set_message(3)
            self.create_sic()
            self.set_message(4)
            self.sic.start()

    def op_table(self):
        self.ui.push_button = 2
        self.ui.textBrowser.clear()
        if self.file_name == '':
            self.set_message(5)
            pass
        else:
            op_table = sic.OPTABLE.items()
            count = 0
            for each in op_table:
                count += 1
                self.ui.textBrowser.insertPlainText(
                    '{:<20}'.format(str(each)) + '\t')
                if count % 5 == 0:
                    self.ui.textBrowser.insertPlainText('\n')

    def symbol_table(self):
        self.ui.push_button = 3
        self.ui.textBrowser.clear()
        if self.file_name == '':
            self.set_message(5)
            pass
        else:
            count = 0
            for each in sic.Symbol:
                count += 1
                self.ui.textBrowser.insertPlainText(each + '\t')
                if count % 3 == 0:
                    self.ui.textBrowser.insertPlainText('\n')

    def object_code(self):
        self.ui.push_button = 4
        self.ui.textBrowser.clear()
        if self.file_name == '':
            self.set_message(5)
            pass
        else:
            line_count = 1
            self.ui.textBrowser.insertPlainText(
                'Line\t Loc\t\t\tSource statement\t\t\tObject code\n')
            for i in range(len(self.sic.instruction)):
                temp = self.sic.instruction[i]
                if temp.machineCode == 'error':
                    self.ui.textBrowser.insertPlainText(
                        '\t\tInstruction is error, so can not get the result\n'
                    )
                else:
                    line = '{:>4}'.format(str(line_count)) + '\t'
                    if temp.order == 'END':
                        line += '\t'
                    else:
                        line += temp.leftAddress + '\t'
                    line += '{:<18}'.format(temp.symbol) + '\t'
                    line += temp.order + '\t\t'
                    line += '{:<18}'.format(temp.label) + '\t    '
                    line += temp.machineCode + '\n'
                    self.ui.textBrowser.insertPlainText(line)
                    line_count += 1

    def object_program_format(self):
        self.ui.push_button = 5
        self.ui.textBrowser.clear()
        if self.file_name == '':
            self.set_message(5)
            pass
        else:
            left = '00'
            temp = self.sic
            instruction_len = len(temp.instruction)
            header = 'H^' + temp.instruction[
                0].symbol + '^' + left + temp.instruction[0].leftAddress + '^'
            txt_begin = function.hex_to_dec(temp.instruction[0].leftAddress)
            txt_end = function.hex_to_dec(temp.instruction[instruction_len -
                                                           1].leftAddress)
            header += left + function.dec_to_hex(txt_end - txt_begin)
            self.ui.textBrowser.insertPlainText(header + '\n')
            size = 0
            begin_index = 1
            lines = []
            b = []
            sizes = []
            line = ''
            b.append(begin_index)
            while True:
                if begin_index == instruction_len - 1:
                    lines.append(line)
                    sizes.append(size)
                    b.append(begin_index)
                    break
                elif size + (len(sic.MC[begin_index]) / 2) > 30:
                    lines.append(line)
                    sizes.append(size)
                    b.append(begin_index)
                    line = ''
                    size = 0
                elif sic.MC[begin_index] == '':
                    lines.append(line)
                    sizes.append(size)
                    b.append(begin_index + 1)
                    line = ''
                    size = 0
                if sic.MC[begin_index] == 'error':
                    pass
                elif sic.MC[begin_index] == '':
                    pass
                else:
                    line += '^' + function.fill_zeros(sic.MC[begin_index])
                    size += (len(sic.MC[begin_index]) / 2)
                begin_index += 1

            for i in range(len(lines)):
                line = ''
                if lines[i] == '':
                    pass
                else:
                    line += 'T^' + left + temp.instruction[
                        b[i]].leftAddress + '^'
                    if sizes[i] < 16:
                        line += '0'
                    line += function.dec_to_hex(int(
                        sizes[i])) + lines[i] + '\n'
                    self.ui.textBrowser.insertPlainText(line)
            self.ui.textBrowser.insertPlainText(
                'E^00' + temp.instruction[0].leftAddress)