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

Posted 清沛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件体系结构的第二次实验(解释器风格与管道过滤器风格)相关的知识,希望对你有一定的参考价值。

一、实验目的

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  编译器模型示意图

本实验,实现的是词法分析和语法分析两个部分。

四、实验步骤:

代码如下:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class calc {

    private static String[] SIGNS = {"+", "-", "*", "/"};
    private static Character[] STANDARD_CHAT = {\'+\', \'-\', \'*\', \'/\', \'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\', \' \'};
    private static List<Character> STANDARD_LIST = new ArrayList<Character>(Arrays.asList(STANDARD_CHAT));

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        String expr = scanner.nextLine();
        //包含quit退出运算
        while (!expr.contains("quit")) {
            //词法+语法分析
            if (analyzer(expr)) {
                System.out.println(calculator(expr));
            } else {
                System.out.println("表达式输入错误");
            }
            expr = scanner.nextLine();
        }

    }

    private static Double calculator(String expr) {

        //去空格
        expr = expr.replace(" ","");
        for (String sign : SIGNS) {
            Integer index;
            if ("-".equals(sign)) {
                index = expr.lastIndexOf(sign);
            } else {
                index = expr.indexOf(sign);
            }
            //不包含当前运算符
            if (index == -1) {
                continue;
            }

            String firstHalf = expr.substring(0, index);
            String secondHalf = expr.substring(index + 1, expr.length());
            switch (sign) {
                case "+":
                    return calculator(firstHalf) + calculator(secondHalf);
                case "-":
                    return calculator(firstHalf) - calculator(secondHalf);
                case "*":
                    return calculator(firstHalf) * calculator(secondHalf);
                case "/":
                    return calculator(firstHalf) / calculator(secondHalf);
            }

        }

        return Double.valueOf(expr);
    }

    private static boolean analyzer(String expr) {

        boolean isRight = true;

        //词法分析,输入的表达式是否包含非法字符
        for (int i = 0; i < expr.length(); i++) {
            if (!STANDARD_LIST.contains(expr.charAt(i))) {
                isRight = false;
                break;
            }
        }
        //语法分析
        boolean haveSign = false;
        for (String sign : SIGNS) {
            //是否包含运算符
            if (expr.contains(sign)) {
                haveSign = true;
            }
            //是否有连续的运算符
            if (expr.contains(sign + sign)) {
                isRight = false;
            }
            //首尾是否为运算符
            if ( expr.indexOf(sign) == 0 || expr.lastIndexOf(sign) == expr.length() - 1) {
                isRight = false;
            }
        }

        isRight = isRight && haveSign;

        return isRight;
    }
}

 

 

对应结构图:

 

以上是关于软件体系结构的第二次实验(解释器风格与管道过滤器风格)的主要内容,如果未能解决你的问题,请参考以下文章

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

130242014047+徐晓敏+第二次实验

130242014053+吴帮莉+第二次实验

130242014076+陈旭+第2次实验

130242014013+黄超+第2次实验

130242014074+林泽民+第2次实验