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("格式错误");
        }
    }
}

 

  

 

 

posted @ 2017-10-28 15:42  升水  阅读(155)  评论(0编辑  收藏  举报