




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、設計題一:算術表達式的語法分析及語義分析程序設計。1.目的通過設計、編制、調試一個算術表達式的語法及語義分析程序,加深對語法及語義分析原理的理解,并實現詞法分析程序對單詞序列的詞法檢查和分析。2.設計內容及要求:算術表達式的文法:無符號整數數字數字標志符字母字母數字表達式項加法運算符項項因子乘法運算符因子因子標志符無符號整數(表達式)加法運算符乘法運算符選擇算符優先分析方法完成以上任務,生成逆波蘭式的中間代碼;(1) 寫出算術表達式的符合分析方法要求的文法,給出分析方法的思想,完成分析程序設計。(2) 編制好分析程序后,設計若干用例,上機測試并通過所設計的分析程序。源代碼#define _CR
2、T_SECURE_NO_WARNINGS#include stdio.h#include stdlib.h#include using namespace std;char data2020; /算符優先關系char s100; /模擬符號棧s char lable20; /文法終極符集char input100; /文法輸入符號串char str2010; /用于輸入串的分析int k,j;char a,q;int r; /文法規則個數int r1;int m, n, N; /轉化后文法規則個數char st1030; /用來存儲文法規則char first1010; /文法非終結符FIRS
3、TVT集char last1010; /文法非終結符LASTVT集int fflag10 = 0 ; /標志第i個非終結符的FIRSTVT集是否已求出int lflag10 = 0 ; /標志第i個非終結符的LASTVT集是否已求出int deal(; /對輸入串的分析int terminal_symbol(char c; /判斷字符c是否是終極符int location(char c; /求字符c在算符優先關系表中的下標void out(int j, int k, char *s; /打印s棧void firstvt(char c; /求非終結符c的FIRSTVT集void lastvt(c
4、har c; /求非終結符c的LASTVT集void table(; /創建文法優先關系表char output10;/存儲逆波蘭式void main(int i, j, k = 0;printf(請輸入文法規則數:;scanf(%d, &r;printf(請輸入文法規則:n;for (i = 0; i scanf(%s, sti; /存儲文法規則,初始化FIRSTVT集和LASTVT集*/ firsti0 = 0; /*firsti0和lasti0分別表示sti0非終極符的FIRSTVT集和LASTVT集中元素的個數*/lasti0 = 0;for (i = 0; i / 判斷文法是否合法
5、for (j = 0; stij != 0; j+if (sti0Zprintf(文法error!n;exit(-1;if (stij = A&stij = A&stij + 1 = Zprintf(文法error!n;exit(-1;for (i = 0; i / for (j = 0; stij != 0; j+if (stijZ & stij != -&stij != &stij != |lablek+ = stij;lablek = #;lablek + 1 = 0;table(;/printf(FIRST集為:n; /輸出每個非終結符的FIRST集for (i = 0; i prin
6、tf(%c: , sti0;for (j = 0; j printf(%c , firstij + 1;printf(n;printf(LAST集為:n; /輸出每個非終結符的LAST集for (i = 0; i printf(%c: , sti0;for (j = 0; j printf(%c , lastij + 1;printf(n;printf(算符優先分析表如下:n;for (i = 0; lablei != 0; i+printf(t%c, lablei;printf(n;for (i = 0; i printf(%ct, lablei;for (j = 0; j printf(%
7、ct, dataij;printf(n;printf(請輸入文法輸入符號串以#結束:;scanf(%s, input;deal(;cout 逆波蘭式為:;for (i = 0; lablei != 0; i+cout outputi 0;/cout ;elsetextxy = stij;y+;textxy = 0;x+;y = 0;r1 = x;/printf(轉化后的文法為:n;for (i = 0; i / 輸出轉化后的文法規則串 printf(%sn, texti;for (i = 0; i /* 求每個終結符的推導結果 ( 去掉 - 后的轉化文法,用于最后的規約 */ stri0 =
8、texti0;for (j = 3, l = 1; textij != 0; j+, l+stril = textij;stril = 0;for (i = 0; i for (j = 1; textij + 1 != 0; j+if (terminal_symbol(textij & terminal_symbol(textij + 1m = location(textij;n = location(textij + 1;datamn = =;if (textij + 2 != 0&terminal_symbol(textij & terminal_symbol(textij + 2 & !
9、terminal_symbol(textij + 1m = location(textij;n = location(textij + 2;datamn = =;if (terminal_symbol(textij & !terminal_symbol(textij + 1/終結符和非終結符相接,用后于關系填表for (k = 0; k if (stk0 = textij + 1break;m = location(textij;for (t = 0; t n = location(firstkt + 1;datamn = ;m = location(#;/#后于所有的終結符規約for (t
10、= 0; t n = location(first0t + 1;datamn = ;datann = =;void firstvt(char c /求FIRSTVT集int i, j, k, m, n;for (i = 0; i / 找出是第 i 個非終結符 if (sti0 = cbreak;if (fflagi = 0n = firsti0 + 1;m = 0;doif (m = 2 | stim = |if (terminal_symbol(stim + 1firstin = stim + 1;n+;elseif (terminal_symbol(stim + 2firstin = st
11、im + 2;n+;if (stim + 1 != cfirstvt(stim + 1;for (j = 0; j if (stj0 = stim + 1break;for (k = 0; k int t;for (t = 0; t if (firstit = firstjk + 1break;if (t = nfirstin = firstjk + 1;n+;m+; while (stim != 0;firstin = 0;firsti0 = -n;fflagi = 1;void lastvt(char c /求LASTVT集int i, j, k, m, n;for (i = 0; i i
12、f (sti0 = cbreak;if (lflagi = 0n = lasti0 + 1;m = 0;doif (stim + 1 = 0 | stim + 1 = |if (terminal_symbol(stimlastin = stim;n+;elseif (terminal_symbol(stim - 1lastin = stim - 1;n+;if (stim != clastvt(stim;for (j = 0; j if (stj0 = stimbreak;for (k = 0; k int t;for (t = 0; t if (lastit = lastjk + 1brea
13、k;if (t = nlastin = lastjk + 1;n+;m+; while (stim != 0;lastin = 0;lasti0 = -n;lflagi = 1;int deal(int i, j;int size = 0;/int x, y;int z; /輸入串的長度k = 1;sk = #; /棧置初值for (i = 0; inputi != 0; i+; /計算輸入串的長度z = i-;/i = 0;while (a = inputi != 0/a表示要輸入的字符if (terminal_symbol(skj = k;elsej = k - 1;x = locatio
14、n(sj;y = location(a;if (dataxy = if (lablex != outputsize+ = lablex; /將要規約的終結符存起來out(1, k, s;printf(%c, a;out(i + 1, z, input;printf(規約n;doq = sj;if (terminal_symbol(sj - 1j = j - 1;else j = j - 2;x = location(sj;y = location(q; while (dataxy != ;int m, n, N;for (m = j + 1; m = k; m+for (N = 0; N fo
15、r (n = 1; strNn != 0; n+if (!terminal_symbol(sm & !terminal_symbol(strNnif (terminal_symbol(sm + 1 & terminal_symbol(strNn + 1 & sm + 1 = strNn + 1sj + 1 = strN0;break;elseif (terminal_symbol(smif (sm = strNnsj + 1 = strN0;break;k = j + 1;if (k = 2 & a = #out(1, k, s;printf(%c, a;out(i + 1, z, input;printf(結束n;printf(規約成功!n;return 1; /輸入串符合文法的定義elseif (dataxy = | dataxy = = /移進out(1, k, s;printf(%c, a;out(i + 1, z, input;printf(移進n;k+;sk = a;i+;elseprintf(n規約失敗n;return 0;printf(n規約失敗n;/return 0;void out(int j, int k, char *sint n = 0;int i;for (i = j; i = k;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 東坡成就介紹課件
- 上海市奉賢區2025屆高三下學期二模試題 歷史 含解析
- 專業職業課件
- 合伙合同與終止合同
- 遼寧省沈陽市五校協作體2024-2025學年高考模擬試卷(1)語文試題含解析
- 山東理工大學《數據結構中俄》2023-2024學年第一學期期末試卷
- 山東省青島市第十六中學2025年重慶一中初三4月月考物理試題含解析
- 銷售合同書范文
- 店鋪租賃合同模板
- 云南省德宏市重點中學2025屆初三5月模擬考試自選試題含解析
- 考古發掘中文物的采集與保存課件
- 小學四年級地方課程安全教育教案泰山出版社
- 化學性及藥物性頜骨骨髓炎
- 神奇的植物王國課件
- 員工崗位技能考核評定表
- 項目部安全生產事故應急預案
- 垂體瘤-PPT課件
- 鉆井井控裝置
- 贛美版(江西)小學四年級美術下全冊教案
- 12隊淘汰賽_對陣表
- 我國城市馬拉松賽事發展現狀分析
評論
0/150
提交評論