Exemple #1
0
    def click(self):
        gram = self.textEdit.toPlainText().split('\n')
        sentence = self.lineEdit.text()
        grammar=Grammar()
        grammar.insert_from_arr(gram)
        # grammar = Grammar()
        # grammar.insert_from_arr(gram)

        self.tableWidget.setColumnCount(len(grammar.terminals)+len(grammar.nonterminals))
        self.tableWidget.setHorizontalHeaderLabels(grammar.terminals+['$']+grammar.nonterminals)
        for i in range(len(grammar.terminals)+2+len(grammar.nonterminals)):
            self.tableWidget.setColumnWidth(i,65)
        self.tableWidget_2.setColumnCount(4)
        self.tableWidget_2.setHorizontalHeaderLabels(['栈', '符号', '所剩输入串', '动作'])

        C=grammar.items()
        action, goto = grammar.Constructing_an_SLR_parsing_table()
        print(action)
        print(goto)

        for i in range(len(C)):
            self.tableWidget.insertRow(self.tableWidget.rowCount())
            for j,item in enumerate(grammar.terminals):
                self.tableWidget.setItem(i,j,QTableWidgetItem(action[(i,item)]))
            self.tableWidget.setItem(i,len(grammar.terminals),QTableWidgetItem(action[(i,'$')]))

            for j,item in enumerate(grammar.nonterminals):
                self.tableWidget.setItem(i,len(grammar.terminals)+1+j,QTableWidgetItem(str(goto[(i,item)])))

        step = grammar.LR_parsing_program(action,goto,sentence)
        print(step)
        for i in range(len(step)):
            self.tableWidget_2.insertRow(self.tableWidget_2.rowCount())
            for i in range(self.tableWidget_2.rowCount()):
                for j in range(self.tableWidget_2.columnCount()):
                    self.tableWidget_2.setItem(i, j, QTableWidgetItem(step[i][j]))

        # # LR(0)自动机
        transitions = []

        for item in C:
            for symbol in grammar.terminals + grammar.nonterminals:
                if grammar.goto(item, symbol) != []:
                    transitions.append((adjust(item), adjust(
                        grammar.goto(item, symbol)), symbol))

        # for item in transitions:
        #     print(item)

        from graphviz import Digraph

        f = Digraph('finite_state_machine', filename='fsm.gv')
        f.attr(rankdir='LR', size='8,5')

        f.attr('node', shape='square')
        for transition in transitions:
            f.edge(transition[0], transition[1], label=transition[2])

        f.view()


        #把分析过程写入Excel文件中

        from pyexcelerate import Workbook

        data = step # data is a 2D array
        wb = Workbook()
        wb.new_sheet("step", data=data)
        wb.save("output.xlsx")