軟件體系結構的第二次實驗(解釋器風格與管道過濾器風格)
阿新 • • 發佈:2017-10-28
硬件 hal 例如 .cn analyze boolean ole private 實現
一、實驗目的
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 { privatestatic 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 staticvoid 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.trim(); 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) { //詞法分析,輸入的表達式是否包含非法字符 for (int i = 0; i < expr.length(); i++) { if (!STANDARD_LIST.contains(expr.charAt(i))) { return false; } } //語法分析,是否包含運算符 boolean haveSign = false; for (String sing:SIGNS) { if (expr.contains(sing)){ haveSign = true; } } return haveSign; } }
對應結構圖:
軟件體系結構的第二次實驗(解釋器風格與管道過濾器風格)