軟體體系結構的第二次實驗(直譯器風格與管道過濾器風格)
一、實驗目的
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
#include
#include
#define maxsize 100
#define symbolsize 50
typedef struct oper_symbol
oper_symbol;
double caculate(char * expression);
double get_data(char * str,int beg,int end);
int is_operator_symbol(char ch);
long int power(int base,int times);
int main()
memset(expression,0,maxsize*sizeof(char));
while(1)
free(expression);
system("pause");
return 0;
}double caculate(char * expression)
for(i=0;ifor(j=0,i=0;jif( j+1 == symbol_index_len)
right_data = get_data(expression,symbols_index[j].index+1,strlen(expression));
else
right_data = get_data(expression,symbols_index[j].index+1,symbols_index[j+1].index);
if(symbols_index[j].oper == '*' || symbols_index[j].oper == '/')
datas[datas_len++] = temp;
}else
}k = symbol_len;
while(k)
datas[datas_len++] = temp;
symbol_len--;
}ret = datas[0];
free(datas);
free(symbols);
free(symbols_index);
return ret;
}int is_operator_symbol(char ch)
double get_data(char * str,int beg,int end)
if(str[i] == '.')
{i++;
k=1;
while(ilong int power(int base,int times)
{long ret = 1;
int i;
for(i=0;i截圖:
總體結構:
輸入表示式——檢查運算子優先順序並排序——計算——輸出結果
五、實驗總結
加深了體系結構的理解,並溫習了c語言。
第二次實驗
一 問題及 問題提 乙個數如果恰好等於它的因子之和,這個數就稱為 完數 例如6 1 2 3,再如8的因子和是7 即1 2 4 8不是完數。程式設計找出1000以內的所有完數。答案 6 28 496 檔名稱 作 者 周玉傑 完成日期 2017 年 3月 13 日 版 本 號 dev c 對任務及求解方...
第二次實驗
1 如何進行模式切換 哪兩種模式 答 第一次啟動linux系統會進入命令列模式,會要求輸入使用者名稱,預設的管理員帳號名為root,輸入 root 後回車,提示輸入密碼 密碼是在安裝系統時自己設定的 這樣就以管理員身份登陸了系統。第二種就是如果不想用使用命令列模式,而需要進入圖形介面 在命令列模式下...
C 第二次實驗
實驗目的 1.掌握類和物件的使用。2.掌握字段 屬性 方法 引數 過載 重寫與覆蓋 繼承和多型的使用。實驗內容 1.隨機給出乙個0至99 包括0和99 之間的數字,然後讓你猜是什麼數字。你可以隨便猜乙個數字,遊戲會提示太大還是太小,從而縮小結果範圍。經過幾次猜測與提示後,最終推出答案。1 控制台 w...