my_table={"begin":1,"if":2,"then":3,"while":4,"do":5,
"end":6,"+":13,"-":14,"*":15,"/":16,":":17,
":=":18,"<":20,"<>":21,"<=":22,">":23,">=":24,
"=":25,";":26,"(":27,")":28,"#":0}
def scanner(syn_List,init_state): #this function is ok
global my_table
key_list=list(my_table.keys())
i=0
while i < len(init_state):
flag=1
while init_state[i].isspace():
i+=1
if init_state[i].isalpha():#标识符逻辑
token=""
while i<len(init_state) and init_state[i].isalnum():
token+=init_state[i]
i+=1
if token not in key_list:
syn_List.append(10)
print("(10,"+token+")")
else:
print("("+str(my_table[token])+","+token+")")
syn_List.append(my_table[token])
flag=0
continue
if init_state[i].isdigit():#数值逻辑
token=""
while i<len(init_state) and init_state[i].isdigit():
token+=init_state[i]
i+=1
flag=0
continue
syn_List.append(11)
print("(11,"+token+")")
if init_state[i] in key_list:#特殊符号逻辑
if i+1<len(init_state) and (init_state[i]+init_state[i+1]) in key_list :
print("("+str(my_table[init_state[i]+init_state[i+1]])+","+init_state[i]+init_state[i+1]+")")
syn_List.append(my_table[init_state[i]+init_state[i+1]])
i+=2
else:
syn_List.append(my_table[init_state[i]])
print("("+str(my_table[init_state[i]])+","+init_state[i]+")")
i+=1
flag=0
continue
if flag:
print("can not parse")
#grammar anly
def lrparser(syn_List,i,kk): #0 means 'begin',i begin from 0
if i[0]<len(syn_List) and syn_List[i[0]]==1:
i[0]+=1
yucn(syn_List,i,kk)
if syn_List[i[0]]==6: # 6 means 'end'
i[0]+=1
if i[0]<len(syn_List) and syn_List[i[0]]==0 and kk[0]==0:
print("success")
elif kk[0]!=1 :
print("lack of end")
kk[0]=1
else:
print("begin error")
kk[0]=1
return
def yucn(syn_List,i,kk):
#print("in yucn "+str(i[0]))
statement(syn_List,i,kk)
if i[0]>=len(syn_List):
return
while(syn_List[i[0]]==26):
i[0]+=1
statement(syn_List,i,kk)
return
def statement(syn_List,i,kk):
#print("in statement "+str(i))
if i[0]<len(syn_List) and syn_List[i[0]]==10:
i[0]+=1
if i[0]<len(syn_List) and syn_List[i[0]]==18:
i[0]+=1
expression(syn_List,i,kk)
else:
print("assign operator error")
kk[0]=1
else:
print("statement error")
kk[0]=1
return
def expression(syn_List,i,kk):
#print("in expression "+str(i))
term(syn_List,i,kk)
if i[0]>=len(syn_List):
return
while syn_List[i[0]]==13 or syn_List[i[0]]==14:
i[0]+=1
term(syn_List,i,kk)
return
def term(syn_List,i,kk):
#print("in term "+str(i))
factor(syn_List,i,kk)
if i[0]>=len(syn_List):
return
while syn_List[i[0]]==15 or syn_List[i[0]]==16:
i[0]+=1
factor(syn_List,i,kk)
return
def factor(syn_List,i,kk):
#print("in factor "+str(i))
if i[0]>=len(syn_List):
print("syntax error")
if syn_List[i[0]]==10 or syn_List[i[0]]==11:
i[0]+=1
elif i[0]<len(syn_List) and syn_List[i[0]]==27:
i[0]+=1
expression(syn_List,i,kk)
if i[0]<len(syn_List) and syn_List[i[0]]==28:
i[0]+=1
else:
print(" ')' error ")
kk[0]=1
else:
print("output expression error")
kk[0]=1
return
def block():
syn_List=[]
i=[0]
kk=[0]
init_state=input("input a string\n")
scanner(syn_List,init_state)
'''for each in syn_List:
print(each)'''
lrparser(syn_List,i,kk)
return
#begin point
block()
语法分析程序
最新推荐文章于 2021-05-18 18:06:52 发布