導航:首頁 > 源碼編譯 > 編譯器原理表達式求值

編譯器原理表達式求值

發布時間:2022-06-24 02:20:32

㈠ 數據結構寫程序實現表達式求值演算法

這是c++的代碼

0stdafx.h

//stdafx.h:標准系統包含文件的包含文件,
//或是經常使用但不常更改的
//特定於項目的包含文件
//

//#pragmaonce是一個比較常用的C/C++雜注,只要在頭文件的最開始加入這條雜注,就能夠保證頭文件只被編譯一次。
#pragmaonce
#include"targetver.h"
#include<stdio.h>
#include<tchar.h>
#include<iostream>
#include<stdlib.h>
#include<string>
#include<string.h>
#include<math.h>
#include<time.h>
usingnamespacestd;

//TODO:在此處引用程序需要的其他頭文件


1 stack棧的結構

#pragmaonce
#include"stdafx.h"
#include"StackNode.h"

//LinkStack,鏈式棧的類定義
template<typenameT>
classStack{
private:
StackNode<T>*top;//curptr
//7個方法
public:
//ConstructFunction()
Stack():top(NULL){}
//DeConstructFunction()
~Stack(){
StackNode<T>*p;//temprefdomain
while(top!=NULL){//free()
p=top;
top=top->next;
deletep;
}
}
//Push()從棧頂壓入一個元素
voidPush(constT&item){
StackNode<T>*p=newStackNode<T>;
p->data=item;//賦值
p->next=top;//connectcurptr
top=p;//curptrmove++
}
//Pop()從棧頂彈出一個元素
TPop(){
if(IsEmpty()){//emptystack
cerr<<"Attempttopopanemptystack!"<<endl;
exit(1);
}
StackNode<T>*p=top;//temprefdomain
TRetValue=p->data;//tempdatadomain
top=top->next;//top--move
deletep;//free()p,elsewillcrashmemory
returnRetValue;
}
//Peek(),GetTop()
TPeek()const{
if(IsEmpty()){//emptystack
cerr<<"Attempttopopanemptystack!"<<endl;
exit(1);
}
returntop->data;
}//!_Peek
//Clear()
voidClear(void){
//不free()會內存泄漏
StackNode<T>*p;//temprefdomain
while(top!=NULL){//free()
p=top;
top=top->next;
deletep;
}
this.top=NULL;
}//!_Clear()
//IsEmpty()
intIsEmpty(void)const{
returntop==NULL;
}//!_IsEmpty()
};//!_classStack


2表達式求值演算法

#pragmaonce
#include"stdafx.h"
#include"Stack.h"
//方法的聲明實現的分離寫法容易報錯,IDE還找不到錯誤的地方

//表達式求值
classCalculator{
private:
//Calculator'sstack,運算存儲區
Stack<double>s;
//7個方法
public:
//建立一個空計算器棧
Calculator(void){}
//De建立一個空計算器棧
virtual~Calculator(){}
//將一個double型操作數壓入堆棧
voidEnter(doubleoperand){
s.Push(operand);
}
//彈出2個操作數
voidGetTwoOperands(double&operand1,double&operand2){
if(s.IsEmpty()){
cerr<<"Nooperandtobepop!"<<endl;
s.Clear();
exit(1);
}
operand1=s.Pop();
if(s.IsEmpty){
cerr<<"Nooperandtobepop!"<<endl;
s.Clear();
exit(1);
}
operand2=s.Pop();
}
//操作符運算
voidCompute(charop){
doubleoperand1,operand2,result;
GetTwoOperands(operand1,operand2);
switch(op){
case'+':result=operand1+operand2;break;
case'-':result=operand1-operand2;break;
case'*':result=operand1*operand2;break;
case'/':if(operand2==0){
cerr<<"Dividedby0!"<<endl;
s.Clear();
exit(1);
}else
result=operand1/operand2;break;
default:
break;
}
s.Push(result);
}
//清空棧
voidClear(){
s.Clear();
}
//計算表達式的值
voidRun(){
charop;//操作符
doubleoperand;//操作數
cin>>op;//輸入操作符
while(op!='='){
switch(op){
case'+':case'-':case'*':case'/':
Compute(op);break; //運算
default:cin.putback(op);//非操作符,迴流
cin>>operand;//入操作數
Enter(operand);break;//入棧操作數
}
cin>>op;//輸入操作符
}
cout<<s.Pop()<<endl;//最後出棧
Clear();//清空棧
}
};//!_classCalculator

㈡ 表達式求值 (棧的應用)前中後綴

表達式的分析與求值是編譯原理課程中極其重要的部分,主要用於最初的詞法分析。其表示方式有:前綴、中綴、後綴表示法。其數據結構可以使用一個堆棧來表示。具體的實現代碼,我以前使用的書籍是《C語言大全》,那上面就有完整的代碼,你可以參考。但是由於我已經很久沒有編寫編譯原理方面的程序了,所以我也無法親自給你編寫一個完整表達式分析求值的程序。只能夠給你提供一些思路和線索。

㈢ 棧的應用舉例:數制轉換,表達式求值

關於表達式的分析與求值是計算機軟體專業中「編譯原理」課程極其重要的部分,主要用於最初的詞法分析。其表示方式有:前綴、中綴、後綴表示法。其數據結構可以使用一個堆棧來表示。具體的實現代碼,我以前使用的書籍是《C語言大全》,那上面就有完整的、現成的代碼,可以供你參考運行。同時你還可以參考《編譯原理》相關的教材。
但是由於我已經很久沒有編寫編譯原理方面的程序了,況且編寫並親自調試通過該程序,難度還是比較大的。所以我也無法親自給你編寫一個完整表達式分析與求值的程序。只能夠給你提供一些思路和線索。
另外,關於不同數制之間的轉換問題,這個倒是不難解決,可以採用通常的演算法就是短除法,然後將每一次的余數採取「倒排」即可。例如:將十進制的 15 轉換為二進制。
2|15(1
--
2|7(1
-
2|3(1
-
2|1(1

-
0
則十進制的 15 為二進制的:1111。

㈣ 編譯原理 語義分析 算術表達式求值代碼

利用乘法先運算的性質,把壓入棧的乘法先運算最後再算加法就好了: #include #include #include using namespace std;const int MaxLen = 4096;char expr[MaxLen];int main(){stack num;cin.getline(expr, MaxLen);stringstream e(expr)

㈤ JAVA表達式求值

這個事情看似很簡單,寫起來很復雜!~建議你自己寫,如果有什麼疑問,大家一起探討一下阿

㈥ 如何將數據結構和演算法應用到實際之中

寫一些程序,尤其是比較底層的程序。就明白它們的用處了。
列舉下我們當初的作業(其實是老師從UC Santa Barbara\UC Berkley CS作業直接來題目)
(1)實現一個簡單的 TCP 傳輸層的協議機制
自己去設計協議,不用照搬 RFC 的標准,其實就是數據結構的用場。
需要考慮到數據包丟失(Loss)、損壞(Corruption)、亂序(Disorder)這樣的情況。
(2)實現操作系統的虛擬內存機制(基於Nachos系統)
如何去設計頁表。如何使用置換演算法。以及應用程序請求頁的時候,發生缺頁,從而導致的中斷如何處理。
(3)實現一個簡單的編譯器(MiniJava)
詞法:字元串匹配,表達式求值 等演算法;
語法:生成抽象語法樹;
語義:採用適當的設計模式(Visitor)來生成語義表、字典、然後轉化為目標代碼(可以是匯編、或者是類似的 Three-Address Code)
如果以上三個任務都完成並搞懂了,那麼恭喜:你不僅掌握了數據結構、演算法,而且也學習了計算機網路、操作系統、編譯原理中大部分的知識。

㈦ 數據結構編譯器表達式求值需求分析

要看你用什麼軟體了,在MATLAB 7.0中,直接輸5-2*sin(3-sqrt(4))+6/4回車就出來答案了

㈧ 編譯器的工作原理

編譯 是從源代碼(通常為高級語言)到能直接被計算機或虛擬機執行的目標代碼(通常為低級語言或機器語言)的翻譯過程。然而,也存在從低級語言到高級語言的編譯器,這類編譯器中用來從由高級語言生成的低級語言代碼重新生成高級語言代碼的又被叫做反編譯器。也有從一種高級語言生成另一種高級語言的編譯器,或者生成一種需要進一步處理的的中間代碼的編譯器(又叫級聯)。
典型的編譯器輸出是由包含入口點的名字和地址, 以及外部調用(到不在這個目標文件中的函數調用)的機器代碼所組成的目標文件。一組目標文件,不必是同一編譯器產生,但使用的編譯器必需採用同樣的輸出格式,可以鏈接在一起並生成可以由用戶直接執行的EXE,
所以我們電腦上的文件都是經過編譯後的文件。

㈨ 編譯原理 while 語句文法

while(條件)
{
.......;//語句
X++或者X--;//做自增或自減運算來達到循環的過程
}
while後面跟一堆小括弧,裡面的條件判斷,類似IF語句,當條件滿足時做以下語句的循環,條件不滿足後直接跳出循環;
例題:
int i=0;//初始化i=0
while(i<5)//i=0滿足判斷的條件,進入循環語句
{
i++;//做自增運算,當i+到5時跳出循環,因為i不小於5了
}
printf("%d",i);//此時i的值為5

㈩ 表達式求值

從演算法來說,要考慮中綴的運算符優先順序,括弧等,可以使用簡單語法制導翻譯,去看編譯原理書吧,從數據結構來說,可以使用二元樹和棧。使用二元樹就是先建立表達式的樹,然後後根遍歷即可。難點在建立樹。
使用棧的演算法也很多,說個好想的。假設表達式的字元來自輸入流in,建立棧A存放運算符,B存放結果,從in讀入一個操作數壓進B,讀入一個運算符壓進A,如此反復。
1.讀入一個元素e
2.如果e是操作數或者(,壓入B,跳轉到1
3.如果e是運算符(不包含括弧),跳轉到3.1
4.如果e是),跳轉到4.1
5.如果e是EOF,即輸入流結束,反復彈出A棧頂壓入B,直到A為空,演算法結束,B從棧底到棧頂的符號即為後綴表達式(需要把B翻個個兒^_^)

3.1.判斷A的棧定符號t,如果t不為(,且優先順序大於等於e,則彈出t壓入B,跳轉到4,如果t為空,即棧中為空,或其他情況直接把e壓入A,跳轉到1
4.1.彈出A的棧頂壓入到B,如此反復直到彈出的符號為(,(和)不要壓入B,跳轉到1

這是我臨時想的,可能還有bug,或描述不清的地方,如果上網搜的話應該有很多源代碼的,如果學過編譯原理的話還可以有更好的演算法,這個演算法沒考慮容錯性。

閱讀全文

與編譯器原理表達式求值相關的資料

熱點內容
linux軟raid性能 瀏覽:366
貼片機編程軟體下載 瀏覽:358
mooc大學樂學python答案 瀏覽:408
怎麼投訴途虎app 瀏覽:37
安卓重力感應怎麼關 瀏覽:720
我的世界ios怎麼建伺服器地址 瀏覽:759
伺服器埠ip都是什麼意思 瀏覽:262
華為主題軟體app怎麼下 瀏覽:840
我們的圖片能夠收藏加密嗎 瀏覽:979
mysql空值命令 瀏覽:213
python整點秒殺 瀏覽:882
怎麼樣互傳app 瀏覽:293
python分布式抓包 瀏覽:36
輕量級php論壇 瀏覽:342
如何查看應用存儲在哪個文件夾 瀏覽:436
app開發項目范圍怎麼寫 瀏覽:76
androidjms 瀏覽:843
彈珠連貫解壓 瀏覽:243
程序員的網課 瀏覽:904
廣東加密狗防拷貝公司 瀏覽:450