130242014014-傅彰炜-第2次实验
Posted 阿拉丁神经
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了130242014014-傅彰炜-第2次实验相关的知识,希望对你有一定的参考价值。
一、实验目的
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.List;
import java.util.Stack;
public class Test {
public static void main(String args[]){
Scanner scanner = new Scanner(System.in);
String expr = scanner.nextLine();
System.out.println(getRes(expr));
}
public static int getRes(String str){
char[] array = str.toCharArray();
List<Character> output = new ArrayList<Character>();;
Stack<Character> sign = new Stack<Character>();
for(int i=0;i<array.length;i++)
{
if(array[i]>‘0‘&&array[i]<=‘9‘){
output.add(array[i]);
}
else if(sign.empty()||getBoolean(sign,array[i]))
{
sign.push(array[i]);
}
else{
while(!sign.empty()&&!getBoolean(sign, array[i]))
output.add(sign.pop());
sign.push(array[i]);
}
}
while(!sign.empty())
{
output.add(sign.pop());
}
System.out.println(output);
Stack<Integer> res = new Stack<Integer>();
Integer result = null;
for(Character temp :output)
{
if(temp>‘0‘&&temp<=‘9‘)
{
res.push(temp-‘0‘);
}
else {
int top1 = res.pop();
int top2 =res.pop();
switch(temp){
case ‘+‘:
result = top2+top1;
break;
case ‘-‘:
result = top2-top1;
break;
case ‘*‘:
result = top2*top1;
break;
case ‘/‘:
result = top2/top1;
break;
}
res.push(result);
}
}
return result;
}
private static boolean getBoolean(Stack stack,char element)
{
Character c = (Character)stack.peek();
if((c==‘+‘||c==‘-‘)&&(element==‘*‘||element==‘/‘))
return true;
return false;
}
}
以上是关于130242014014-傅彰炜-第2次实验的主要内容,如果未能解决你的问题,请参考以下文章