日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/3/12 编程问答 67 豆豆
生活随笔 收集整理的這篇文章主要介紹了 软件体系结构的第二次实验(解释器风格与管道过滤器风格 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、實驗目的

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

總結

以上是生活随笔為你收集整理的软件体系结构的第二次实验(解释器风格与管道过滤器风格的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。