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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

130242014045 林承晖 第2次实验

發布時間:2023/12/13 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 130242014045 林承晖 第2次实验 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

軟件體系結構的第二次實驗(解釋器風格與管道過濾器風格)

一、實驗目的

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++?

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

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

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

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

四、實驗步驟:

? ? ?代碼:

  

# coding: UTF-8
#編碼格式 INTEGER,PLUS,MINUS,MUL,DIV,LPAREN,RPAREN,EOF=('INTEGER','PLUS','MINUS','MUL','DIV','LPAREN','RPAREN','EOF')class Token(object):def __init__(self,type,value):self.type=typeself.value = valuedef __str__(self):return 'Token({type},{value})'.format(type = self.type,value = self.value)class Lexer(object): # 詞法分析器 # 給每個詞打標記def __init__(self, text):self.text=textself.pos=0self.current_char=self.text[self.pos]def error(self):raise Exception('Invalid Char')def advance(self):#往下走,取值self.pos+=1if self.pos>len(self.text)-1:self.current_char=Noneelse: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=lexerself.current_token=self.lexer.get_next_token()def error(self):raise Exception('Invalid Syntax')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_tokenif token.type==INTEGER:self.eat(INTEGER)return token.valueelif token.type==LPAREN:self.eat(LPAREN)result=self.expr()self.eat(RPAREN)return resultdef term(self):result=self.factor()while self.current_token.type in (MUL,DIV):token=self.current_tokenif token.type==MUL:self.eat(MUL)result=result*self.factor()if token.type==DIV:self.eat(DIV)result=resultlf.factor()return resultdef expr(self):result=self.term()while self.current_token.type in (PLUS,MINUS):token=self.current_tokenif token.type==PLUS:self.eat(PLUS)result=result+self.term()if token.type==MINUS:self.eat(MINUS)result=result-self.term()return resultdef main():while True:try:text=input('calc_> ')except EOFError:Interpreter.error()breakif not text:continuelexer=Lexer(text)result=Interpreter(lexer).expr()if(result is not None):print(result)if __name__ == '__main__':main()

  結果:

? ??    

總體結構圖:

?

對應結構圖:

?

五、實驗總結

對于體系結構應用的理解等。

轉載于:https://www.cnblogs.com/lchui2155/p/7748135.html

總結

以上是生活随笔為你收集整理的130242014045 林承晖 第2次实验的全部內容,希望文章能夠幫你解決所遇到的問題。

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