码迷,mamicode.com
首页 > 其他好文 > 详细

130242014014-傅彰炜-第2次实验

时间:2017-10-28 23:57:42      阅读:349      评论:0      收藏:0      [点我收藏+]

标签:自己   语句   out   break   实验   else   编译器   意图   实现   

一、实验目的

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次实验

标签:自己   语句   out   break   实验   else   编译器   意图   实现   

原文地址:http://www.cnblogs.com/fuzhangwei/p/7748559.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!