1、實驗目的java
1.熟悉體系結構的風格的概念算法
2.理解和應用管道過濾器型的風格。翻譯
三、理解解釋器的原理3d
四、理解編譯器模型blog
2、實驗環境ip
硬件: input
軟件:Python或任何一種本身喜歡的語言編譯器
3、實驗內容string
一、實現「四則運算」的簡易翻譯器。io
結果要求:
1)實現加減乘除四則運算,容許同時又多個操做數,如:2+3*5-6 結果是11
2)被操做數爲整數,整數能夠有多位
3)處理空格
4)輸入錯誤顯示錯誤提示,並返回命令狀態「CALC」
圖1 實驗結果示例
增強練習:
一、有能力的同窗,能夠嘗試實現賦值語句,例如x=2+3*5-6,返回x=11。(注意:要實現解釋器的功能,而不是隻是顯示)
二、嘗試實現自增和自減符號,例如x++
二、採用管道-過濾器(Pipes and Filters)風格實現解釋器
圖2 管道-過濾器風格
圖 3 編譯器模型示意圖
本實驗,實現的是詞法分析和語法分析兩個部分。
4、實驗步驟:
要求寫具體實現代碼,並根據實際程序,畫出程序的整體體系結構圖和算法結構圖。
package jsq;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Cal {
public static void main(String[] args) {
BufferedReader reader = null;
InputStreamReader inputStreamReader = null;
try {
System.out.print("calc >");
inputStreamReader = new InputStreamReader(System.in);// 得到算數式
reader = new BufferedReader(inputStreamReader);
String str = reader.readLine();
while (true) {// 循環這個過程
if (!match(str)) {//判斷沒有其餘字母(輸入錯誤
System.out.println("="+opt(str) + "");// 輸出計算結果
}
else{//錯了
System.out.println("error");
}
System.out.print("calc >");
str = reader.readLine();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static float opt(String s) throws Exception {// 計算
if (s == null || "".equals(s.trim())) {
return 0f;
}
int a1 = s.indexOf("+");
int a2 = s.indexOf("-");
int a3 = s.indexOf("*");
int a4 = s.indexOf("/");
if (a1 == -1 && a2 == -1 && a3 == -1 && a4 == -1) {
if (s.trim() == null || "".equals(s.trim())) {
throw new Exception("operate error");
}
return Float.parseFloat(s.trim());
}
if (a1 != -1) {
return opt(s.substring(0, a1))+ opt(s.substring(a1 + 1, s.length()));
}
if (a2 != -1) {
return opt(s.substring(0, a2))- opt(s.substring(a2 + 1, s.length()));
}
if (a3 != -1) {
return opt(s.substring(0, a3))* opt(s.substring(a3 + 1, s.length()));
}
if (a4 != -1) {
return opt(s.substring(0, a4))/ opt(s.substring(a4 + 1, s.length()));
}
return Integer.parseInt(s.trim());
}
public static boolean match(String cardNum) { // 檢測表達式是否正確
String regex = ".*[a-zA-Z]+.*";
Matcher m = Pattern.compile(regex).matcher(cardNum);
return m.matches();
}
}
運算截圖: