第一篇:編譯原理語法分析實驗報告
實驗2:語法分析
1.實驗題目和要求
題目:語法分析程序的設計與實現(xiàn)。
實驗內(nèi)容:編寫語法分析程序,實現(xiàn)對算術表達式的語法分析。要求所分析算術表達式由如下的文法產(chǎn)生。
E?E?T|E?T|TT?T*F|T/F|F F?id|(E)|num實驗要求:在對輸入表達式進行分析的過程中,輸出所采用的產(chǎn)生式。方法1:編寫遞歸調(diào)用程序實現(xiàn)自頂向下的分析。方法2:編寫LL(1)語法分析程序,要求如下。
(1)編程實現(xiàn)算法4.2,為給定文法自動構造預測分析表。(2)編程實現(xiàn)算法4.1,構造LL(1)預測分析程序。
方法3:編寫語法分析程序實現(xiàn)自底向上的分析,要求如下。(1)構造識別所有活前綴的DFA。(2)構造LR分析表。
(3)編程實現(xiàn)算法4.3,構造LR分析程序。
方法4:利用YACC自動生成語法分析程序,調(diào)用LEX自動生成的詞法分析程序。實現(xiàn)(采用方法1)
1.1.步驟:
1)對文法消除左遞歸
E?TE'E'??TE'|?TE'|?T?FT'T'?*FT'|/FT'|?F?id|(E)|num
2)畫出狀態(tài)轉換圖
化簡得:
3)源程序
在程序中I表示id N表示num
1.2.例子:
a)例子1 輸入:I+(N*N)輸出:
b)例子2 輸入:I-NN 輸出:
第二篇:編譯原理實驗報告
編譯原理實驗報告
報告完成日期 2018.5.30
一. 組內(nèi)分工與貢獻介紹
二. 系統(tǒng)功能概述;
我們使用了自動生成系統(tǒng)來完成我們的實驗內(nèi)容。我們設計的系統(tǒng)在完成了實驗基本要求的前提下,進行了一部分的擴展。增加了聲明變量類型、類型賦值判定和聲明的變量被引用時作用域的判斷。從而使得我們的實驗結果呈現(xiàn)的更加清晰和易懂。
三. 分系統(tǒng)報告;
一、詞法分析子系統(tǒng)
詞法的正規(guī)式:
標識符
<字母>(<字母>|<數(shù)字字符>)* 十進制整數(shù)
0 |(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)* 八進制整數(shù) 0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)* 十六進制整數(shù) 0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)* 運算符和分隔符 +| * | / | > | < | = |(|)| <=|>=|==; 對于標識符和關鍵字: A5—〉 B5C5 B5—〉a | b |??| y | z C5—〉(a | b |??| y | z |0|1|2|3|4|5|6|7|8|9)C5|ε 綜上正規(guī)文法為: S—〉I1|I2|I3|A4|A5 I1—〉0|A1 A1—〉B1C1|ε C1—〉E1D1|ε D1—〉E1C1|ε
E1—〉0|1|2|3|4|5|6|7|8|9 B1—〉1|2|3|4|5|6|7|8|9 I2—〉0A2 A2—〉0|B2 B2—〉C2D2 D2—〉F2E2|ε E2—〉F2D2|ε
C2—〉1|2|3|4|5|6|7 F2—〉0|1|2|3|4|5|6|7 I3—〉0xA3 A3—〉B3C3 B3—〉0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f C3—〉(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)|C3|ε
A4—〉+ |-| * | / | > | < | = |(|)| <=|>=|==; A5—〉 B5C5 B5—〉a | b |??| y | z C5—〉(a | b |??| y | z |0|1|2|3|4|5|6|7|8|9)C5|ε
狀態(tài)圖
流程圖:
詞法分析程序的主要數(shù)據(jù)結構與算法
考慮到報告的整潔性和整體觀感,此處我們僅展示主要的程序代碼和算法,具體的全部代碼將在整體的壓縮包中一并呈現(xiàn)
另外我們考慮到后續(xù)實驗中,如果在bison語法樹生成的時候推不出目標的產(chǎn)生式時,我們設計了報錯提示,在這個詞的位置出現(xiàn)錯誤提示,將記錄切割出來的詞在code.txt中保存,并記錄他們的位置。
以下是我們的主要代碼:
進制的識別:
結果展示:
二、語法分析子系統(tǒng)
根據(jù)選擇的語法分析方法進行描述
我們使用了遞歸子程序發(fā),并且對原有的產(chǎn)生式進行了改寫,改寫后的結果如下: P→LP1|L L→S
S→id=E|{P}|if C then S | if C then S
1else S2 | while C do S1 C→E1C’
C’→>E2| E→int8E’| int10E’| int16E’| idE’|T E’→+T|-T||+TE’|-TE’ T→int8T’| int10T’| int16T’| idT’|F T’→*F|/F|*FT’|/FT’ F→(E)|int8|int10|int16|id 簡化的語法圖: S的語法圖: C的語法圖: E的語法圖: T的語法圖: F的語法圖: 流程圖: 語法分析子系統(tǒng)的主要數(shù)據(jù)結構與算法 我們采用了自動生成技術,同樣在這里也是展示主要的核心功能代碼,全部的代碼展示在壓縮包中: 我們在設計時,實現(xiàn)了產(chǎn)生式對應的字符串同時標識產(chǎn)生式定義的int值 輔助程序: 生成語法樹的程序: 1.樹節(jié)點: 2.創(chuàng)建新節(jié)點 3.創(chuàng)建實數(shù)類型新節(jié)點 4.創(chuàng)建標識符類型新節(jié)點 5.輸出語法樹 三、三地址碼生成器 算法的基本思想: 我們增加了聲明變量類型、類型賦值判定和聲明的變量被引用時作用域的判斷。從而使得我們的實驗結果呈現(xiàn)的更加清晰和易懂。 在報錯的時候,我們會呈現(xiàn)類型、作用域和賦值三種的問題的報錯信息。 流程圖: 算法展示: 四、實驗體會 這次實驗其實總的來說是讓我們更加清晰的理解到了我們所學的內(nèi)容。有時候我們上課聽講,課下復習寫作業(yè)的時候,其實看似掌握了所學內(nèi)容,但實際上并沒有親身體會的操作很難讓我們深刻的理解其中的相關意義。通過這次實驗,我們能夠從根源處了解到了我們所學的內(nèi)容,并且基于我們理解之后的輸出。比如詞法分析不能采用空格來區(qū)分單詞,因為存在加減乘除等運算符和分隔符,使用空格來區(qū)分可能會造成錯誤的分解。又比如我們再在程序設計中,常常體會到效率的重要性。影響詞法分析的效率的主要因素是各個狀態(tài)的分支如何規(guī)劃。如果每個進來的單詞都能在最短的時間和最少的匹配次數(shù)內(nèi)找到其入口,則效率將得到很大程度上的提高。所以由此我們產(chǎn)生了聲明變量類型、賦值和作用域的想法,將其放在最后來進行判斷,這樣可以提高整體的執(zhí)行效率。 另外,這次小組成員彼此不在一個班級,這樣從某一方面來說,也加強了我們互相快速熟識并團結協(xié)作的能力,有了這種體驗,我想我們在今后的生活中,面對這種情況的時候,將會變得更加有經(jīng)驗。 五、源程序 詞法分析器: 輸入結果: 輸出結果: 語義分析結果: 輸入: 第二組數(shù)據(jù)的輸入: 輸出: 三地址碼的輸入: 第二組數(shù)據(jù)的輸入: 輸出: 吉林大學計算機科學與技術學院實驗報告 計算機基礎實驗教學中心編制 姓名,學號:胡智超,53070108;陳玉娟,53070130;程明,53070109;張宇航,53070110 2007 級1班 實驗室:A209成績指導教師(簽字)(存檔) —————————————————————————————————————————————— ★ 實驗課程名稱: ★ 實驗 項 目: ★ 實驗 儀 器: ★ 實驗 要 求: ★ 實驗步驟、分析設計與結果: 設計題一:算術表達式的語法分析及語義分析程序設計。1.目的 通過設計、編制、調(diào)試一個算術表達式的語法及語義分析程序,加深對語法及語義分析原理的理解,并實現(xiàn)詞法分析程序對單詞序列的詞法檢查和分析。2.設計內(nèi)容及要求: 算術表達式的文法: 〈無符號整數(shù)〉∷= 〈數(shù)字〉{〈數(shù)字〉} 〈標志符〉∷= 〈字母〉{〈字母〉|〈數(shù)字〉} 〈表達式〉∷= [+|-]〈項〉{〈加法運算符〉〈項〉} 〈項〉∷= 〈因子〉{〈乘法運算符〉〈因子〉} 〈因子〉∷= 〈標志符〉|〈無符號整數(shù)〉|‘(’〈表達式〉‘)’ 〈加法運算符〉∷= +|- 〈乘法運算符〉∷= *|/ 選擇算符優(yōu)先分析方法完成以上任務,生成逆波蘭式的中間代碼; (1)寫出算術表達式的符合分析方法要求的文法,給出分析方法的思想,完成分析程序設計。 (2)編制好分析程序后,設計若干用例,上機測試并通過所設計的分析程序。 源代碼 #define _CRT_SECURE_NO_WARNINGS #include “stdio.h” #include “stdlib.h” #include int fflag[10] = { 0 };//標志第i個非終結符的FIRSTVT集是否已求出 int lflag[10] = { 0 };//標志第i個非終結符的LASTVT集是否已求出 int deal();//對輸入串的分析 int terminal_symbol(char c);//判斷字符c是否是終極符 int location(char c);//求字符c在算符優(yōu)先關系表中的下標 void out(int j, int k, char *s);//打印s棧 void firstvt(char c);//求非終結符c的FIRSTVT集 void lastvt(char c);//求非終結符c的LASTVT集 void table();//創(chuàng)建文法優(yōu)先關系表 char output[10];//存儲逆波蘭式 void main(){ int i, j, k = 0;printf(“請輸入文法規(guī)則數(shù):”);scanf(“%d”, &r);printf(“請輸入文法規(guī)則:n”);for(i = 0;i } for(i = 0;i } for(i = 0;i for(j = 0;st[i][j]!= '
第三篇:編譯原理--實驗報告(小編推薦)
第四篇:編譯原理課程設計_算術表達式的語法分析及語義分析程序設計(模版)