Python LR1 문법 구현 인 스 턴 스 코드

16714 단어 pythonlr1문법
1.사용 절차
 1.라 이브 러 리 도입(Python 환경,PyQt,PyQt-tools 설치)

from PyQt5 import QtCore, QtGui, QtWidgets
import sys
import datetime
from PyQt5.QtGui import QStandardItemModel, QStandardItem
from PyQt5.QtWidgets import QHeaderView
from collections import defaultdict
import numpy as np
2.전역 변수

#text = "E -> E + T 
E -> T
T -> T * F
T -> F
F ->(E)
F -> i" #text = "S -> BB
B -> aB
B -> b" my_dict = defaultdict(list)# my_dicts = defaultdict(list)# , VNT = [] VT = set([]) MAX = 50 # Inum = 0 # end = [] # , , , [ ] numset = []# , endstate = [] # [ ] guiyue = [] #
3.전체 코드

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'LR1.ui'
#
# Created by: PyQt5 UI code generator 5.15.1
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets
import sys
import datetime
from PyQt5.QtGui import QStandardItemModel, QStandardItem
from PyQt5.QtWidgets import QHeaderView
from collections import defaultdict
import numpy as np
#text = "E -> E + T 
E -> T
T -> T * F
T -> F
F ->(E)
F -> i" #text = "S -> BB
B -> aB
B -> b" my_dict = defaultdict(list)# my_dicts = defaultdict(list)# , VNT = [] VT = set([]) MAX = 50 # Inum = 0 # end = [] # , , , [ ] numset = []# , endstate = [] # [ ] guiyue = [] # def isTerminal(c): # c A-Z ( self ) if c < 'A' or c > 'Z': return True else: return False def SplitText(text): # E->A|B E->A E->B mytext = "" for i in text: if(i != ' '):# mytext += i; i = mytext.split('
') guiyue.append(text[0]+"'->"+text[0]) for j in i: if(VNT.count(j[0])==0):# VNT.append(j[0]) for k in range(1,len(j)): if(j[k]=='-' and j[k+1]=='>'): k = k+2 break guiyue.append(j) my_dict[j[0]].append(j[k:]) def getFirst(mylist):# Frist Zlist = [] for i in mylist: if(i not in VNT): Zlist.append(i) return Zlist else: for j in my_dict[i]: # #print(j) if(j[0] == i): continue time = 0 for ch in j: if(ch not in VNT): Zlist.append(ch) break else: Firstlist = getFirst(ch)# Frist if 'ε' in Firstlist: # Firstlist list time += 1 else: for vi in Firstlist: Zlist.append(vi) if(time == len(j)): Zlist.append('ε') return Zlist def getSymbol(mystr):# Frist for i in range(0,len(mystr)): if(mystr[i] =='.'): mylist = list(mystr[i+2:]) break Zlist = ['#'] if(mylist[0]==','): mylist = mylist[1:] if(mylist[0]=='#'): VT.add('#') return Zlist a = getFirst(mylist) VT.update(set(a)) return a # #print(getSymbol('E->.E+T,#'))# def CLOSURE(mystr,num): # my_dicts[num].append(mystr) # zhanwang = getSymbol(mystr)# for i in range(0,len(mystr)): if(mystr[i] =='.'): ch = mystr[i+1] if(ch in VNT): for j in range(0,len(my_dict[ch])): ch2 = my_dict[ch][j] for k in range(0,len(zhanwang)): mystr = ch+"->."+ch2+","+zhanwang[k] if(my_dicts[num].count(mystr)==0): my_dicts[num].append(mystr) if(ch2[0] in VNT): for ss in my_dict[ch2[0]]: zhanwangs = getSymbol(mystr) for kk in range(0,len(zhanwangs)): mystr2 = ch2[0]+"->."+ss+","+zhanwangs[kk] if(my_dicts[num].count(mystr2)==0): CLOSURE(mystr2,num) else: return def deleteI(delnum): # for i in delnum: del my_dicts[i] def DFA(mynum): newstr = [] command = dict() global Inum for fs in my_dicts[mynum]: # for i in range(0,len(fs)): if(fs[i]=='.'): if(fs[i+1]==','): break else: if(newstr.count(fs[i+1])==0): newstr.append(fs[i+1]) Inum += 1 command[fs[i+1]] = Inum for fs in my_dicts[mynum]: for i in range(0,len(fs)): if(fs[i]=='.'): if(fs[i+1]==','): break else: mynums = command[fs[i+1]] s1 = list(fs) s1[i] = s1[i+1] s1[i+1]='.' sq = ''.join(s1) # CLOSURE(sq,mynums) # #print(command) delnum = [] for key,value in command.items(): for j in range(0,value): if(set(my_dicts[j]) == set(my_dicts[value])): command[key] = j # delnum.append(value) #print(delnum) deleteI(delnum) for key,value in command.items(): #print(mynum,'(',key,')->',value) end.append([mynum,key,value]) numset.append(mynum) numset.append(value) # , class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(994, 824) self.textBrowser = QtWidgets.QTextBrowser(Form) self.textBrowser.setGeometry(QtCore.QRect(520, 770, 461, 51)) self.textBrowser.setObjectName("textBrowser") self.textBrowser_2 = QtWidgets.QTextBrowser(Form) self.textBrowser_2.setGeometry(QtCore.QRect(25, 771, 421, 41)) self.textBrowser_2.setObjectName("textBrowser_2") self.label = QtWidgets.QLabel(Form) self.label.setGeometry(QtCore.QRect(460, 770, 51, 41)) self.label.setObjectName("label") self.tabWidget = QtWidgets.QTabWidget(Form) self.tabWidget.setGeometry(QtCore.QRect(20, 240, 941, 521)) self.tabWidget.setObjectName("tabWidget") self.First = QtWidgets.QWidget() self.First.setAccessibleName("") self.First.setObjectName("First") self.tableView = QtWidgets.QTableView(self.First) self.tableView.setGeometry(QtCore.QRect(10, 10, 911, 471)) self.tableView.setObjectName("tableView") self.tabWidget.addTab(self.First, "") self.Analyse = QtWidgets.QWidget() self.Analyse.setObjectName("Analyse") self.tableView_2 = QtWidgets.QTableView(self.Analyse) self.tableView_2.setGeometry(QtCore.QRect(10, 10, 911, 471)) self.tableView_2.setObjectName("tableView_2") self.tabWidget.addTab(self.Analyse, "") self.Process = QtWidgets.QWidget() self.Process.setObjectName("Process") self.tableView_3 = QtWidgets.QTableView(self.Process) self.tableView_3.setGeometry(QtCore.QRect(10, 10, 911, 471)) self.tableView_3.setObjectName("tableView_3") self.tabWidget.addTab(self.Process, "") self.States = QtWidgets.QWidget() self.States.setObjectName("States") self.textBrowser_3 = QtWidgets.QTextBrowser(self.States) self.textBrowser_3.setGeometry(QtCore.QRect(10, 10, 911, 471)) self.textBrowser_3.setObjectName("textBrowser_3") self.tabWidget.addTab(self.States, "") self.label_2 = QtWidgets.QLabel(Form) self.label_2.setGeometry(QtCore.QRect(40, 10, 51, 41)) self.label_2.setObjectName("label_2") self.textEdit = QtWidgets.QTextEdit(Form) self.textEdit.setGeometry(QtCore.QRect(33, 46, 441, 181)) self.textEdit.setObjectName("textEdit") self.textEdit.setText("E -> E + T
E -> T
T -> T * F
T -> F
F ->(E)
F -> i") # , #self.textEdit.setText("S -> BB
B -> aB
B -> b") self.lineEdit = QtWidgets.QLineEdit(Form) self.lineEdit.setGeometry(QtCore.QRect(640, 200, 271, 41)) self.lineEdit.setObjectName("lineEdit") self.lineEdit.setText("i*i+i#") # , self.label_3 = QtWidgets.QLabel(Form) self.label_3.setGeometry(QtCore.QRect(550, 200, 81, 41)) self.label_3.setObjectName("label_3") self.pushButton = QtWidgets.QPushButton(Form) self.pushButton.setGeometry(QtCore.QRect(650, 110, 251, 71)) self.pushButton.setObjectName("pushButton") self.pushButton.clicked.connect(self.Runs) # Runs() , self.retranslateUi(Form) self.tabWidget.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "LR(1) ")) self.label.setText(_translate("Form", " :")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.First), _translate("Form", "FIRST ")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.Analyse), _translate("Form", " ")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.Process), _translate("Form", " ")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.States), _translate("Form", " ")) self.label_2.setText(_translate("Form", " :")) self.label_3.setText(_translate("Form", " ")) self.pushButton.setText(_translate("Form", " ")) def Runs(self): global VNT,VT,numset,Inum,endstate,guiyue,my_dict,my_dicts,end# Inum = 0 # my_dict = defaultdict(list)# my_dicts = defaultdict(list)# , VNT = [] VT = set([]) end = [] # , , , numset = []# , [ ] endstate = [] # [ ] guiyue = [] # times = datetime.datetime.now() times_str = times.strftime(' %Y-%m-%d %H:%M:%S') self.textBrowser_2.setText(' :'+times_str) text = self.textEdit.toPlainText() SplitText(text)#1 input0 = text[0]+"'->."+text[0]+',#' # CLOSURE(input0,0) #2 I0 for i in range(0,MAX): DFA(i) numset = list(set(numset))#3 for i in end:#4 i[0] = numset.index(i[0]) i[2] = numset.index(i[2]) for i in range(0,len(my_dicts)): if my_dicts[i] != []: endstate.append(my_dicts[i])#5 # self.textBrowser_3.setText("\t\t\tLR(1)
") j = 0 for i in endstate: self.textBrowser_3.append('I'+str(j)+': '+str(i)+'
') j += 1 # Frist self.model = QStandardItemModel(len(VNT), 5) label_y = [] for s in VNT: label_y.append(s) self.model.setVerticalHeaderLabels(label_y) for row in range(len(VNT)): flist = [VNT[row]]#First Flist = list(set(getFirst(flist))) for column in range(len(Flist)): item = QStandardItem(Flist[column]) self.model.setItem(row, column, item) self.tableView.horizontalHeader().setStretchLastSection(True) self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) self.tableView.setModel(self.model) # , VT.discard('#') VT = list(VT) # # VT.append('#')# # ACTION label_x = [' ']+VT+VNT self.model2 = QStandardItemModel(len(endstate),len(VNT)+len(VT)) self.model2.setHorizontalHeaderLabels(label_x) label_y = [] for i in range(0,len(endstate)): label_y.append(str(i)) self.model2.setVerticalHeaderLabels(label_y) ACTION = [['0'] * len(VT) for i in range(len(endstate))] # , GOTO = [['0'] * len(VNT) for i in range(len(endstate))] for q in end: # if(q[1] not in VNT): ss = 's'+str(q[2]) ACTION[int(q[0])][VT.index(q[1])] = ss else: ss = str(q[2]) GOTO[int(q[0])][VNT.index(q[1])] = ss item = QStandardItem(ss) self.model2.setItem(int(q[0]),label_x.index(q[1]),item) endstr = text[0]+"'->"+text[0]+'.,#' # for i in range(len(endstate)):# for j in range(len(endstate[i])): for k in range(len(endstate[i][j])): if(endstate[i][j][k]=='.'): if(endstate[i][j][k+1]== ','): #print(guiyue) ii = guiyue.index(endstate[i][j][:k]) item = QStandardItem("r"+str(ii)) ACTION[i][VT.index(endstate[i][j][k+2])] = "r"+str(ii) self.model2.setItem(i,label_x.index(endstate[i][j][k+2]),item) if(endstate[i][0] == endstr): item = QStandardItem("acc")# self.model2.setItem(i,label_x.index('#'),item) self.tableView_2.horizontalHeader().setStretchLastSection(True) self.tableView_2.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) self.tableView_2.setModel(self.model2) self.model3 = QStandardItemModel(32,4) #print(ACTION) #print(GOTO) mystate = [0]# stack = '#' # inputstr = self.lineEdit.text()# label_x = [' ', ' ', ' ', ' '] self.model3.setHorizontalHeaderLabels(label_x) tabnum = 0 while(1): self.model3.setItem(tabnum,0,QStandardItem(str(mystate))) self.model3.setItem(tabnum,1,QStandardItem(stack)) self.model3.setItem(tabnum,2,QStandardItem(inputstr)) tabnum += 1 if(inputstr[0] not in VT): self.textBrowser.setText(' !') else: ch = ACTION[mystate[-1]][VT.index(inputstr[0])]# action if(ch =='r0'):# acc self.textBrowser.setText(' !') break if(ch == '0'): self.textBrowser.setText(' !') break if(ch[0] == 's'): mystate.append(int(ch[1:]))# stack += inputstr[0]# inputstr = inputstr[1:]# if(ch[0] == 'r'): gylist = guiyue[int(ch[1:])].split('->') g1 = str(gylist[1])[::-1] g0 = str(gylist[0])[::-1] gstack = stack[::-1]# gstack = gstack.replace(g1,g0,1) stack = gstack[::-1]# strlen = len(gylist[1]) # for i in range(strlen): mystate.pop()# mystate.append(int(GOTO [mystate[-1]] [VNT.index(gylist[0])] )) self.tableView_3.horizontalHeader().setStretchLastSection(True) self.tableView_3.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) self.tableView_3.setModel(self.model3) if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) Form = QtWidgets.QWidget() ui = Ui_Form() ui.setupUi(Form) Form.show() sys.exit(app.exec_())
4.실행 결과 캡 처
在这里插入图片描述
在这里插入图片描述
5.스스로 주석 을 읽 는 법 을 배 웁 니 다.
6.데이터 코드 로 내 가 사랑 하 는 세상 에 벽돌 과 기 와 를 더 해 준다.
파 이 썬 의 LR1 문법 실현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 파 이 썬 의 LR1 문법 실현 에 관 한 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기