软件体系结构的第二次实验(解释器风格与管道过滤器风格)
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; } }
对应结构图:
以上是关于软件体系结构的第二次实验(解释器风格与管道过滤器风格)的主要内容,如果未能解决你的问题,请参考以下文章