編譯原理實驗報告
CASN下載地址:https://download.csdn.net/download/eseszb/10502973
實驗1 編譯程式的分析與驗證
1.1實驗目的
瞭解編譯程式中LR分析表的作用以及語義加工程式的功能。
1.2實驗要求
在掌握編譯原理的基礎上,對編譯程式例項進行分析,通過編譯程式的執行,檢驗編譯程式輸出結果的正確性。理論聯絡實際,將所學知識用到實處,進而學會怎麼寫編譯程式。
1.3實驗內容
(1)驗證下述程式輸出結果的正確性:
while (a>b) do
begin
if m>=n then a:=a+1
else
while k=h do x:=x+2;
m:=n+x*(m+y)
end#~
(2)自行設計一程式進行正確性驗證,並按二元式序列的註釋及狀態棧STACK加工分析對應的符號棧內容。
實驗2 算數表示式的擴充
2.1實驗目的
掌握LR分析表的設計方法和語義加工程式的擴充。
2.2實驗要求
參照表示式LR分析表的設計方法,設計擴充後的算術表示式LR分析表,並對原語義加工程式進行修改,加入新新增的內容。
2.3實驗內容
(1)算術表示式文法擴充如下:
E->E+E|E-E|E*E|E/E|(E)|i
試根據該文法新增單詞“-”,“/”的內部定義以及重新設計LR分析表,並修改語義加工程式,最後驗證修改的結果。
(2)待驗證程式:
begin
a:=a+b-c*d/e;
while a<c do
while b<d do
while d<e do
if a<e then m:=n else m:=q;
end#~
2.4演算法設計
在實驗一中已給出編譯程式的全部程式碼,且能識別加、乘算數表示式。而本實驗只需根據識別加、乘算數表示式的設計方法來對算數表示式進行擴充以實現對減、除算數表示式的識別及分析。
(1)新增關鍵字減、除運算子的種別程式碼
#define sub 35 /* - */
#define div 37 /* / */
(2)重新構造算數表示式的LR分析表
static int action1[14][9]={
{3,-1,-1,-1,-1,2,-1,-1,1},
{-1,4,10,5,11,-1,-1,ACC,-1},
{3,-1,-1,-1,-1,2,-1,-1,6},
{-1,104,104,104,104,-1,104,104,-1},
{3,-1,-1,-1,-1,2,-1,-1,7},
{3,-1,-1,-1,-1,2,-1,-1,8},
{-1,4,10,5,11,-1,9,-1,-1},
{-1,101,101,5,11,-1,101,101,-1},
{-1,102,102,102,102,-1,102,102,-1},
{-1,103,103,103,103,-1,103,103,-1},
{3,-1,-1,-1,-1,2,-1,-1,12},
{3,-1,-1,-1,-1,2,-1,-1,13},
{-1,105,105,5,11,-1,105,105,-1},
{-1,106,106,106,106,-1,106,106,-1}
};
(3)在掃描演算法scan中增加對減、除運算子的識別
case '-': buf[count].sy1=sub; /* - */
count++;
break;
case '/': buf[count].sy1=div; /* / */
count++;
break;
(4)實現對減、除算術表示式的規約
case 105: E.pos=newtemp();
gen("-",sstack[ssp-2],sstack[ssp],E.pos+100);
ssp=ssp-2;
sstack[ssp].sy1=tempsy;
sstack[ssp].pos=E.pos;
sp1=sp1-3;
break;
case 106: E.pos=newtemp();
gen("/",sstack[ssp-2],sstack[ssp],E.pos+100);
ssp=ssp-2;
sstack[ssp].sy1=tempsy;
sstack[ssp].pos=E.pos;
sp1=sp1-3;
break;
(5)在測試字元是否是表示式中的值的test演算法中增加對減、除運算子的識別
case sub:
case div:
return 1;
default:
return 0;
實驗3 新增新的程式語句
3.1實驗目的
通過新增新的程式語句,全面瞭解一個語句的編譯程式設計過程。
3.2實驗要求
對新增的語句設計LR分析表及相應的處理程式,並將其新增到程式語句處理語句中。
3.3實驗內容
(1)將計數迴圈for語句的功能新增到編譯程式中。For語句的文法及每個產生式相應的語義子程式如下:
F1→for i:=E(1) {GEN(:=,E(1).PLACE,_,ENTRY(i);
F1.PLACE:=ENTRY(i);
F1.CHAIN:=NXQ;
GEN(j,_,_,0);
F1·QUAD:=NXQ}
F2→F1 step E(2) {F2.QUAD:=F1.QUAD;
F2.PLACE:=F1.PLACE;
GEN(+,F1.PLACE,E(2).PLACE,F1.PLACE);
BACKPATCH(F1.CHAIN,NXQ)}
F3→F2 until E(3) {F3.QUAD:=F2.QUAD;
q:=NXQ;
GEN(j≤,F2.PLACE,E(3).PLACE,q+2);
F3.CHAIN:=NXQ;
GEN(j,_,_,0)}
S→F3 do S(1) {先形成S(1)相應的四元式序列;
GEN(j,_,_,F3.QUAD);
BACKPATCH(S(1).CHAIN,F3.QUAD);
S.CHAIN:=F3.CHAIN}
(2)待驗證程式:
begin
for a:=1 to 8 do
begin
if m>=n then a:=a-1
else
while k=h do x:=x+2;
m:=n+x/(m-y);
end
end#~
3.4實驗說明
(1)實現時可將for語句的文法設計為一個LR分析表,然後將該文法的開始符看作程式語句LR分析表中的一個終結符,即像賦值語句一樣處理(當然仍要重新設計程式語句的LR分析表)。另一種方法就是直接將for語句的文法納入到程式語句文法中(即像if和while語句一樣處理),並重新設計程式語言的LR分析表。
(2)for語句中產生式的語義動作需要參考編譯程式中對if和while語句的處理部分做相應修改。
相關推薦
編譯原理實驗報告:自上而下語法分析
1. 實驗題目:自上而下語法分析 實驗目的 給出 PL/0 文法規範,要求編寫 PL/0 語言的語法分析程式。 通過設計、編制、除錯一個典型的自上而下語法分析程式,實現對詞法分析程式所提供的單詞序列進行語法檢查和結構分析,進一步掌握常用的語法分析方法。 選擇
編譯原理實驗報告一:PL0語言編譯器分析(PL0,詞法分析,語法分析,中間程式碼生成)
實驗報告一:PL0語言編譯器分析一、實驗目的 通過閱讀與解析一個實際編譯器(PL/0語言編譯器)的原始碼, 加深對編譯階段(包括詞法分析、語法分析、語義分析、中間程式碼生成等)和編譯系統軟體結構的理解,並達到提高學習興趣的目的。二、實驗要求(1) 要求掌握基本
編譯原理實驗報告
CASN下載地址:https://download.csdn.net/download/eseszb/10502973實驗1 編譯程式的分析與驗證1.1實驗目的瞭解編譯程式中LR分析表的作用以及語義加工程式的功能。1.2實驗要求在掌握編譯原理的基礎上,對編譯程式例項進行分析
編譯原理實驗報告三:語法分析(PL0,詞法分析,語法分析,中間程式碼生成)
實驗報告三:語法分析一、實驗目的 通過設計、開發一個S語言的語法分析程式,實現對源程式的語法檢查和結構分析,加深對相關課堂教學內容的理解,提高語法分析方法的實踐能力。二、實驗要求根據下列S語言的語法規則,進行語法分析(1) <程式>→[<常量說明
編譯原理實驗:實驗一 簡單詞法分析程序設計(必修)(Python實現)
it is 括號 ali 鍵盤輸入 優化 沒有 mce constant 是否 一、實驗目的 了解詞法分析程序的基本構造原理,掌握詞法分析程序的手工構造方法。 二、實驗內容 1、了解編譯程序的詞法分析過程。 2、根據PASCAL語言的說明語句形式,用手工方法構造一個對說明語
編譯原理實驗二:LL(1)語法分析器
處理 字符 編號 析構 idt public 輸入 課本 字母 一、實驗要求 不得不想吐槽一下編譯原理的實驗代碼量實在是太大了,是編譯原理撐起了我大學四年的代碼量... 這次實驗比上次要復雜得多,涵蓋的功能也更多了,我覺得這次實驗主要的難點有兩個(其實都是難點
編譯原理實驗 —— 詞法分析器
// Lexical_Analysis.cpp : 定義控制檯應用程式的入口點。 // #include "stdio.h" #include "stdlib.h" #include "string.h" #include "iostream" using namespace std; //詞法分析程式
編譯原理實驗 —— 語法分析器
/* 待分析的簡單語言的語法 用擴充的BNF表示如下: ⑴<程式>::=begin<語句串>end ⑵<語句串>::=<語句>{;<語句>} ⑶<語句>::=<賦值語句> ⑷<賦值語句>::=ID:=<
編譯原理實驗四 語法分析程式
實驗四 語法分析程式 (一)學習經典的語法分析器(1學時) 一、實驗目的 學習已有編譯器的經典語法分析源程式。 二、實驗任務 閱讀已有編譯器的經典語法分析源程式,並測試語法分析器的輸出。 三、實驗內容 (1)選擇一個編譯器,如:TINY,其它編譯器也可(需自備原始碼)。 (2)閱讀語法分
編譯原理實驗
一、實驗目的 學習使用詞法分析程式自動構造工具 Flex 熟悉LEX源程式語法 掌握詞法分析程式的自動構造方法 二、實驗平臺 Windows + Flex 三、基礎內容 實現以下步驟, 掌握Flex的工作過程 i. 構造 LEX 源程式, 例如
編譯原理實驗 簡單詞法分析程式的設計
一、實驗目的 瞭解詞法分析程式的基本構造原理,掌握簡單詞法分析程式的構造方法。 二、實驗內容 根據PASCAL語言的說明語句結構,設計一個對PASCAL語言常量說明語句進行詞法分析的簡單程式,並用C、C++或Java語言程式設計實現。要求程式能夠對從鍵盤輸入或從檔案讀入
編譯原理 實驗3 語法分析
語法分析 一、 實驗目的 算術表示式的文法可以是(你可以根據需要適當改變): E→E+E|E-E|E*E|E/E|(E)|i 根據算符優先分析法,將表示式進行語法分析,判斷一個表示式是否正確。 二、 實驗環境 作業系統:window xp 編寫環境
哈工大編譯原理實驗1——詞法分析
設計實現類高階語言的詞法分析器,基本功能如下: (1) 能識別以下幾類單詞: 識別符號(由大小寫字母、數字以及下劃線組成,但必須以字母或者下劃線開頭) 關鍵字(①型別關鍵字:整型、浮點型、布林型、記錄型;②分支結構中的if和else;③迴圈結構中的do和while;④
編譯原理 實驗一 詞法分析之預處理
import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public cl
哈工大編譯原理實驗2——語法分析
此次試驗由於指導書的文法比較簡單,且沒有消除左遞迴(我懶),因此使用學長的文法,並加上了陣列判斷。 S -> func funcs funcs -> func funcs funcs -> $ func -> type IDN ( args ) f
編譯原理實驗---詞法分析
轉自 一、實驗概述 1.1、實驗要求 選擇計算機高階語言之一-----C語言,運用恰當的此法分析技術線路,設計和實現其對應的詞法分析器。 建議:程式語言,選擇《計算機程式設計》課程所採用的語言。 提示:技術線路選擇如下兩種之一: 正則式→NFA→DFA→
編譯原理實驗一:詞法分析
實驗一:詞法分析程式 一、實驗目的 通過設計編制除錯一個具體的詞法分析程式,加深對詞法分析原理的理解。並掌握在對程式設計語言源程式進行掃描過程中將其分解為各類單詞的詞法分析方法。 編制一個讀單詞過程,從輸入的源程式中,識別出各個具有獨立意義的單詞,即基
哈工大編譯原理實驗一詞法分析
這是我自己寫的一個比較簡陋的詞法分析吧 但也是耗費了心血的 還是放在這裡希望對你們有用~~ 實驗指導書裡面的圖都是我用心畫的哈哈哈 實驗報告:http://download.csdn.net/download/qq_32285991/10125099 實驗要求: 實驗
編譯原理實驗(一)之詞法分析
詞法分析 (1)參考附錄1設計一個簡單語言的詞法分析程式,要求能夠處理註釋、換行回車、部分複合運算子(如>=)。 (2)設計並實現含多條簡單賦值語句的語法分析程式,要求有一定的出錯提示與錯誤恢復功能。 (參考附錄2) 附錄1: 例C源程式段: ma
編譯原理實驗(二)之語法分析
採用實驗1的簡單語言,設計並實現含多條簡單賦值語句的語法分析程式,要求採用算符優先的分析演算法。 注意與實驗1、2的銜接。 using System; using System.Collections.Generic; using System.IO; usin