Python LR1 문법 구현 인 스 턴 스 코드
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 문법 실현 에 관 한 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.