一、實驗目的
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());
?}??
}
?
對應結構圖:
?
五、實驗總結
?