软件体系结构的第二次实验(解释器风格与管道过滤器风格
生活随笔
收集整理的這篇文章主要介紹了
软件体系结构的第二次实验(解释器风格与管道过滤器风格
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、實驗目的
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.*;public class Test {public static void main(String[] args) {while(true){Scanner scanner = new Scanner(System.in);System.out.print("calc > ");String text = scanner.nextLine();if (analyzer(text))System.out.println(calculate(toSuffix(text)));elseSystem.out.println("輸入有誤,請重新輸入!!");}}//驗證是否有空格static List<Object> toSuffix(String s) {Map<String, Integer> map = new HashMap<String, Integer>();map.put("+", 0);map.put("-", 0);map.put("*", 1);map.put("/", 1);List<Object> list = new ArrayList<Object>();s = s.replace(" ", "");String[] number = s.split("[^\\d]");String[] operator = s.split("\\d+");Stack<String> stack = new Stack<String>();for (int i = 0; i < number.length; i++) {if (operator[i].length() != 0) {while (!stack.isEmpty()&& map.get(operator[i]) <= map.get(stack.peek())) {list.add(stack.pop());}stack.push(operator[i]);}list.add(Double.parseDouble(number[i]));}while (!stack.isEmpty()) {list.add(stack.pop());}return list;}//計算static double calculate(List<Object> list) {Stack<Double> stack = new Stack<Double>();for (Object obj : list) {if (obj instanceof Double) {stack.push((Double) obj);} else {double b = stack.pop();double a = stack.pop();if (obj.equals("+"))stack.push(a + b);if (obj.equals("-"))stack.push(a - b);if (obj.equals("*"))stack.push(a * b);if (obj.equals("/"))stack.push(a / b);}}return stack.pop();}private static boolean analyzer(String text) {String[] signs = {"+", "-", "*", "/"};boolean isRight = true;//語法分析boolean haveSign = false;for (String sign : signs) {//是否包含運算符if (text.contains(sign)) {haveSign = true;}//是否有連續的運算符if (text.contains(sign + sign)) {isRight = false;}//首尾是否為運算符if ( text.indexOf(sign) == 0 || text.lastIndexOf(sign) == text.length() - 1) {isRight = false;}}isRight = isRight && haveSign;return isRight;} }?
實驗結果 :
?
?
?
結構圖:
轉載于:https://www.cnblogs.com/zhujingru/p/7747898.html
總結
以上是生活随笔為你收集整理的软件体系结构的第二次实验(解释器风格与管道过滤器风格的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从底层结构开始学习FPGA(5)----
- 下一篇: FX5U远程调试PLC远程监控方案