第四次上機—語法分析
目的:熟練掌握自上而下的語法分析方法,並能用程式實現。
要求:使用的文法如下:
e ->te 』
e 』 -> + te』 | ε
t -> ft 』
t』 -> * ft 』 | ε
f -> (e) | id
對於任意給定的輸入串(詞法記號流)進行語法分析,遞迴下降方法和非遞迴**分析方法可以任選其一來實現。
要有一定的錯誤處理功能。即對錯誤能提示,並且能在一定程度上忽略盡量少的記號來進行接下來的分析。可以參考書上介紹的同步記號集合來處理。
可能的出錯情況:ididid, id**id, (id+id, +id+id ……
輸入串以#結尾,輸出推導過程中使用到的產生式。例如:
輸入:id+idid#
輸出:e -> te 』
t-> ft 』
f -> id
e』 -> + te 』
t -> ft 』
……如果輸入串有錯誤,則在輸出中要體現是跳過輸入串的某些記號了,還是彈棧,彈出某個非終結符或者是終結符了,同時給出相應的出錯提示資訊。比如:
ididid對應的出錯資訊是:「輸入串跳過記號id,使用者多輸入了乙個id」;
id**id對應的出錯資訊是:「彈棧,彈出非終結符f,使用者少輸入了乙個id」
(id+id對應的出錯資訊是:「彈棧,彈出終結符 ) ,使用者少輸入了乙個右括號(或者說,括號不匹配)」
**寫的很亂:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
dict=
flag=0
def abc(s1):
if (len(st) == 1 and st[0] == "#"):
if(s1!="#"):
return "error3"
return "end"
if(len(st)==0):
return "end"
a=st[-1]
if(st[-1]=='d' and st[-2]=='i'):
a='id'
if(a==s1):
st.pop(-1)
return "one"
finding=a.__add__(s1)
b=dict.get(finding)
if(b is none):
return "error2"
if(b=='error'):
return 'error'
elif(b=='synch'):
return 'synch'
else:
print(b)
temp1=b.split('->')
return temp1[1]
#s=input("輸入內容,以#結束")
s="id+id)#"
print(s)
i=0st=
s1=s[i:i+1]
while(s1!="#" or st!='#'):
if(s1=='i' and s[i+1:i+2]=='d'):
s1=s[i:i+2]
i+=2
temp2 = abc(s1)
if (temp2 == "end"):
break;
while (st[len(st) - 2:len(st)] != 'id'):
if (temp2 == 'error'):
print("出錯,跳過",s1,'使用者多輸入了乙個id')
break
elif (temp2 == "error2"):
mn = st.pop(-1)
print('出錯,終結符',mn,'彈棧', '使用者少輸入了'.format(mn))
temp2 = abc(s1)
elif(temp2=="error3"):
print("出錯,書寫多了",s1)
flag=-1
break
elif(temp2=="one"):
break
elif (temp2 == 'synch'):
st.pop(-1)
st.pop(-1)
print('出錯,非終結符id彈棧,使用者少輸入了乙個id')
temp2 = abc(s1)
elif(temp2=='ε'):
st.pop(-1)
temp2=abc(s1)
elif (temp2 == s1):
st.pop(-1)
break
else:
st.pop(-1)
for x in range(len(temp2)):
temp2=abc(s1)
if (temp2 == s1):
st.pop(-1)
break
if (st[-1] == 'id'):
st.pop(-1)
else:
i+=1
temp2 = abc(s1)
if(temp2=="end"):
break
while (st[-1]!=s1):
if (temp2 == 'error'):
print("出錯,跳過", s1, '使用者多輸入了乙個',s1)
break
elif(temp2=="error2"):
mn = st.pop(-1)
print('出錯,終結符', mn, '彈棧', '使用者少輸入了'.format(mn))
temp2 = abc(s1)
elif (temp2 == "one"):
break
elif (temp2 == 'synch'):
mn=st.pop(-1)
print('出錯,非終結符',mn,'彈棧')
temp2=abc(s1)
elif (temp2 == 'ε'):
st.pop(-1)
temp2=abc(s1)
elif(temp2==s1):
st.pop(-1)
elif (temp2 == "error3"):
print("出錯,書寫多了", s1,"及其後面的內容")
flag=-1
break
else:
st.pop(-1)
for x in range(len(temp2)):
temp2 = abc(s1)
if(st[-1]==s1):
st.pop(-1)
if(flag!=-1):
s1 = s[i:i + 1]
else:
break
第四次上機
1.結果 constructor called copy constructor called constructor called constructor called constructor called constructor called copy constructor called co...
C 第四次上機
1 設有乙個描述座標點的cpoint類,其私有變數x和y代表乙個點的x,y座標值。編寫程式實現以下功能 利用建構函式傳遞引數,並設其預設引數值為60和75,利用成員函式display 輸出這一預設值 利用公有成員函式setpointq將座標值修改為 80,150 並利用成員函式輸出修改後的座標值 u...
第四次上機作業
檔名稱 工資稅收 作 者 唐啟智 完成日期 2016 年 4 月 7 日 版 本 號 v1.0 對任務及求解方法的描述部分 主要用switch語句 輸入描述 輸入工資獲得情況 問題描述 計算稅額和稅後所得 程式輸出 輸出稅額和稅後所得 問題分析 演算法設計 switch語句 include usin...