編譯原理課程設計與報告

2021-03-14 14:53:54 字數 4059 閱讀 7609

課程設計

課程名稱__ 編譯原理 _

題目名稱 pl/0語言的擴充

學生學院___ 計算機學院______

專業班級_ 軟體工程07級4班__

學號學生姓名

指導教師____ 李小妹________

2008 年 1 月 5 日

課程設計實驗報告

一、概述:

源語言: pl/0

目標語言: 目標**(生成的檔案字尾為*.cod)

實驗工具: borland c++builder 6

執行平台: windowsxp

目的:在分析理解乙個教學型編譯程式(如pl/0)的基礎上,對其詞法分析程式、語法分析程式和語義處理程式進行部分修改擴充。達到進一步了解程式編譯過程的基本原理和基本實現方法的目的。

要求:對pl/0作以下修改擴充:

基本內容

(1)擴充賦值運算:+= 和 -=

(2)擴充語句(pascal的for語句):

①for 《變數》:=《表示式》 to 《表示式》 do 《語句》

②for 《變數》:=《表示式》 downto 《表示式》 do 《語句》

其中,語句①的迴圈變數的步長為1,

語句②的迴圈變數的步長為-1。

選做內容

(1)增加運算:++ 和 --。

(2)增加型別:① 字元型別實數型別。

(3)擴充函式:① 有返回值和返回語句;② 有引數函式。

(4)增加一維陣列型別(可增加指令)。

(5)其他典型語言設施。

二、結構設計說明:

各功能模組描述

error()

出錯處理,列印出錯位置和錯誤編碼

getch()

漏掉空格,讀取乙個字元

getsym()

詞法分析,讀取乙個單詞

gen()

目標**生成過程,本過程用於把生成的目標**寫入目標**陣列,供後面的直譯器解釋執行

test()

測試當前單詞是否合法過程test

enter()

登陸符號表過程enter

position()

在符號表中查詢指定符號所在位置的函式position

vardeclaration()

變數宣告處理

listcode()

輸出目標**清單;

factor()

因子處理過程factor

term()

項處理過程term;

expression()

表示式處理過程

condition()

條件處理過程

statement()

語句處理過程

block()

編譯程式主體,語法分析過程

base()

通過靜態鏈求出資料區基位址的函式,

interpret ()

對目標**解釋執行過程

pl0編譯程式的結構

編譯程式的總體流程圖

詞法分析狀態轉換圖

. ○表示狀態,對應每個狀態編一段程式,每個狀態呼叫取字元程式,根據當前字元轉到不同的狀態,並做相應操作。

◎ 表示終態,已識別出乙個單詞

語法呼叫關係圖

主要成分描述

1.符號表

在編譯程式中符號表用來存放語言程式中出現的有關識別符號的屬性資訊,符號表中所登記的資訊在編譯的不同階段都要用到。

在語義分析中,符號表所登記的內容將用於語義檢查(如檢查乙個名字的使用和原先的說明是否一致)和產生中間**。

在目標**生成階段,當對符號名進行位址分配時,符號表是位址分配的依據。對乙個多遍掃瞄的編譯程式,不同遍所用的符號表也往往各有不同。因為每遍所關心的資訊各有差異。

一張符號表的每一項(或稱入口才包含兩大欄(或稱區段、字域),即名字欄(name) 資訊欄(information

資訊欄包含許多子欄和標誌位,用來記錄相應名字和種種不同屬性,由於查填符號表一般是通過匹配名字來寮現的,因此,名字欄也稱主欄。主欄的內容稱為關鍵字(key word)。

2.執行時儲存組織和管理

由於編譯時目標程式執行的資料空間大小已經規定,所以儲存組織屬於靜態儲存。

源程式的識別符號存放在table表中,目標**存放在code中,s是由解釋程式定義的一維整型陣列,是程式執行時的資料儲存空間。

3.語法分析方法

自頂向下的語法分析:

《程式》

《分程式》

《變數說明部分》 《語句》

var 《識別符號》 ; 《復合語句》

a begin 《語句》 end

《讀語句》

read ( 《識別符號》 ) a

4.中間**表示

對pl/0編譯程式的目標**的指令格式描述如下:

fla其中f代表功能碼,l表示層次差,a的含意對不同的指令有所區別,見下面對每條指令的解釋說明:

三、程式**:

擴充後修改的部分**

typedef enum {

nul, ident, number, plus, minus, times,

slash, oddsym, eql, neq, lss, leq,

gtr, geq, lparen, rparen, ***ma, semicolon,

period, be***es, beginsym, endsym, ifsym, thensym,

whilesym, writesym, readsym, dosym, callsym, constsym,

varsym, procsym, progsym,

plusbk, minusbk,

sqlparen,sqrparen,

inc, dec, elsesym, forsym, tosym, downtosym,

returnsym

symbol;

//新增sqlparen,sqrparen,inc,dec,elsesym,forsym,tosym,downtosym ,returnsym

char *symout[ ] = {

nul", "ident", "number", "plus", "minus", "times",

slash", "oddsym", "eql", "neq", "lss", "leq",

gtr", "geq", "lparen", "rparen", "***ma", "semicolon",

period", "be***es", "beginsym", "endsym", "ifsym", "thensym",

whilesym", "writesym", "readsym", "dosym", "callsym","constsym",

varsym", "procsym", "progsym",

plusbk", "minusbk",

sqlparen","sqrparen",

inc", "dec","elsesym", "forsym", "tosym", "downtosym",

returnsym"

新增"inc","dec","elsesym","forsym","tosym","downtosym"

//設定保留字名字

strcpy(kword[ 1],"begin");

strcpy(kword[ 2],"call");

strcpy(kword[ 3],"const");

strcpy(kword[ 4],"do");

strcpy(kword[ 5],"downto"); //downto

strcpy(kword[ 6],"else"); //else

strcpy(kword[ 7],"end");

strcpy(kword[ 8],"forfor

strcpy(kword[ 9],"if");

strcpy(kword[10],"odd");

編譯原理課程設計報告

課程設計報告 課程名稱編譯程式設計原理 課題名稱帶括號的四則混合運算 專業班級 學號姓名 指導教師 2014年 6 月 27日 湖南工程學院 課程設計任務書 課程名稱編譯程式設計原理 課題帶括號的四則混合運算 專業班級 學生姓名 學號指導老師 審批任務書下達日期 2014 年 6月 23日 任務完成...

編譯原理課程設計報告

編譯器的實現 學院 系 學生姓名 學號班級 同組人目錄 1 課設要求 1.1.實現原理 1.2.單詞符號及種別表 1.3.語法結構的定義 2 執行環境 3 總體設計思想 4 詳細設計思想 4.1.詞法分析主要演算法 4.2.語法分析主要演算法 4.3.語義分析主要演算法 5 流程框圖 6 函式相關說...

編譯原理課程設計報告

小組成員 張快學號 2011014260 此次課設我完成的工作主要有兩大不分,乙個是完成了詞法分析模組的一部分內容,還有就是把各個模組整合在一起,設計乙個mfc對話方塊程式。下面詳細介紹一下我的工作 nfa轉化為dfa,dfa最小化 詞法分析模組 nfa轉成dfa的主要工作是找出每個節點的閉包,我用...