日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Python實現LR1文法的完整實例代碼

瀏覽:29日期:2022-07-07 10:56:11

一、使用步驟

1.引入庫(安裝Python環境、PyQt、PyQt-tools)

from PyQt5 import QtCore, QtGui, QtWidgetsimport sysimport datetimefrom PyQt5.QtGui import QStandardItemModel, QStandardItemfrom PyQt5.QtWidgets import QHeaderViewfrom collections import defaultdictimport numpy as np

2.全局變量

#text = 'E -> E + T nE -> TnT -> T * FnT -> FnF ->(E)nF -> i'#text = 'S -> BBnB -> aBnB -> 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, QtWidgetsimport sysimport datetimefrom PyQt5.QtGui import QStandardItemModel, QStandardItemfrom PyQt5.QtWidgets import QHeaderViewfrom collections import defaultdictimport numpy as np#text = 'E -> E + T nE -> TnT -> T * FnT -> FnF ->(E)nF -> i'#text = 'S -> BBnB -> aBnB -> 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 Falsedef SplitText(text): # 把文法中E->A|B 切分為E->A和E->B mytext = '' for i in text: if(i != ’ ’):#刪除字符串的空格 mytext += i; i = mytext.split(’n’) 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其實是指一個listtime += 1 else: for vi in Firstlist:Zlist.append(vi) if(time == len(j)): Zlist.append(’ε’) return Zlistdef 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: returndef 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 nE -> TnT -> T * FnT -> FnF ->(E)nF -> i') #初始化,編譯原理測試數據 #self.textEdit.setText('S -> BBnB -> aBnB -> 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('tttLR(1)項 目 集 族n') j = 0 for i in endstate: self.textBrowser_3.append(’I’+str(j)+’: ’+str(i)+’n’) 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.運行結果截圖

Python實現LR1文法的完整實例代碼Python實現LR1文法的完整實例代碼

5.學會自己看注釋

6.用數據代碼,為我愛的世界添磚加瓦

到此這篇關于Python實現LR1文法的文章就介紹到這了,更多相關Python實現LR1文法內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
成人台湾亚洲精品一区二区| 久久久久久久欧美精品| 91大神在线观看线路一区| 日本va欧美va欧美va精品| 欧美日韩xxxx| 精品91福利视频| 亚洲va中文在线播放免费| 国产在线成人| 欧美精品一卡| 天堂久久av| 精品视频在线一区二区在线| 国产成年精品| 欧美日韩视频一区二区三区| 日韩中文字幕1| 国产日韩欧美一区二区三区| 粉嫩av一区二区三区四区五区| 久久男女视频| 三级一区在线视频先锋| 国产免费av一区二区三区| 中文字幕人成乱码在线观看 | 日本不良网站在线观看| aa国产精品| 国产黄色一区| 欧美日韩国产免费观看| 日韩av一二三| 久久精品卡一| 日本h片久久| 日韩成人三级| 日本精品国产| 久久精品国语| 国产欧美欧美| 香蕉久久夜色精品国产| 国产精久久一区二区| av亚洲在线观看| 国产欧美91| 先锋影音国产一区| 美女一区网站| 欧美日韩18| 激情五月色综合国产精品| 国产精品毛片视频| 欧美a级片一区| 久久精品国产网站| 蜜桃久久久久久| 久久三级视频| 精品国产亚洲一区二区在线观看| 国产精品丝袜xxxxxxx| 精品久久久久中文字幕小说| 蜜桃久久久久久| 久久激情网站| 国模精品一区| 日本少妇精品亚洲第一区| 成人精品亚洲| 久久精品一本| 97久久超碰| 国产亚洲欧洲| 在线中文字幕播放| 麻豆精品蜜桃视频网站| 综合欧美亚洲| av成人国产| 久久青草久久| 国产99在线| 美女视频黄 久久| 亚洲乱亚洲高清| 国产精品av久久久久久麻豆网| 黄色网一区二区| 欧美a在线观看| 欧美精品福利| 亚洲精品无播放器在线播放| 国产精品视区| 99国产精品99久久久久久粉嫩| 国内在线观看一区二区三区| 日本a级不卡| 亚洲啊v在线免费视频| 黄色精品网站| 91精品1区| 亚洲经典在线| 一区视频在线| 国产亚洲一级| 欧美综合二区| 久久亚洲电影| 一区二区三区国产在线| 久久成人一区| 免费看欧美美女黄的网站| 尹人成人综合网| 精品在线99| 国产精品99免费看| 亚洲国产综合在线看不卡| 蜜桃伊人久久| 亚洲精品极品| 日韩国产成人精品| 日韩av网站免费在线| 亚洲不卡视频| 久久国产乱子精品免费女| 日韩国产欧美三级| 国产伦理一区| 久久三级中文| 婷婷综合六月| 欧美日韩国产免费观看| 欧美中文日韩| 欧美在线日韩| 国产精品久久777777毛茸茸| 欧美国产亚洲精品| 91日韩欧美| 亚洲91视频| 日韩中文字幕区一区有砖一区 | 在线天堂中文资源最新版| 日韩在线综合| 好看的亚洲午夜视频在线| 国产精品美女久久久| 蜜桃av一区二区| 久久精品72免费观看| 国产精品毛片视频| 91视频一区| 午夜欧美在线| 亚洲精品第一| 久久精品国产99国产精品| 日韩一区自拍| 三级亚洲高清视频| 欧美一区激情| 四虎8848精品成人免费网站| 亚洲v在线看| 中文字幕成人| 麻豆精品视频在线| 99国产精品免费视频观看| 男女精品网站| 国产精品亚洲成在人线| 久久精品国产99国产| 久久精品卡一| 日韩欧美久久| 国产精品久久久久久久久久10秀 | 噜噜噜躁狠狠躁狠狠精品视频| 亚洲aⅴ网站| 国产一区二区久久久久| 国产视频一区三区| 美女国产一区二区三区| 日韩免费福利视频| 男女激情视频一区| 精品国产黄a∨片高清在线| 午夜久久tv| 国产精品极品国产中出| 亚州av乱码久久精品蜜桃| 欧美日本一区| 精品一区欧美| 精品入口麻豆88视频| 国产精品老牛| 视频在线不卡免费观看| 亚洲精品欧美| 久久五月天小说| 国产精品天天看天天狠| 亚洲特色特黄| 欧美日韩一区二区三区四区在线观看| 日本少妇一区| 国产精品亚洲欧美一级在线 | 在线国产精品一区| 欧美久久天堂| 国产探花一区| 黄色成人精品网站| 牛牛精品成人免费视频| 男人操女人的视频在线观看欧美| 国产在线日韩精品| 亚洲ab电影| 蜜臀久久99精品久久一区二区| 国产女人18毛片水真多18精品| 激情欧美丁香| 另类综合日韩欧美亚洲| 亚洲欧美网站在线观看| 久久九九精品| 久久久久久亚洲精品美女| 久久福利影视| 成人自拍av| 国产在线日韩精品| 欧美亚洲人成在线| 免费观看久久久4p| 不卡在线一区| 日韩免费av| 国产中文字幕一区二区三区| 欧美久久一区二区三区| 亚洲尤物av| 欧美日韩精品免费观看视频完整| 国产96在线亚洲| 国产精品久久久久久妇女| 四虎成人精品一区二区免费网站| 国内精品福利| 深夜视频一区二区| 国产成人精品免费视| 久久国产精品美女| 日韩毛片一区| 亚洲精品麻豆| 伊人国产精品| 噜噜噜久久亚洲精品国产品小说| 亚洲先锋成人| 久久久久99| 日韩在线二区| 欧美片第1页| 国内精品伊人| 国产不卡一区| 中文在线资源| 日本高清不卡一区二区三区视频| 四虎成人av| 日韩久久视频|