![編譯技術(shù)第5次上機內(nèi)容解析_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-4/21/84583862-9e1a-4041-a2a4-1b3c2eae6c2d/84583862-9e1a-4041-a2a4-1b3c2eae6c2d1.gif)
![編譯技術(shù)第5次上機內(nèi)容解析_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-4/21/84583862-9e1a-4041-a2a4-1b3c2eae6c2d/84583862-9e1a-4041-a2a4-1b3c2eae6c2d2.gif)
![編譯技術(shù)第5次上機內(nèi)容解析_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-4/21/84583862-9e1a-4041-a2a4-1b3c2eae6c2d/84583862-9e1a-4041-a2a4-1b3c2eae6c2d3.gif)
![編譯技術(shù)第5次上機內(nèi)容解析_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-4/21/84583862-9e1a-4041-a2a4-1b3c2eae6c2d/84583862-9e1a-4041-a2a4-1b3c2eae6c2d4.gif)
![編譯技術(shù)第5次上機內(nèi)容解析_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-4/21/84583862-9e1a-4041-a2a4-1b3c2eae6c2d/84583862-9e1a-4041-a2a4-1b3c2eae6c2d5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、 編譯技術(shù)第5次上機內(nèi)容 目的:充分理解語義分析的方法及相關(guān)語義計算的執(zhí)行時機。 要求: 1以S屬性的語法制導(dǎo)定義為基礎(chǔ),將下表的語義規(guī)則嵌套在語法分析的過程中,即實現(xiàn)語法制導(dǎo)的翻譯過程。 產(chǎn) 生 式 語 義 規(guī) 則 print (E.val) E n L ? E.val := E.val + T.val ? E E+ T 1 1 E.val := T.val TE ? T.val := T.val * F.val F* T ?T 以詞法分析和語法分析部分的上機結(jié)果為基礎(chǔ)添加語義分析部分。即以LR文法為基礎(chǔ)。當(dāng)進(jìn)行產(chǎn)生式歸約時執(zhí)行對應(yīng)的語義動作。 3輸入: 5+3+8*2 輸出:24 4 若輸
2、入有誤,如:3+2 則應(yīng)提示:重新輸入! 5 由于輸入串是具體的數(shù)值,因此應(yīng)調(diào)用相應(yīng)的詞法分析的功能。 / Expression.cpp : Defines the entry point for the console application. / #include stdafx.h #include conio.h #include #include #include using namespace std; #define L 0 #define E 1 #define T 2 #define E_ 3 #define T_ 4 #define F 6 #define digit 7 /
3、 數(shù)字 #define add 8 / 左括號 #define mul 9 / 右括號 #define lb 10 #define rb 11 int nStackPtr; int Stack100; / 棧 void guiyue(stack void Push(int n) nStackPtr +; StacknStackPtr = n; void Pop() nStackPtr-; void PrintStack() int i; for (i = nStackPtr; i = 0; i-) if (Stacki = E) printf(E ); if (Stacki = E_ ) pr
4、intf(E ); if (Stacki = T ) printf(T ); if (Stacki = T_ ) printf(T ); if (Stacki = F) printf(F ); if (Stacki = digit) printf(digit ); if (Stacki = add) printf(+ ); if (Stacki = mul) printf(* ); if (Stacki = lb) printf( ); if (Stacki = rb) printf() ); printf( ); / / 利用棧來分析表達(dá)式串,判定表達(dá)式串是否正確 / / int main(
5、int argc, char* argv) char strInput100; / 存放表達(dá)式串 bool bResult; int nInputPtr; nStackPtr = -1; nInputPtr = 0; bResult = true; / 輸入表達(dá)式串,存放在 strInput中 牰湩晴尨請輸入表達(dá)式串:); scanf(%s,strInput); Push(E); PrintStack(); while (bResult nInputPtr+; else bResult = false; PrintStack(); break; case add: if (strInputnI
6、nputPtr = +) Pop(); nInputPtr+; else bResult = false; PrintStack(); break; case mul: if (strInputnInputPtr = *) Pop(); nInputPtr+; else bResult = false; PrintStack(); break; case lb: if (strInputnInputPtr = () Pop(); nInputPtr+; else bResult = false; PrintStack(); break; case rb: if (strInputnInputP
7、tr = ) Pop(); nInputPtr+; else bResult = false; PrintStack(); break; default: bResult = false; break; 晩?剢獥汵?映污敳?牰湩晴尨表達(dá)式有問題了n); 汥敳瀠楲瑮?表達(dá)式?jīng)]問題!n); /以上是詞法、語法分析代碼 /- /以下是語義分析代碼 stack state; stack value; int i=0; int size=strlen(strInput); for(i=0;i=0 value.push(strInputi-0); if(i!=(size-1) guiyue(state,v
8、alue,strInputi+1); else guiyue(state,value,#); else if(strInputi=+) state.push(add); else if(strInputi=*) state.push(mul); else if(strInputi=() state.push(lb); else if(strInputi=) state.push(rb); if(i!=(size-1) guiyue(state,value,strInputi+1); else guiyue(state,value,#); / printf(Hello World!n); ret
9、urn 0; void guiyue(stack if(nex=0 else if(nex=#) next=0; else switch(nex) case +: next=add; break; case *: next=mul; break; case (: next=lb; break; case ): next=rb; break; stack state1=state; stack value1=value; int top_s1,top_s2; int top_v1; int top=state.top(); bool flag=true; while(flag) switch(s
10、tate.top() case digit: state.pop(); state.push(F); state1=state; break; case F: if(state.size()=3) state1.pop(); top_s1=state1.top(); state1.pop(); top_s2=state1.top(); state1.pop(); if(top_s1=mul state=state1; value1.pop(); top_v1=value1.top(); value1.pop(); value1.push(top_v1*value.top(); value=va
11、lue1; else state.pop(); state.push(T); state1=state; else state.pop(); state.push(T); state1=state; break; case T: if(next=mul) flag=false; else if(state.size()=3) state1.pop(); top_s1=state1.top(); state1.pop(); top_s2=state1.top(); state1.pop(); if(top_s1=add state=state1; value1.pop(); top_v1=value1.top(); value1.pop(); value1.push(top_v1+value.top(); value=value1; else state.pop(); state.push(E); state1=state; else state.pop(); state.push(E); state1=state; break; case E: if(next=add|next=rb) flag=false; else if(state.size()=1 state.push(L); printf
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025北京房屋租賃合同范本(經(jīng)經(jīng)紀(jì)機構(gòu)代理成交版)
- 委托中介房屋租賃合同書
- 租車牌范本合同
- 2025公司向銀行借款合同范本
- 2025正規(guī)裝修購銷合同范文
- 2025年金屬基超硬材料項目規(guī)劃申請報告模范
- 2025年計算器及貨幣專用設(shè)備項目提案報告模板
- 2025年驗孕棒項目提案報告模范
- 2025年奧運會直播項目申請報告
- 2025年非金屬廢料和碎屑項目申請報告
- 二零二五版電力設(shè)施維修保養(yǎng)合同協(xié)議3篇
- 最經(jīng)典凈水廠施工組織設(shè)計
- VDA6.3過程審核報告
- 2024-2030年中國并購基金行業(yè)發(fā)展前景預(yù)測及投資策略研究報告
- 2024年湖南商務(wù)職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫帶答案
- 骨科手術(shù)中常被忽略的操作課件
- 《湖南師范大學(xué)》課件
- 2024年全國各地中考試題分類匯編:作文題目
- 2024年高壓電工操作證考試復(fù)習(xí)題庫及答案(共三套)
- 《糖拌西紅柿 》 教案()
- 工程設(shè)計費取費標(biāo)準(zhǔn)
評論
0/150
提交評論