130242014033-林锦鹏-第2次实验
Posted 升水
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了130242014033-林锦鹏-第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 编译器模型示意图
本实验,实现的是词法分析和语法分析两个部分。
四、实验步骤:
要求写具体实现代码,并根据实际程序,画出程序的总体体系结构图和算法结构图。
package com.ljp; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Scanner; public class Clac{ private List<String> token=new ArrayList<String>(); private int pos=0; private String currentToken; public Clac(String expression){ String[] dataArr = expression.split("[\\\\+\\\\-\\\\*/]"); String[] operArr = expression.split("\\\\d++"); operArr=Arrays.copyOfRange(operArr, 1, operArr.length); for(int i=0;i<dataArr.length;i++){ token.add(dataArr[i]); if(i!=dataArr.length-1){ token.add(operArr[i]); } } currentToken=token.get(0); } public String next(){ String nextToken = token.get(pos++); if(pos==token.size()){ currentToken="end"; }else{ currentToken=token.get(pos); } return nextToken; } public Double expr() throws Exception{ double result=term(); while(this.currentToken.equals("+")||this.currentToken.equals("-")){ if(this.currentToken.equals("+")){ this.next(); result = result + term(); }else if(this.currentToken.equals("-")){ this.next(); result = result - term(); } } return result; } public Double term() throws Exception{ double result=Double.parseDouble(currentToken); next(); if(currentToken.equals("end")){ return result; } while(this.currentToken.equals("*")||this.currentToken.equals("/")){ if(this.currentToken.equals("*")){ next(); result=result * Double.parseDouble(currentToken); next(); }else if(this.currentToken.equals("/")){ next(); result=result / Double.parseDouble(currentToken); next(); } } return result; } public static void main(String[] args) { Scanner in=new Scanner(System.in); double result; try { while(true){ String expression = in.nextLine(); expression=expression.replaceAll(" ", ""); result = new Clac(expression).expr(); System.out.println(result); } } catch (Exception e) { System.out.println("格式错误"); } } }
以上是关于130242014033-林锦鹏-第2次实验的主要内容,如果未能解决你的问题,请参考以下文章