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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251623.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251623.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251623.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AnularJS1事件

在Web應用的組件是松耦合的情況下,比如需要用戶驗證然后處理授權,即時的通信不總是可行的,因為組件沒有耦合在一起。 例如,如果后端對一個請求返回了狀態碼401(表明一個未經授權的請求),我們期望…

Java基礎學習總結(8)——super關鍵字

2019獨角獸企業重金招聘Python工程師標準>>> 一、super關鍵字 在JAVA類中使用super來引用父類的成分,用this來引用當前對象,如果一個類從另外一個類繼承,我們new這個子類的實例對象的時候,這個子類對象里面會有一個父類…

conda鏡像

轉自https://blog.csdn.net/guilutian0541/article/details/81004769 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main conda config --set show…

Java基礎學習總結(17)——線程

2019獨角獸企業重金招聘Python工程師標準>>> 一、線程的基本概念 線程理解:線程是一個程序里面不同的執行路徑 每一個分支都叫做一個線程,main()叫做主分支,也叫主線程。 程只是一個靜態的概念,機器上的一個.class文件…

(轉)MySQL自帶的性能壓力測試工具mysqlslap詳解

mysqlslap 是 Mysql 自帶的壓力測試工具,可以模擬出大量客戶端同時操作數據庫的情況,通過結果信息來了解數據庫的性能狀況 mysqlslap 的一個主要工作場景就是對數據庫服務器做基準測試 例如我們拿到了一臺服務器,準備做為數據庫服務器&#x…

node.js HelloWord

創建 server.js var http require("http"); http.createServer(function(req,res){ //設置請求頭的編碼格式 res.writeHead(200,{Content-Type:text/html;charsetutf-8}); //設置網頁的編碼格式&#xff08;防止中文亂碼&#xff09; res.write("<head>&…

JavaScript --- this

介紹: this:引用環境執行的環境對象arguments:一個類數組對象,它包含傳入函數的所以參數callee:arguments對象的一個屬性,該屬性是一個指針,指向擁有arguments對象的函數caller:保存著調用當前函數的函數引用apply()方法:第一個參數是作用域&#xff0c;第二個參數是Array實例…

LeetCode Subarray Sum Equals K

原題鏈接在這里&#xff1a;https://leetcode.com/problems/subarray-sum-equals-k/description/ 題目&#xff1a; Given an array of integers and an integer k, you need to find the total number of continuous subarrays whose sum equals to k. Example 1: Input:nums …

水木告白工作室:Java從零入門之模仿頭條資訊(一)

總體設計 一 &#xff1a;Java語言基礎 二 &#xff1a;Spring入門&#xff0c;模板語法和渲染 三 &#xff1a;數據庫交互iBatis集成 四&#xff1a; 用戶注冊 登陸 管理 五&#xff1a; 資訊發布 圖片上傳 資訊首頁 六&#xff1a; 評論中心 站內信 七&#xff1a; Redis入門…

架構師不可不知的十大可擴展架構

2019獨角獸企業重金招聘Python工程師標準>>> 可擴展性正是如今軟件設計領域最值得優先考慮的要素。然而&#xff0c;計算機科學家們還無法了解一套單獨的架構如何才能擴展至各類應用環境當中。相反&#xff0c;我們在數量繁多的方案中所設計出的可擴展性架構&#x…

Winform開發框架中工作流模塊的業務表單開發

在我們開發工作流的時候&#xff0c;往往需要設計到具體業務表單信息的編輯&#xff0c;有些是采用動態編輯的&#xff0c;有些則是在開發過程中處理的&#xff0c;各有各的優點&#xff0c;動態編輯的則方便維護各種各樣的表單&#xff0c;但是數據的綁定及處理則比較麻煩&…

JavaScript --- 跨瀏覽器的事件處理程序

var EventUtil {addHandler: function(element, type, handler) { // 添加事件處理程序if (element.addEventListener) { // DOM2級事件處理程序element.addEventListener (type, handler, false) ;} else if (element.attachEvent) { // IE事件處理程序element.attachEve…

RabbitMQ學習總結(2)——安裝、配置與監控

2019獨角獸企業重金招聘Python工程師標準>>> 一、安裝 1、安裝Erlang 1&#xff09;系統編譯環境&#xff08;這里采用linux/unix 環境&#xff09; ① 安裝環境 虛擬機&#xff1a;VMware Workstation 10.0.1 build Linux系統&#xff1a;CentOS6.5 rabbitMQ官網下…

nginx針對某個url限制ip訪問,常用于后臺訪問限制

nginx針對某個url限制ip訪問&#xff0c;常用于后臺訪問限制 假如我的站點后臺地址為&#xff1a; http://www.abc.net/admin.php 那么我想限制只有個別ip可以訪問后臺&#xff0c;那么需要在配置文件中增加&#xff1a;location ~ .*admin.* {allow 1.1.1.1;allow 12.12.12.0/…

JavaScript --- 跨瀏覽器的事件對象

var EventUtil{addHandler: function(element, type, handler){ // 添加事件方法if (element.addEventListener){element.addEventListener(type, handler, false); // 添加監聽事件,第3個參數false代表:冒泡階段} else if (element.attachEvent) {element.attachEvent("…

第一個C#程序

第一個C#程序 新建項目-選擇模板--控制臺應用程序 還不會用學習版執行程序,沒找到執行(不調試)菜單,調試出一堆線程狀況.用了VS旗艦版完成, 看見C#在VS中的編譯和執行時分開的,eclipse確實叫預編譯軟件,代碼寫好沒錯可以直接運行,編譯由eclipse完成, 提問:為啥VS不這樣設置?是…

XML序列化與反序列化

C#對于XML的序列化與反序列化提供了很好的支持&#xff0c;我們只需要引用System.Xml的命名空間即可&#xff0c;無需使用第三方庫&#xff0c;下面簡單實現了一個XML的序列化與反序列化的幫助類。 1.序列化&#xff1a; 先聲明一個變量var settings new XmlWriterSettings&am…

CODE[VS] 3411 洪水

題目描述 Description小浣熊松松和朋友到野外露營&#xff0c;沒想到遇上了&pi;年一次的大洪水&#xff0c;好在松松是一只愛觀察的小浣熊&#xff0c;他發現露營地的地形和洪水有如下性質&#xff1a; ①露營地可以被看做是一個N*M的矩形方陣&#xff0c;其中左上角坐標為…

JavaScript --- 取得鼠標事件的坐標

說明: clientX和clientY屬性&#xff1a;事件發生時,鼠標指針在視口中的水平和垂直坐標。pageX和pageY屬性&#xff1a;鼠標光標在頁面中的位置。screenX和screenY屬性&#xff1a;鼠標事件發生時&#xff0c;鼠標指針相對于整個屏幕的坐標信息。IE8及更早的版本不支持事件對象…

JavaScript語義基礎

變量&#xff08;Variables&#xff09; Variables是你存儲數據的容器。聲明一個變量需要使用關鍵字var&#xff0c;然后輸入變量的名稱。 1 var myvar; 定義一個變量后&#xff0c;可以賦予變量一個值&#xff1a; 1 myvar "mxp"; 可以將上述操作寫在一行&#x…