155242012068+林汉民+第2次试验

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了155242012068+林汉民+第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++ 

    3、采用管道-过滤器(Pipes and Filters)风格实现解释器

技术分享

 

                        图2  管道-过滤器风格

 技术分享

 

                     图 3  编译器模型示意图

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

 

 四:要求写具体实现代码,并根据实际程序,画出程序的总体体系结构图和算法结构图。

总体结构图参照体系结构风格。

 

代码如下

输入算式请再末尾加等号

#include<stdio.h>
#include<stdlib.h>
int n,i;
float val[100];
char c[1000],fu[100];
float digui()
{
float he=0,ji=0;
char hefu=‘+‘;
for(;fu[i]!=‘)‘&&fu[i]!=‘=‘;i++)
{
switch(fu[i])
{

case ‘(‘:
i++;
digui();
break;

case ‘+‘:
if(hefu==‘+‘) {val[n] = he + val[n];he = val[n];}
else {val[n] = he - val[n];he = val[n];}  
hefu = ‘+‘;
n++;
break;

case ‘-‘:
if(hefu==‘+‘) {val[n] = he + val[n];he = val[n];}
else {val[n] = he - val[n];he = val[n];} // 同上
hefu = ‘-‘;
n++;
break;

case ‘*‘:  
{
ji=val[n]; // ji在这里被设置
while(1)
{
if(fu[i] == ‘*‘)
{
if(fu[i+1] == ‘(‘) 
{
i+=2;n++;
ji = ji * digui();
}
else
{
ji = ji*val[n+1];
i++;n++;
}
}
else if(fu[i] == ‘/‘)
{
if(fu[i+1] == ‘(‘)
{
i+=2;n++;
ji = ji / digui();
}
else
{
ji = ji/val[n+1];
i++;n++;
}
}
else break;  
}
val[n] = ji;  
if(fu[i]==‘+‘||fu[i]==‘-‘||fu[i]==‘=‘)
i--;
break;
}

case ‘/‘: //这个与上面那个case里面的作用一样
{
ji = val[n];
while(1)
{
if(fu[i] == ‘*‘)
{
if(fu[i+1] == ‘(‘)
{
i+=2;n++;
ji = ji * digui();
}
else
{
ji = ji*val[n+1];
i++;n++;
}
}
else if(fu[i] == ‘/‘)
{
if(fu[i+1] == ‘(‘)
{
i+=2;n++;
ji = ji / digui();
}
else
{
ji = ji/val[n+1];
i++;n++;
}
}
else break;
}
}
val[n] = ji;
if(fu[i]==‘+‘||fu[i]==‘-‘||fu[i]==‘=‘)
i--;
break;
}
}

if(hefu == ‘+‘) val[n] = he + val[n]; 
else val[n] = he - val[n];
return val[n]; 
}


int main()
{
int a=0,j=0;float b=0,d=0,g=10;
gets(c);
for(i=0;c[i]!=0&&i<1000;i++)
{
if(c[i]>=‘0‘&&c[i]<=‘9‘)
{
while(c[i]>=‘0‘&&c[i]<=‘9‘)
{
b=(c[i]-‘0‘)+b*10;
i++;
}
if(c[i]==‘.‘)
{
i++;
while(c[i]>=‘0‘&&c[i]<=‘9‘)
{
d=d+(c[i]-‘0‘)/g;
g*=10;
i++;
}
} // 以上是收集输入流中的数
val[n]=b+d;
n++;
}
b=0;d=0;g=10;
}
for(i=0;c[i]!=0;i++)
{
if(c[i] < ‘0‘ || c[i] > ‘9‘)
fu[j++]=c[i];

j=n;
i=0;
n=0;  
printf("=%f\\n", digui());
system("pause");
}

技术分享































































































































































以上是关于155242012068+林汉民+第2次试验的主要内容,如果未能解决你的问题,请参考以下文章

130242014070 张宇 第2次试验

第二次试验报告与第四周总结

嵌入式软件设计第8次试验

网络攻防第四次试验(第二部分)

第四次试验第一项

算法(第4版)-1.4.6 倍率试验