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

一、实验目的

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次实验相关推荐

  1. 工行高级经理林承军:工行基于 MySQL 构建分布式架构的转型之路

    中生代技术 链接技术大咖,分享技术干货 全文:7200字 本文作者:林承军,中国工商银行软件开发中心高级经理,有用多年开放平台相关技术研究及实施经验,多次参与工行重点项目的原型技术研究.IT 架构转型 ...

  2. 友盟+首席产品官 林鸣晖:从统计平台到数据智能云服务的9年进阶之路

    作者:数据猿|郭敏 现如今,行业越来越重视数据的价值,利用技术手段将原始数据分析.加工为信息和知识,进而转化为决策或行动,商业社会已经从大数据时代迈入数据智能时代. 时代的悄然变化带来了新的商业机会, ...

  3. 友盟+林鸣晖:友盟+产品矩阵助力开发者全面提效

    10月21日,以"前沿·探索·想象力"为主题的"2021云栖大会"在浙江杭州云栖小镇开幕.在友盟+ 主办的移动互联网开发提效与实践论坛中, 友盟+ 首席产品官林 ...

  4. 大学计算机实验在林学的应用,大学计算机实验6实验报告.pdf

    深 圳 大 学 实 验 报 告 课程名称: 计算机基础 实验名称: 演示文稿制作 学院: 建筑与城市规划学院 专业: 建筑学 报告人: XXX 学号: 2015XXX 班级: XXXXXX 同组人: ...

  5. 1恢复 群晖raid_群晖RAID1在线扩容实验及步骤

    很多坛友遇到这样的问题:比如原来在DSM中用两个1T的硬盘组了RAID1,现在放满了,能否在不拷出内容的情况下用两块更大的硬盘,比如两块2T的硬盘来代替.设想中的做法是将其中一块1T的硬盘拔出,装上2 ...

  6. 学生选课管理系统c语言程序报告,c语言课程设计学生选课管理系统实验报告.doc...

    课程设计报告 课程设计题目:学生选课管理系统 学 号 姓 名:李唐松 专 业:软件工程 班 级: 091107 指导老师:谢小林 2009年1月5 *实验题目: 学分管理程序 *实验时间与地点:200 ...

  7. 厦门理工学院c语言实验报告5,厦门理工学院 C语言报告实验8 - 结构体

    <C语言程序设计>实验报告 实验序号:8 实验项目名称:结构体 学 号 实验地点 315 姓 名 指导教师 林仙丽 专业.班级 实验时间 网络工程 2012年12月26日 一.实验目的及要 ...

  8. 2021谷饶中学高考成绩查询,高考成绩

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 汕头市澄海中学202人  汕头市下蓬中学7人  潮阳金堡中学2人 汕头市聿怀中学121人  潮阳一中明光学校7人  潮南峡晖中学2人 汕头市六都中学99人 ...

  9. Erik Dietrich:二十年的编程,教会我的五件事!

    CSDN翻译 读完需要 11 分钟 速读仅需 4 分钟 无论你是刚入编程的小白,还是已经浸润编程数年的资深人员.相信这篇文章都会给你带来不一样的启发,前人的经验永远是我们最容易看到的捷径. 作者 | ...

最新文章

  1. 计算机系统上线保障计划,系统运维信息系统运行保障方案计划新.docx
  2. 表格table常见的边框设置和初步的立体效果
  3. osi七层模型tcp/udp
  4. linux ping监控脚本,WINDOWS和LINUX下带时间的PING包监控脚本
  5. 关于GCC的理解——On the understanding of the GCC
  6. [转]Oracle字符串拼接的方法
  7. 用scikit-learn和pandas实现线性回归
  8. keepalved 双机热备
  9. 在Yalmip中应用SDPT3
  10. RtlUnicodeStringToAnsiString中第三个参数引发的bsod
  11. 反击网络执法官[转]
  12. 网页视频加速播放方法(不用下载插件,不用安装浏览器)
  13. python 还原九宫格图片_教你用python将图片变成九宫格,打造高逼格朋友圈九宫格图片...
  14. window上vs2017 opencv图片路径问题(附3种加载路径方法)
  15. pycharm连接云端服务器后实现远程debug调试
  16. 阿里云产品有哪些?阿里云产品种类整理汇总
  17. ​治理 V20 领导应如何支持
  18. 第二十八篇 网页实战之静态网页爬取,四大案例,小说,书,图片等抓取操作
  19. 星淘惠:阿拉山口跨境电商班列为跨境电商保稳提质助力
  20. pptv android pad客户端,PPTV 发布Android新版客户端 视频行业首创多屏互动功能

热门文章

  1. mysql windows软件_windows版MySQL软件的安装
  2. java多核并行计算_谈谈Java任务的并行处理
  3. 【计算机组成原理】多功能算数逻辑运算单元
  4. java file ip_java常用工具类 IP、File文件工具类
  5. 全志和瑞芯微比较_哪家强_全志瑞芯微海思PK 智能芯片哪家强?
  6. 计算机408考研专题(建议收藏)
  7. 51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子
  8. 数制转换itoa atoi int转字符串 字符串转int string转int int转string
  9. C/C++内存分配、内存区划分、常量存储区、堆、栈、自由存储区、全局区(静态区)、代码区
  10. About 4B/5B