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次试验的主要内容,如果未能解决你的问题,请参考以下文章