标签:技术 alt http 特性 自己 filters 模型 pes 错误提示
一、实验目的
1.熟悉体系结构的风格的概念
2.理解和应用管道过滤器型的风格。
3、理解解释器的原理
4、理解编译器模型
二、实验环境
硬件:
软件:Python或任何一种自己喜欢的语言
三、实验内容
1、实现“四则运算”的简易翻译器。
结果要求:
1)实现加减乘除四则运算,允许同时又多个操作数,如:2+3*5-6 结果是11
2)被操作数为整数,整数可以有多位
3)处理空格
4)输入错误显示错误提示,并返回命令状态“CALC”
加强练习:
1、有能力的同学,可以尝试实现赋值语句,例如x=2+3*5-6,返回x=11。(注意:要实现解释器的功能,而不是只是显示)
2、尝试实现自增和自减符号,例如x++
2、采用管道-过滤器(Pipes and Filters)风格实现解释器
本实验,实现的是词法分析和语法分析两个部分。
四、实验步骤:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class TestCalculator { public static void main(String[] args){ BufferedReader reader=null; InputStreamReader inputStreamReader=null; try{ System.out.print("calc>"); //用输入流读取输入的数据 inputStreamReader=new InputStreamReader(System.in); reader=new BufferedReader(inputStreamReader); String str=reader.readLine(); //判断是否退出 while(!str.equals("#")){ System.out.println(opt(str)); System.out.print("calc>"); str=reader.readLine(); } }catch(Exception e){ System.out.println("输入错误,请检查"); } //判断输入不能为空 if(reader!=null){ try { reader.close(); } catch (IOException e) { System.out.println("输入错误,请检查"); } } } //加减乘数运算 public static Integer opt(String s) throws Exception{ if(s == null || "".equals(s.trim())) { return 0; } int add=s.indexOf("+"); int minus=s.indexOf("-"); int multiply=s.indexOf("*"); int division=s.indexOf("/"); int bracketsLeft=s.indexOf("("); if(add==-1&&minus==-1&&multiply==-1&&division==-1){ if(s.trim()==null||"".equals(s.trim())){ throw new Exception("operate error"); } return Integer.parseInt(s.trim()); } if(bracketsLeft!=-1){ int bracketsRight=s.indexOf(")"); if(bracketsRight==-1){ throw new Exception("括号不匹配"); }else{ float f=opt(s.substring(bracketsLeft+1,bracketsRight).trim()); s=s.replace(s.substring(bracketsLeft,bracketsRight+1), String.valueOf(f)); return opt(s); } } if(add!=-1){ return opt(s.substring(0,add))+opt(s.substring(add+1,s.length())); } if(minus!=-1){ return opt(s.substring(0,minus))-opt(s.substring(minus+1,s.length())); } if(multiply!=-1){ return opt(s.substring(0,multiply))*opt(s.substring(multiply+1,s.length())); } if(division!=-1){ return opt(s.substring(0,division))/opt(s.substring(division+1,s.length())); } return Integer.parseInt(s.trim()); } }
结果图
算法结构图
总体结构图
五、实验总结
解释器和编译器的侧重点不同,编译器注重底层,要求效率;解释器则注重突出各种语言特性。
标签:技术 alt http 特性 自己 filters 模型 pes 错误提示
原文地址:http://www.cnblogs.com/Kyangyang/p/7748094.html