一、实验目的
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 "ctype.h"
int n=0;
char record[20];
float product();
float change();
float muli()
{
float summ;
summ=product();
while(record[n]=='-'||record[n]=='+')
{
switch(record[n])
{
case '+':n++;summ+=product();break;
case '-':n++;summ-=product();break;
}
}
return summ;
}
float product()
{
float sump;
sump=change();
while(record[n]=='*'||record[n]=='/')
{
switch(record[n])
{
case '*':n++;sump*=change();break;
case '/':n++;sump/=change();break;
}
}
return sump;
}
float change()
{
float sumc;
char rec[20],i=0;
if(record[n]=='(')
{
n++;
sumc=muli();
}
if(record[n]==')')
n++;
while(isdigit(record[n])||record[n]=='.')
{
while(isdigit(record[n])||record[n]=='.')
rec[i++]=record[n++];
rec[i]='\0';
sumc=atof(rec);
}
return sumc;
}
void main()
{
while(1)
{
n=0;
scanf("%s",record);
printf("%s=%g\n",record,muli());
}
}
对应结构图:
五、实验总结