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次实验相关推荐
- 工行高级经理林承军:工行基于 MySQL 构建分布式架构的转型之路
中生代技术 链接技术大咖,分享技术干货 全文:7200字 本文作者:林承军,中国工商银行软件开发中心高级经理,有用多年开放平台相关技术研究及实施经验,多次参与工行重点项目的原型技术研究.IT 架构转型 ...
- 友盟+首席产品官 林鸣晖:从统计平台到数据智能云服务的9年进阶之路
作者:数据猿|郭敏 现如今,行业越来越重视数据的价值,利用技术手段将原始数据分析.加工为信息和知识,进而转化为决策或行动,商业社会已经从大数据时代迈入数据智能时代. 时代的悄然变化带来了新的商业机会, ...
- 友盟+林鸣晖:友盟+产品矩阵助力开发者全面提效
10月21日,以"前沿·探索·想象力"为主题的"2021云栖大会"在浙江杭州云栖小镇开幕.在友盟+ 主办的移动互联网开发提效与实践论坛中, 友盟+ 首席产品官林 ...
- 大学计算机实验在林学的应用,大学计算机实验6实验报告.pdf
深 圳 大 学 实 验 报 告 课程名称: 计算机基础 实验名称: 演示文稿制作 学院: 建筑与城市规划学院 专业: 建筑学 报告人: XXX 学号: 2015XXX 班级: XXXXXX 同组人: ...
- 1恢复 群晖raid_群晖RAID1在线扩容实验及步骤
很多坛友遇到这样的问题:比如原来在DSM中用两个1T的硬盘组了RAID1,现在放满了,能否在不拷出内容的情况下用两块更大的硬盘,比如两块2T的硬盘来代替.设想中的做法是将其中一块1T的硬盘拔出,装上2 ...
- 学生选课管理系统c语言程序报告,c语言课程设计学生选课管理系统实验报告.doc...
课程设计报告 课程设计题目:学生选课管理系统 学 号 姓 名:李唐松 专 业:软件工程 班 级: 091107 指导老师:谢小林 2009年1月5 *实验题目: 学分管理程序 *实验时间与地点:200 ...
- 厦门理工学院c语言实验报告5,厦门理工学院 C语言报告实验8 - 结构体
<C语言程序设计>实验报告 实验序号:8 实验项目名称:结构体 学 号 实验地点 315 姓 名 指导教师 林仙丽 专业.班级 实验时间 网络工程 2012年12月26日 一.实验目的及要 ...
- 2021谷饶中学高考成绩查询,高考成绩
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 汕头市澄海中学202人 汕头市下蓬中学7人 潮阳金堡中学2人 汕头市聿怀中学121人 潮阳一中明光学校7人 潮南峡晖中学2人 汕头市六都中学99人 ...
- Erik Dietrich:二十年的编程,教会我的五件事!
CSDN翻译 读完需要 11 分钟 速读仅需 4 分钟 无论你是刚入编程的小白,还是已经浸润编程数年的资深人员.相信这篇文章都会给你带来不一样的启发,前人的经验永远是我们最容易看到的捷径. 作者 | ...
最新文章
- 计算机系统上线保障计划,系统运维信息系统运行保障方案计划新.docx
- 表格table常见的边框设置和初步的立体效果
- osi七层模型tcp/udp
- linux ping监控脚本,WINDOWS和LINUX下带时间的PING包监控脚本
- 关于GCC的理解——On the understanding of the GCC
- [转]Oracle字符串拼接的方法
- 用scikit-learn和pandas实现线性回归
- keepalved 双机热备
- 在Yalmip中应用SDPT3
- RtlUnicodeStringToAnsiString中第三个参数引发的bsod
- 反击网络执法官[转]
- 网页视频加速播放方法(不用下载插件,不用安装浏览器)
- python 还原九宫格图片_教你用python将图片变成九宫格,打造高逼格朋友圈九宫格图片...
- window上vs2017 opencv图片路径问题(附3种加载路径方法)
- pycharm连接云端服务器后实现远程debug调试
- 阿里云产品有哪些?阿里云产品种类整理汇总
- ​治理 V20 领导应如何支持
- 第二十八篇 网页实战之静态网页爬取,四大案例,小说,书,图片等抓取操作
- 星淘惠:阿拉山口跨境电商班列为跨境电商保稳提质助力
- pptv android pad客户端,PPTV 发布Android新版客户端 视频行业首创多屏互动功能
热门文章
- mysql windows软件_windows版MySQL软件的安装
- java多核并行计算_谈谈Java任务的并行处理
- 【计算机组成原理】多功能算数逻辑运算单元
- java file ip_java常用工具类 IP、File文件工具类
- 全志和瑞芯微比较_哪家强_全志瑞芯微海思PK 智能芯片哪家强?
- 计算机408考研专题(建议收藏)
- 51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子
- 数制转换itoa atoi int转字符串 字符串转int string转int int转string
- C/C++内存分配、内存区划分、常量存储区、堆、栈、自由存储区、全局区(静态区)、代码区
- About 4B/5B