130242014018-郑志良-第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  编译器模型示意图

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

四、实验步骤:

    #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());
 }  
}

 

 
对应结构图:

 

五、实验总结

 

posted @ 2017-10-29 00:20  ,,z  阅读(280)  评论(0编辑  收藏  举报