編譯原理第四次上機

2021-08-29 18:39:49 字數 3394 閱讀 8557

第四次上機—語法分析

目的:熟練掌握自上而下的語法分析方法,並能用程式實現。

要求:使用的文法如下:

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...