博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
软件体系结构的第二次实验
阅读量:7101 次
发布时间:2019-06-28

本文共 3646 字,大约阅读时间需要 12 分钟。

软件体系结构的第二次实验(解释器风格与管道过滤器风格)

一、实验目的

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  编译器模型示意图

本实验,实现的是词法分析和语法分析两个部分。

四、实验步骤:

代码:

#include <stdio.h>

#include <stdlib.h>
#include <string.h>

#define MAXSIZE 100

#define SYMBOLSIZE 50

typedef struct oper_symbol

{
char oper;
unsigned int index;
}oper_symbol;

double caculate(char * expression);

double get_data(char * str,int beg,int end);
int is_operator_symbol(char ch);
long int power(int base,int times);

int main()

{
char *expression = NULL;
double ret;
expression = (char*)malloc(sizeof(char)*MAXSIZE);
if(expression == NULL)
{
printf("内存分配失败.\n");
return -1;
}
memset(expression,0,MAXSIZE*sizeof(char));
while(1)
{
printf("请输入一个表达式: ");
scanf("%s",expression);
ret = caculate(expression);
printf("表达式计算结果为: %lf\n",ret);
}
free(expression);
system("pause");
return 0;
}

double caculate(char * expression)

{
unsigned int i,j,k;
unsigned int symbol_len = 0;
unsigned int datas_len = 0;
unsigned int symbol_index_len=0;
double left_data,right_data;
double temp,ret;

double *datas = (double*)malloc(sizeof(double)*MAXSIZE);

char *symbols = (char*)malloc(sizeof(char*)*SYMBOLSIZE);
oper_symbol * symbols_index = (oper_symbol*)malloc(sizeof(oper_symbol)*SYMBOLSIZE);

if(datas == NULL || symbols == NULL || symbols_index == NULL)

{
printf("内存分配失败.\n");
return 0;
}
for(i=0;i<strlen(expression);i++)
{
if(is_operator_symbol(expression[i]))
{
symbols_index[symbol_index_len].oper = expression[i];
symbols_index[symbol_index_len].index = i;
symbol_index_len++;
}
}

for(j=0,i=0;j<symbol_index_len;j++)

{
if(datas_len == 0)
left_data = get_data(expression,i,symbols_index[j].index);
else
left_data = datas[--datas_len];

if( j+1 == symbol_index_len)

right_data = get_data(expression,symbols_index[j].index+1,strlen(expression));
else
right_data = get_data(expression,symbols_index[j].index+1,symbols_index[j+1].index);
if(symbols_index[j].oper == '*' || symbols_index[j].oper == '/')
{
switch(symbols_index[j].oper)
{
case '*':
temp = left_data * right_data;
break;
case '/':
temp = left_data / right_data;
break;
}
datas[datas_len++] = temp;
}
else
{
datas[datas_len++] = left_data;
datas[datas_len++] = right_data;
symbols[symbol_len++] = symbols_index[j].oper;
}
}
k = symbol_len;
while(k)
{
left_data = datas[--datas_len];
right_data = datas[--datas_len];
k = symbol_len-1;
switch(symbols[k])
{
case '+':
temp = right_data + left_data;
break;
case '-':
temp = left_data - right_data;
break;
}
datas[datas_len++] = temp;
symbol_len--;
}
ret = datas[0];
free(datas);
free(symbols);
free(symbols_index);
return ret;
}

int is_operator_symbol(char ch)

{
if(ch == '+' || ch == '-' || ch == '*' || ch == '/')
return 1;
return 0;
}

double get_data(char * str,int beg,int end)

{
int i,k;
double ret = 0.0f;
double integer = 0.0f;
double decimal = 0.0f;
double temp;
i = beg;
while(str[i] != '.' && i < end)
{
integer *= 10;
integer += str[i] ^ 0x30;
i++;
}
if(str[i] == '.')
{
i++;
k=1;
while(i<end)
{
temp = str[i] ^ 0x30;
temp /= power(10,k);
decimal += temp;
k++;
i++;
}
}
ret = integer+decimal;
return ret;
}

long int power(int base,int times)

{
long ret = 1;
int i;
for(i=0;i<times;i++)
ret *= base;
return ret;
}

截图:

总体结构:

输入表达式——检查运算符优先级并排序——计算——输出结果

五、实验总结

加深了体系结构的理解,并温习了C语言。

参考资料:

 http://www.cnblogs.com/Anker/archive/2013/05/13/3074916.html

 

转载于:https://www.cnblogs.com/zhl-zhl/p/7748175.html

你可能感兴趣的文章
Create and Call HttpHandler in SharePoint
查看>>
pymysql.err.InternalError: (1054, "Unknown column 'None' in 'field list'")
查看>>
树莓派与window 10组成的物联网核心:让人失望
查看>>
《生活在Linux中》之:在Bash的Emacs模式中使用Vim
查看>>
HDOJ 5411 CRB and Puzzle 矩阵高速幂
查看>>
[LeetCode] Maximum Vacation Days 最大化休假日
查看>>
Microsoft Word、Excel、PowerPoint转Pdf
查看>>
Servlet概述
查看>>
Servlet的异常处理
查看>>
支付宝 app支付 沙盘使用
查看>>
Redis持久化配置-AOF
查看>>
计算机网络的应用层简单介绍:
查看>>
需求管理之客户需求何时休?
查看>>
Java进化? Kotlin初探与集成Android项目
查看>>
URL中的#
查看>>
CentOS自带mysql配置(密码更改、端口开放访问、添加进系统启动项)
查看>>
MYSQL中动态行数据转列数据
查看>>
anchor_target_layer中的bounding regression
查看>>
[转]怎么解决输入流和输出流编码问题
查看>>
Linux下Jenkins服务器搭建
查看>>