1. 程式人生 > >軟件體系結構的第二次實驗(解釋器風格與管道過濾器風格)

軟件體系結構的第二次實驗(解釋器風格與管道過濾器風格)

硬件 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 {

    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.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; } }

對應結構圖:

技術分享

軟件體系結構的第二次實驗(解釋器風格與管道過濾器風格)