日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

软件体系结构的第二次实验(解释器风格与管道过滤器风格)

發布時間:2024/3/12 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 软件体系结构的第二次实验(解释器风格与管道过滤器风格) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、實驗目的

  1.熟悉體系結構的風格的概念

  2.理解和應用管道過濾器型的風格。

  3、理解解釋器的原理

  4、理解編譯器模型

二、實驗環境

  硬件:?

  軟件:Python或任何一種自己喜歡的語言

三、實驗內容

  1、實現“四則運算”的簡易翻譯器。

  結果要求:

    1)實現加減乘除四則運算,允許同時又多個操作數,如:2+3*5-6?結果是11

    2)被操作數為整數,整數可以有多位

    3)處理空格

    4)輸入錯誤顯示錯誤提示,并返回命令狀態“CALC”

?    

??    圖1 ? ?實驗結果示例

  加強練習:

    1、有能力的同學,可以嘗試實現賦值語句,例如x=2+3*5-6,返回x=11。(注意:要實現解釋器的功能,而不是只是顯示)

    2、嘗試實現自增和自減符號,例如x++?

    3、采用管道-過濾器(Pipes and Filters)風格實現解釋器

?

? ? ? ? ? ? ? ? ? ? ? ? 圖2 ?管道-過濾器風格

?

?

? ? ? ? ? ? ? ? ? ? ?圖 3 ?編譯器模型示意圖

  本實驗,實現的是詞法分析和語法分析兩個部分。

四、實驗步驟:

代碼部分:

#?-*-?coding:?UTF-8?-*- ?

# 初始變量:整形數字,加法,減法,乘法,除法,左括號,右括號,EOF

INTEGER,PLUS,MINUS,MUL,DIV,LPAREN,RPAREN,EOF=('INTEGER','PLUS','MINUS','MUL','DIV','LPAREN','RPAREN','EOF')

# Token類,存放運算的各個單元
class Token(object):
def __init__(self,type,value):
self.type=type
self.value = value
def __str__(self):
return 'Token({type},{value})'.format(
type = self.type,
value = self.value
)

class Lexer(object):
# 詞法分析器
# 給每個詞打標記
def __init__(self, text):
self.text=text
self.pos=0
self.current_char=self.text[self.pos]

def error(self):
raise Exception('取不到數')

def advance(self):
#往下走,取值
self.pos+=1
if self.pos>len(self.text)-1:
self.current_char=None
else:
self.current_char=self.text[self.pos]

def integer(self):
#多位整數處理
result=''
while self.current_char is not None and self.current_char.isdigit():
result=result+self.current_char
#往下走,取值
self.advance()
return int(result)
def deal_space(self):
while self.current_char is not None and self.current_char.isspace():
self.advance()

def get_next_token(self):
#打標記:1)pos+1,2)返回Token(類型,數值)
while self.current_char is not None:
if self.current_char.isspace():
self.deal_space()

if self.current_char.isdigit():
return Token(INTEGER,self.integer())
if self.current_char=='+':
self.advance()
return Token(PLUS,'+')
if self.current_char=='-':
self.advance()
return Token(MINUS,'-')
if self.current_char=='*':
self.advance()
return Token(MUL, '*')
if self.current_char=='/':
self.advance()
return Token(DIV, '/')
if self.current_char=='(':
self.advance()
return Token(LPAREN, '(')
if self.current_char==')':
self.advance()
return Token(RPAREN, ')')
self.error()
return Token(EOF,None)


class Interpreter(object):
#句法分析
def __init__(self,lexer):
self.lexer=lexer
self.current_token=self.lexer.get_next_token()
def error(self):
raise Exception('無效語法錯誤')

def Error1(self):
raise Exception('除以0錯誤')

def eat(self,token_type):
if self.current_token.type==token_type:
self.current_token=self.lexer.get_next_token()
else:
self.error()
def factor(self):
token=self.current_token
if token.type==INTEGER:
self.eat(INTEGER)
return token.value
elif token.type==LPAREN:
self.eat(LPAREN)
result=self.expr()
self.eat(RPAREN)
return result

def term(self):
result=self.factor()
while self.current_token.type in (MUL,DIV):
token=self.current_token
if token.type==MUL:
self.eat(MUL)
result=result*self.factor()
if token.type==DIV:
self.eat(DIV)
fail = int(self.factor())
if fail == 0:
raise self.Error1()
return
result = result/self.factor()
return result
def expr(self):
result=self.term()
while self.current_token.type in (PLUS,MINUS):
token=self.current_token
if token.type==PLUS:
self.eat(PLUS)
result=result+self.term()
if token.type==MINUS:
self.eat(MINUS)
result=result-self.term()
return result

def main():
while True:
try:
text=input('calc_> ')
except EOFError:
Interpreter.error()
break
if not text:
continue
lexer=Lexer(text)
result=Interpreter(lexer).expr()
if(result is not None):
print(result)


if __name__ == '__main__':
main()

?

運行結果:

?

總體結構圖:

?

?

五、實驗總結

1.這次實驗讓我學會了python基本語法,受益匪淺。

2.過程中一直在發生問題,解決問題的過程,讓我對編譯器有了入門了解。

?

轉載于:https://www.cnblogs.com/shaohua0718/p/7740621.html

總結

以上是生活随笔為你收集整理的软件体系结构的第二次实验(解释器风格与管道过滤器风格)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。