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();
}
}
运算截图: