資源簡(jiǎn)介
詞法分析器,鑒于網(wǎng)上基本上是java或者c++寫(xiě)的LR_0分析器,我將自己寫(xiě)的python版發(fā)布,供大家參考學(xué)習(xí)。里面也有我的實(shí)驗(yàn)包告,幫助快速熟悉程序功能

代碼片段和文件信息
from?tkinter?import*
from?re?import?*
import?copy
from?tkinter.scrolledtext?import?ScrolledText
root?=?Tk()
root.title(‘LR(0)分析程序‘)
frame_entry?=?frame(root)
label?=?Label(frame_entrytext=“輸入:“)
label.grid(row=0column=0padx=10)
entry?=?Entry(frame_entrywidth=40)
entry.grid(row=0column=1)
textvar?=?StringVar()
frame_entry.grid(row=0column=0padx=10pady=5sticky=W)
V_N?=?list()
V_T?=?list()
p_temp?=?list()
p?=?list()
#?保存狀態(tài)集
res=[]
#?擴(kuò)展產(chǎn)生式
pz=[]
point=‘.‘
#?action表goto?表
action_tb?=?[]
goto_tb?=?[]
#?print(V_TV_N)
def?init_p():
????num?=?1
????for?s?in?globals()[‘p_temp‘]:
????????temp?=?[]
????????temp[0:]=[nums]
????????num+=1
????????p.append(temp)
#?0為接受項(xiàng)目,1為歸約項(xiàng)目,2為移進(jìn)項(xiàng)目,3為待約項(xiàng)目
def?init_Z():
????num?=?1
????for?i?in?p:
????????s=i[1]
????????length?=?len(s)
????????for?j?in?range(3length+1):
????????????tem?=?list(s)
????????????if?j?????????????elif?j?????????????elif?j?==?length?and?s[j-1]==V_N[1]:flag=0
????????????else:flag?=?1
????????????if?flag!=1:tem[j:j]?=?globals()[‘point‘]
????????????else:tem[j:]=globals()[‘point‘]
????????????pz.append([num‘‘.join(tem)flag])
????????????num+=1
#?s是擴(kuò)廣文法的產(chǎn)生式
#?如果現(xiàn)在新建的狀態(tài)是不完整的,怎么去判斷是否會(huì)被重復(fù)
def?coluser(num?s):
????state?=?list()
????dic?=?dict()
????state.append(num)
????temp?=?list()
????temp.append(s)
????while?True:
????????count?=?len(temp)
????????#?print(‘temp‘temp)
????????for?tem_pz?in?temp:
????????????ind?=?tem_pz[1].index(‘.‘)
????????????if?tem_pz[2]?==?3:
????????????????for?j?in?pz:
????????????????????if?j[1][0]?==?tem_pz[1][ind?+?1]?and?j?not?in?temp?and?j[1].index(‘.‘)?==?3:
????????????????????????temp.append(j)
????????if?count?==?len(temp):break
????state.append(temp)
????state.append(dic)
????if?test_coluser(state)?==?1:
????????res.append(state)
????????return?state[0]
????else:
????????#?返回完全包含的狀態(tài)編號(hào)
????????return?test_coluser(state)[0]
#?任何一個(gè)不與其余的相等
def?test_coluser(s):
????s_len?=?len(s[1])
????for?state?in?res:
????????sta_len?=?len(state[1])
????????#?flag?==?0?表示相等
????????flag?=?0
????????#?計(jì)算相等的數(shù)目
????????num?=?0
????????for?i?in?range(0s_len):
????????????for?j?in?range(0sta_len):
????????????????#?print(‘s‘s[1][i]state[1][j])
????????????????if?s[1][i]?==?state[1][j]:
????????????????????num?+=?1
????????????????????break
????????????#?????flag?==?1表示不一樣
????????#?注意for語(yǔ)句塊,break是跳出哪個(gè)語(yǔ)句塊
????????if?num?!=?s_len:
????????????flag?=?1
????????#?????????return?-1?存在
????????if?flag?==?0?and?s_len?==?sta_len:return?state
????return?1
#?狀態(tài),字符,產(chǎn)生式
def?add_coluser(stacharpro):
????#?sta是找到的要轉(zhuǎn)換過(guò)去的狀態(tài),要去補(bǔ)充它
????state?=?copy.deepcopy(sta)
????temp?=?list()
????if?pro?not?in?sta[1]:
????????temp.append(pro)
????#?數(shù)量不增多就是已經(jīng)加完了
????????while?True:
????????????count?=?len(temp)
????????????for?tem_pz?in?temp:
????????????????ind?=?tem_pz[1].index(‘.‘)
????????????????if?tem_pz
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件??????12453??2019-04-29?22:25??語(yǔ)法分析器的設(shè)計(jì)\Gui_Lr.py
?????文件??????95986??2019-05-03?08:30??語(yǔ)法分析器的設(shè)計(jì)\實(shí)驗(yàn)報(bào)告(教程).docx
?????目錄??????????0??2019-05-03?08:30??語(yǔ)法分析器的設(shè)計(jì)
-----------?---------??----------?-----??----
???????????????108439????????????????????3
評(píng)論
共有 條評(píng)論