c語(yǔ)言編譯器前端的設(shè)計(jì)與實(shí)現(xiàn)課程設(shè)計(jì)_第1頁(yè)
已閱讀1頁(yè),還剩24頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p>  軟硬件專(zhuān)業(yè)綜合課程設(shè)計(jì)總結(jié)報(bào)告</p><p>  題目: C語(yǔ)言編譯器前端的設(shè)計(jì)與實(shí)現(xiàn) </p><p>  姓 名: </p><p>  學(xué) 號(hào): </p><p>  專(zhuān) 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) </p><p>  指導(dǎo)

2、教師: </p><p>  起止日期: 12.11.26—13.01.20 </p><p>  計(jì) 算 機(jī) 與 信 息 工 程 學(xué) 院</p><p>  軟硬件專(zhuān)業(yè)綜合課程設(shè)計(jì)任務(wù)書(shū)</p><p>  C語(yǔ)言編譯器前端的設(shè)計(jì)與實(shí)現(xiàn)</p><p>  摘 要:編譯器是程序員使用的關(guān)鍵

3、工具,程序員每天都在使用編譯器,并且非常依賴(lài)于其正確性和可靠性。編譯器作為廣大IT從業(yè)者必須接觸的系統(tǒng)軟件,它的設(shè)計(jì)本身又是一個(gè)極其龐大的工程。編譯器相關(guān)的各項(xiàng)技術(shù)經(jīng)過(guò)近幾十年的發(fā)展,已經(jīng)日臻成熟,然而編譯器構(gòu)造原理和技術(shù)依然是計(jì)算機(jī)科學(xué)中理論與實(shí)踐相結(jié)合的最好典范。</p><p>  本文首先介紹了C語(yǔ)言及C語(yǔ)言編譯器的發(fā)展歷程,其次對(duì)本次開(kāi)發(fā)所用到的工具Visual Studio C++2005以及面向?qū)ο?/p>

4、的程序設(shè)計(jì)方法做一下簡(jiǎn)單介紹。最后重點(diǎn)介紹了編譯器前端的詳細(xì)開(kāi)發(fā)過(guò)程,分為三個(gè)部分分別闡述:詞法分析器的設(shè)計(jì),語(yǔ)法分析器的設(shè)計(jì),語(yǔ)義分析部分。每個(gè)部分又分別從總體框架,詳細(xì)流程,重點(diǎn)數(shù)據(jù)結(jié)構(gòu)和函數(shù),以及與其他部分的接口等方面予以闡述。由于C語(yǔ)言本身的復(fù)雜性,很難面面俱到實(shí)現(xiàn)所有標(biāo)準(zhǔn)定義,所以本次設(shè)計(jì)只象征性的選擇部分具有代表性的功能。在本文的第四章詳細(xì)給出了此次設(shè)計(jì)所實(shí)現(xiàn)的功能和語(yǔ)法規(guī)范,同時(shí)也給出了編譯器的運(yùn)行方式。</p>

5、;<p>  關(guān)鍵詞:編譯器前端、C源程序、面向?qū)ο蟪绦蛟O(shè)計(jì)方法、VC++</p><p><b>  目 錄</b></p><p><b>  摘要I</b></p><p><b>  第1章 緒論1</b></p><p>  1.1 C語(yǔ)言及編譯器概

6、述1</p><p>  1.2 C編譯器設(shè)計(jì)思想1</p><p>  1.3 開(kāi)發(fā)工具的選用及介紹2</p><p>  1.4 論文組織結(jié)構(gòu)3</p><p>  第2章 C語(yǔ)言詞法分析器總體分析與設(shè)計(jì)4</p><p>  2.1 系統(tǒng)設(shè)計(jì)目標(biāo)與功能分析4</p><p> 

7、 2.2 詞法分析4</p><p>  2.3 語(yǔ)法分析4</p><p>  2.3.1自頂向下的語(yǔ)法分析5</p><p>  2.3.2自底向上的語(yǔ)法分析5</p><p>  2.4 語(yǔ)義分析6</p><p><b>  2.5 符號(hào)表6</b></p>&l

8、t;p>  2.6 類(lèi)型檢查7</p><p>  第3章 系統(tǒng)詳細(xì)設(shè)計(jì)8</p><p>  3.1 系統(tǒng)設(shè)計(jì)基本思路8</p><p>  3.2 詞法分析模塊設(shè)計(jì)8</p><p>  3.3 語(yǔ)法分析模塊設(shè)計(jì)11</p><p>  3.4 語(yǔ)義分析模塊設(shè)計(jì)14</p><

9、p>  第4章 結(jié)束語(yǔ)16</p><p><b>  參考文獻(xiàn)16</b></p><p><b>  附錄:</b></p><p>  附錄1:詞法分析核心代碼..........................................................................

10、..................17</p><p>  附錄2:語(yǔ)法分析核心代碼............................................................................................18</p><p><b>  第1章 緒論</b></p><p>  

11、1.1 C語(yǔ)言及編譯器概述</p><p>  C語(yǔ)言是在70年代初問(wèn)世的。一九七八年由美國(guó)電話(huà)電報(bào)公司(AT&T)貝爾實(shí)驗(yàn)室正式發(fā)表了C語(yǔ)言。同時(shí)由B.W.Kernighan和D.M.Ritchit合著了著名的“THE C PROGRAMMING LANGUAGE”一書(shū)。通常簡(jiǎn)稱(chēng)為《K&R》,也有人稱(chēng)之為《K&R》標(biāo)準(zhǔn)。但是,在《K&R》中并沒(méi)有定義一個(gè)完整的標(biāo)準(zhǔn)C語(yǔ)言,后來(lái)由美

12、國(guó)國(guó)家標(biāo)準(zhǔn)學(xué)會(huì)在此基礎(chǔ)上制定了一個(gè)C 語(yǔ)言標(biāo)準(zhǔn),于一九八三年發(fā)表。通常稱(chēng)之為ANSI C。C語(yǔ)言是一種結(jié)構(gòu)化語(yǔ)言。它層次清晰,便于按模塊化方式組織程序,易于調(diào)試和維護(hù)。C語(yǔ)言的表現(xiàn)能力和處理能力極強(qiáng)。它不僅具有豐富的運(yùn)算符和數(shù)據(jù)類(lèi)型,便于實(shí)現(xiàn)各類(lèi)復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。它還可以直接訪(fǎng)問(wèn)內(nèi)存的物理地址,進(jìn)行位(bit)一級(jí)的操作。由于C語(yǔ)言實(shí)現(xiàn)了對(duì)硬件的編程操作,因此C語(yǔ)言集高級(jí)語(yǔ)言和低級(jí)語(yǔ)言的功能于一體。既可用于系統(tǒng)軟件的開(kāi)發(fā),也適合于應(yīng)用軟件

13、的開(kāi)發(fā)。此外,C語(yǔ)言還具有效率高,可移植性強(qiáng)等特點(diǎn)。因此廣泛地移植到了各類(lèi)各型計(jì)算機(jī)上,從而形成了多種版本的C語(yǔ)言。</p><p>  編譯是從源代碼(通常為高階語(yǔ)言)到能直接被計(jì)算機(jī)或虛擬機(jī)執(zhí)行的目標(biāo)代碼(通常為低階語(yǔ)言或機(jī)器語(yǔ)言)的翻譯過(guò)程。然而,也存在從低階語(yǔ)言到高階語(yǔ)言的編譯器,這類(lèi)編譯器中用來(lái)從由高階語(yǔ)言生成的低階語(yǔ)言代碼重新生成高階語(yǔ)言代碼的又被叫做反編譯器。也有從一種高階語(yǔ)言生成另一種高階語(yǔ)言的編

14、譯器,或者生成一種需要進(jìn)一步處理的的中間代碼的編譯器(又叫級(jí)聯(lián))。</p><p>  典型的編譯器輸出是由包含入口點(diǎn)的名字和地址, 以及外部調(diào)用(到不在這個(gè)目標(biāo)文件中的函數(shù)調(diào)用)的機(jī)器代碼所組成的目標(biāo)文件。一組目標(biāo)文件,不必是同一編譯器產(chǎn)生,但使用的編譯器必需采用同樣的輸出格式,可以鏈接在一起并生成可以由用戶(hù)直接執(zhí)行的可執(zhí)行程序。</p><p>  1.2 C編譯器前端設(shè)計(jì)思想<

15、/p><p>  一個(gè)編譯器的前端設(shè)計(jì)主要工作過(guò)程可以概括為以下幾個(gè)步驟:</p><p><b>  (1)詞法分析</b></p><p>  詞法分析器根據(jù)詞法規(guī)則識(shí)別出源程序中的各個(gè)記號(hào)(token),每個(gè)記號(hào)代表一類(lèi)單詞(lexeme)。源程序中常見(jiàn)的記號(hào)可以歸為幾大類(lèi):關(guān)鍵字、標(biāo)識(shí)符、字面量和特殊符號(hào)。詞法分析器的輸入是源程序,輸出是識(shí)

16、別的記號(hào)流。詞法分析器的任務(wù)是把源文件的字符流轉(zhuǎn)換成記號(hào)流。本質(zhì)上它查看連續(xù)的字符然后把它們識(shí)別為“單詞”。</p><p><b>  (2)語(yǔ)法分析</b></p><p>  語(yǔ)法分析器根據(jù)語(yǔ)法規(guī)則識(shí)別出記號(hào)流中的結(jié)構(gòu)(短語(yǔ)、句子),并構(gòu)造一棵能夠正確反映該結(jié)構(gòu)的語(yǔ)法樹(shù)。</p><p><b>  (3)語(yǔ)義分析</b&

17、gt;</p><p>  語(yǔ)義分析器根據(jù)語(yǔ)義規(guī)則對(duì)語(yǔ)法樹(shù)中的語(yǔ)法單元進(jìn)行靜態(tài)語(yǔ)義檢查,如果類(lèi)型檢查和轉(zhuǎn)換等,其目的在于保證語(yǔ)法正確的結(jié)構(gòu)在語(yǔ)義上也是合法的。</p><p>  本系統(tǒng)的設(shè)計(jì)主要是實(shí)現(xiàn)了其中的詞法分析、語(yǔ)法分析和語(yǔ)義分析三個(gè)部分。</p><p>  1.3 開(kāi)發(fā)工具的選用及介紹</p><p>  軟件環(huán)境使用Window

18、s2000/XP操作系統(tǒng),用Visual C++ .NET為開(kāi)發(fā)平臺(tái),在開(kāi)發(fā)此軟件時(shí)用的是VC++中的MFC框架。</p><p>  Visual C++.NET2005是微軟公司推出的開(kāi)發(fā)Win32應(yīng)用程序(Windows 95/98/2000/XP/NT)的面向?qū)ο蟮目梢暬晒ぞ?。從原?lái)的Visual C++6.0/ Visual C++.Net 2005升級(jí)而來(lái),它的最大優(yōu)點(diǎn)就是提供了功能強(qiáng)大的MFC類(lèi)

19、庫(kù),MFC是一個(gè)很大的C++類(lèi)層次結(jié)構(gòu),其中封裝了大量的類(lèi)及其函數(shù),很多Windows程序所共有的標(biāo)準(zhǔn)內(nèi)容可以由MFC的類(lèi)來(lái)提供,MFC類(lèi)為這些內(nèi)容提供了用戶(hù)接口的標(biāo)準(zhǔn)實(shí)現(xiàn)方法,程序員所要做的就是通過(guò)預(yù)定義的接口把具體應(yīng)用程序特有的東西填入這個(gè)輪廓,這將簡(jiǎn)化編程工作,大大的減少程序員編寫(xiě)的代碼數(shù)量,使編程工作變得更加輕松容易。當(dāng)然還有Visual 2008和最新的Visual 2010beta版也已經(jīng)發(fā)布。</p><

20、;p>  Visual Studio 2005的成功已被證實(shí),即開(kāi)發(fā)人員偏愛(ài)一個(gè)具備對(duì)他們需要的工具提供接口的集成開(kāi)發(fā)環(huán)境。下面主要介紹它的有點(diǎn)。通過(guò)將開(kāi)發(fā)人員在開(kāi)發(fā)環(huán)境中需要的測(cè)試和性能工具(例如,單元測(cè)試、代碼分析和性能分析)合并在一起,Visual Studio 2005 Team System 也期待著這種成功。這使開(kāi)發(fā)人員能夠在生命周期的較早階段就改善其代碼的質(zhì)量,而無(wú)需中斷他們的工作。通過(guò)盡早地為開(kāi)發(fā)人員提供他們需要用

21、于識(shí)別和解決質(zhì)量問(wèn)題的工具,更多的產(chǎn)品缺陷就能夠在它們還未構(gòu)成危害之前即被發(fā)現(xiàn)并解決。 Visual Studio 2005 Team System,那么過(guò)程就不僅僅是文檔了。它還能將自己體現(xiàn)為實(shí)際的工具行為更改。當(dāng)您在項(xiàng)目初期選擇過(guò)程時(shí),還需要選擇工作流和工作產(chǎn)品,它們會(huì)驅(qū)動(dòng)系統(tǒng)的行為方式。對(duì) SDLC 過(guò)程的支持是內(nèi)置的,這使得對(duì)工作流的支持是無(wú)縫的。通過(guò)將過(guò)程集成到團(tuán)隊(duì)成員日常使用的基本工具中,Visual Studio 2005

22、 Team System 大大消除了過(guò)程采納的障礙,并使自動(dòng)收集跨職能的項(xiàng)目標(biāo)準(zhǔn)成為可能,而無(wú)需實(shí)施人工報(bào)告的相關(guān)開(kāi)銷(xiāo)。通過(guò)使用一個(gè)公共</p><p>  1.4 論文組織結(jié)構(gòu)</p><p><b>  第1章 緒論</b></p><p>  簡(jiǎn)述了C語(yǔ)言的發(fā)展以及一般編譯器的工作原理,并介紹了本系統(tǒng)開(kāi)發(fā)的主要平臺(tái)和工具及其特點(diǎn)。<

23、/p><p>  第2章 C語(yǔ)言詞法分析器的總體分析與設(shè)計(jì)</p><p>  簡(jiǎn)單的介紹了系統(tǒng)的設(shè)計(jì)目標(biāo)及系統(tǒng)要實(shí)現(xiàn)的功能。簡(jiǎn)單的介紹了幾個(gè)要實(shí)現(xiàn)的編譯步驟的概念和要完成的任務(wù)。</p><p>  第3章 系統(tǒng)的詳細(xì)設(shè)計(jì)</p><p>  介紹了系統(tǒng)的基本流程,各個(gè)模塊的設(shè)計(jì)思想和核心代碼部分。</p><p> 

24、 第2章 C語(yǔ)言詞法分析器的總體分析與設(shè)計(jì)</p><p>  2.1 系統(tǒng)設(shè)計(jì)目標(biāo)與功能分析</p><p>  本系統(tǒng)的設(shè)計(jì)目標(biāo)是完成一個(gè)小型的C語(yǔ)言編譯器的前端設(shè)計(jì),由于要完成一個(gè)完美的C語(yǔ)言編譯器前端是一件非常復(fù)雜的事情,不僅要考慮到C語(yǔ)言代碼的各種靈活用法,還需要能靈活運(yùn)用C語(yǔ)言語(yǔ)法,甚至是了解語(yǔ)法的構(gòu)成原理。本系統(tǒng)只完成整個(gè)編譯過(guò)程中的詞法分析、語(yǔ)法分析、語(yǔ)義分析以及其中的建立

25、符號(hào)表和類(lèi)型檢查幾個(gè)步驟。</p><p>  下面分別概括介紹編譯過(guò)程中的這幾個(gè)階段。</p><p><b>  2.2 詞法分析</b></p><p>  詞法分析程序又稱(chēng)掃描器,它是編譯過(guò)程的第一個(gè)階段。其主要任務(wù)是從左到右依次描描字符串形式的源程序的各個(gè)字符,逐個(gè)識(shí)別出其中的單詞,并將其轉(zhuǎn)換成為內(nèi)部編碼形式的單詞符號(hào)串輸出,用于進(jìn)行

26、語(yǔ)法分析。通常可采用二元式(CLASS,VALUE)來(lái)表示一個(gè)單詞符號(hào)的內(nèi)部編碼,其中CLASS為一整數(shù)碼,用于表示該單詞的類(lèi)別;VALUE則是單詞之值(如變量名在符號(hào)表中的序號(hào),常數(shù)的二進(jìn)制表示,以及運(yùn)算符和分隔符的編碼,等等)。</p><p>  概括的說(shuō),掃描器在其工作過(guò)程中,一般應(yīng)完成下列的任務(wù):</p><p> ?。?)識(shí)別出源程序中的各個(gè)單詞符號(hào),并將其轉(zhuǎn)換成內(nèi)部編碼形式;

27、</p><p>  (2)刪除無(wú)用的空白字符、回車(chē)字符以及其他非實(shí)質(zhì)性字符;</p><p><b>  (3)刪除注釋?zhuān)?lt;/b></p><p> ?。?)進(jìn)行詞法檢查,報(bào)告所發(fā)現(xiàn)的錯(cuò)誤。</p><p>  此外,視編譯工作流程的組織,一些編譯程序在進(jìn)行詞法分析時(shí),還要完成將所識(shí)別出的標(biāo)志符登錄到符號(hào)表的工作。&l

28、t;/p><p>  從功能上看,詞法分析上把字符串形式的源程序轉(zhuǎn)換為單詞串形式,然后進(jìn)行語(yǔ)法分析。從工作方式上看,他與語(yǔ)法分析之間存在兩種接口方式。一種方式是將詞法分析的輸出結(jié)果存放在一個(gè)中間文件上,后面的語(yǔ)法分析程序?qū)⑺鳛檩斎脒M(jìn)行語(yǔ)法分析 。另一種方式是將詞法分析編成一個(gè)子程序,該子程序由語(yǔ)法分析程序調(diào)用,當(dāng)語(yǔ)法分析程序需要一個(gè)新的單詞時(shí),就調(diào)用該子程序,每調(diào)用一次,則從源程序字符串中讀出一個(gè)具有獨(dú)立意義的單詞

29、。本設(shè)計(jì)采用前一種方式。</p><p><b>  2.3 語(yǔ)法分析</b></p><p>  語(yǔ)法分析程序又稱(chēng)分析器,它以單詞串形式的源程序作為輸入或分析的對(duì)象,其基本任務(wù)是:根據(jù)程序設(shè)計(jì)語(yǔ)言的語(yǔ)法規(guī)則(即定義該語(yǔ)言的前后無(wú)關(guān)文法),分析源程序的語(yǔ)法結(jié)構(gòu),即分析如何由這些單詞組成該源程序的各種語(yǔ)法成分(如下標(biāo)變量、函數(shù)、各種表達(dá)式、各種程序語(yǔ)句等),并在分析過(guò)程

30、中進(jìn)行語(yǔ)法正確性檢查,產(chǎn)生內(nèi)部形式的中間代碼,供編譯程序后續(xù)階段處理。</p><p>  目前,已存在多種語(yǔ)法分析方面的方法,但就產(chǎn)生語(yǔ)法樹(shù)的方向而言,可大致把它們分為自頂向下分析和自底向上分析兩大類(lèi)。</p><p>  2.3.1自頂向下的語(yǔ)法分析</p><p>  所謂自頂向下的語(yǔ)法分析,只指對(duì)于給定輸入串w,試圖為其構(gòu)造一個(gè)從文法開(kāi)始符號(hào)S到w的最左推導(dǎo)

31、S=>w,或?yàn)閣自上而下地構(gòu)造一棵S為根結(jié)點(diǎn)的語(yǔ)法樹(shù)。如果這一嘗試得到成功,則證明w是相應(yīng)文法的一個(gè)句子;反之,則不是。</p><p>  在進(jìn)行自頂向下的語(yǔ)法分析時(shí),通常有兩個(gè)障礙須加以解決:</p><p>  (1) 由于采取了最左推導(dǎo),故當(dāng)相應(yīng)文法G中含有左遞歸的非終結(jié)符號(hào)時(shí),便會(huì)使語(yǔ)法分析過(guò)程陷入循環(huán)不已的狀況。</p><p>  (2) 采用最

32、左推導(dǎo)以實(shí)現(xiàn)對(duì)符號(hào)串w的匹配,實(shí)際上是一個(gè)用文法產(chǎn)生式的諸候選式反復(fù)進(jìn)行試探的過(guò)程,這勢(shì)必會(huì)出現(xiàn)大量的回溯,從而導(dǎo)致語(yǔ)法分析效率的大幅度下降。</p><p>  因此,欲實(shí)現(xiàn)自頂向下的語(yǔ)法分析,其首要任務(wù)是改造程序設(shè)計(jì)語(yǔ)言的文法,使得文法無(wú)左遞歸且無(wú)左公因子,以消除其中的左遞歸和避免回溯的出現(xiàn)。</p><p>  2.3.2自底向上的語(yǔ)法分析</p><p> 

33、 所謂自底向上的語(yǔ)法分析,是指從給定的輸入串w=a1a2…an出發(fā),試圖利用相應(yīng)文法中的產(chǎn)生式,逐步將其歸約為文法的開(kāi)始符號(hào)S,即從葉結(jié)點(diǎn)a1,a2,…,an出發(fā),試圖逐步向上構(gòu)造一個(gè)語(yǔ)法樹(shù),而其根結(jié)點(diǎn)恰好為S0由于上述分析過(guò)程通常采用的是最左歸約,所以實(shí)現(xiàn)此種語(yǔ)法分析的關(guān)鍵,是在分析的每一步,如何尋找或確定當(dāng)前句型的句柄,以及確定將其歸約為什么非終結(jié)符號(hào)。</p><p>  和自頂向下的分析過(guò)程一樣,實(shí)現(xiàn)自底

34、向上的分析,通常也須使用一個(gè)分析棧來(lái)存放分析過(guò)程中所得的文法符號(hào)。分析開(kāi)始時(shí),在棧底放置一個(gè)界符#,然后將輸入符號(hào)逐個(gè)推入棧內(nèi),一旦在分析棧的棧頂出現(xiàn)句柄,就用相應(yīng)的產(chǎn)生式的左部去替換這個(gè)句柄,即進(jìn)行一次歸約。由于歸約,便得到了新的棧頂,此時(shí)再查看棧的頂部是否形成新的句柄:若是,再進(jìn)行歸約;反之,則繼續(xù)將后續(xù)的輸入符號(hào)移入棧內(nèi),并重復(fù)上述過(guò)程。若最終能將全部輸入符號(hào)(不包括右界符#)移掉,且分析棧中只留下棧底符號(hào)#及最后一步歸約所得的文

35、法開(kāi)始符號(hào),則表明對(duì)輸入串的分析已經(jīng)成功。但若全部輸入符號(hào)已被移掉,而分析棧卻不能出現(xiàn)上述格局,則表明輸入符號(hào)串不是文法的一個(gè)句子,其中必定存在語(yǔ)法錯(cuò)誤。通常將上述過(guò)程稱(chēng)為“移進(jìn)-歸約”分析,它是最基本的自底向上分析過(guò)程。在此基礎(chǔ)上,根據(jù)尋找句柄策略的不同,便形成了不同的自底向上的語(yǔ)法分析方法。</p><p><b>  2.4 語(yǔ)義分析</b></p><p> 

36、 在完成了上述過(guò)程后編譯程序?qū)⒃闯绦蜃兂梢环N內(nèi)部表示形式,這種內(nèi)部表示形式就叫做中間代碼或中間語(yǔ)言,它是一種結(jié)構(gòu)簡(jiǎn)單、含義明確的記號(hào)系統(tǒng)。有些快速編譯程序幾乎沒(méi)有中間代碼,但是為了使目標(biāo)代碼的優(yōu)化比較容易實(shí)現(xiàn),獨(dú)立于機(jī)器進(jìn)行,許多編譯程序都采用了某種復(fù)雜性程度介于源程序語(yǔ)言和機(jī)器語(yǔ)言之間的中間語(yǔ)言。但是,想對(duì)于詞法分析和語(yǔ)法分析都已有相當(dāng)成熟的理論和算法,中間代碼目前還沒(méi)有一種公認(rèn)的形式系統(tǒng),比較接近形式化的方法是語(yǔ)法制導(dǎo)翻譯。<

37、/p><p><b>  2.5 符號(hào)表</b></p><p>  符號(hào)表的信息欄中登記了每個(gè)名字的有關(guān)性質(zhì),如類(lèi)型(整、實(shí)或布爾等)、種屬(簡(jiǎn)單變量、數(shù)組、過(guò)程等)、大?。ㄩL(zhǎng)度,即所需的存儲(chǔ)單元字?jǐn)?shù))以及相對(duì)數(shù)(指分配給該名宇的存儲(chǔ)單元的相對(duì)地址)。不同的程序語(yǔ)言對(duì)于名字性質(zhì)的定義各有不同?,F(xiàn)今多數(shù)程序語(yǔ)言中的名字或者是用說(shuō)明語(yǔ)句規(guī)定其性質(zhì),或者采用某種隱含約定(如F

38、ORTRAN中凡以字符I,J,…N開(kāi)頭的標(biāo)識(shí)符代表整型變量名)。有些程序語(yǔ)言,如ADL沒(méi)有說(shuō)明語(yǔ)句也沒(méi)有隱含約定,因此,符號(hào)表的性質(zhì)須到目標(biāo)程序運(yùn)行時(shí)才能確定下來(lái)。但編譯時(shí)登記在符號(hào)表中的各名字的性質(zhì)只能來(lái)自說(shuō)明語(yǔ)句(包括隱含約定和標(biāo)號(hào)定義)或其它引用情形。</p><p>  對(duì)于變量名、數(shù)組名和過(guò)程名而言,它們的信息欄中一般要求有下列信息:</p><p>  變量 類(lèi)型(整、實(shí)、雙

39、實(shí)、布爾、字符、復(fù)、標(biāo)號(hào)或指針等);</p><p>  種屬(簡(jiǎn)單變量、數(shù)組或記錄結(jié)構(gòu)等);</p><p>  長(zhǎng)度(所需的存儲(chǔ)單元數(shù));</p><p>  相對(duì)數(shù)(存儲(chǔ)單元相對(duì)地址);</p><p>  若為數(shù)組,則記錄其內(nèi)情向量;</p><p>  若為記錄結(jié)構(gòu),則把它與其分量按某種形式聯(lián)系起來(lái);<

40、/p><p><b>  形式參數(shù)標(biāo)志;</b></p><p>  若在 COMMON或 EQUVALENCE語(yǔ)句中(FORTRAN語(yǔ)言),把它和有關(guān)名字連接在一起;它的說(shuō)明是否已處理過(guò)(即標(biāo)志位“定義否”);</p><p>  是否對(duì)這個(gè)變量進(jìn)行過(guò)賦值(包括出現(xiàn)在輸人名表中)的標(biāo)志位。</p><p>  過(guò)程 是否

41、為程序的外部過(guò)程?</p><p>  若為函數(shù),類(lèi)型是什么?</p><p><b>  其說(shuō)明是否處理過(guò)?</b></p><p><b>  是否遞歸?</b></p><p>  形式參數(shù)是些什么?為了與實(shí)參進(jìn)行比較,必須把它們的種屬、類(lèi)型信息同過(guò)程名聯(lián)系在一起。</p>&l

42、t;p>  對(duì)于那些只使用單一符號(hào)表的簡(jiǎn)單語(yǔ)言,對(duì)符號(hào)表填入新項(xiàng)的工作可由詞法分析程序來(lái)完成。也就是,當(dāng)掃描器碰到一個(gè)標(biāo)識(shí)符時(shí)就對(duì)它查填符號(hào)表,然后回送它在符號(hào)表中的位置作為單詞值。但在某些語(yǔ)言中,甚至在同一過(guò)程段里允許用同一標(biāo)識(shí)符標(biāo)識(shí)各種不同對(duì)象。例如,XYZ可能既是一個(gè)實(shí)變量名又是一個(gè)標(biāo)號(hào)名,或者又是某個(gè)結(jié)構(gòu)型數(shù)據(jù)的一個(gè)分量名。在這種情況下,使用單一符號(hào)表或由詞法分析程序負(fù)責(zé)查填符號(hào)表都是非常不方便的。因此,采用多種符號(hào)表并讓

43、語(yǔ)法——語(yǔ)義分析程序負(fù)責(zé)查填工作是比較妥當(dāng)?shù)摹?duì)于詞法分析程序來(lái)說(shuō),只要求它凡碰到標(biāo)識(shí)符就直接送出此標(biāo)識(shí)符自身即可。</p><p>  符號(hào)表中信息欄的具體組織和安排取決于所翻譯的具體語(yǔ)言與目標(biāo)機(jī)器(的字長(zhǎng)和指令系統(tǒng))。</p><p><b>  2.6 類(lèi)型檢查</b></p><p>  為了進(jìn)行類(lèi)型檢查,編譯器需要給源程序的每一個(gè)組成

44、成分賦予一個(gè)類(lèi)型表達(dá)式。然后,編譯器需要確定這些類(lèi)型表達(dá)式是否滿(mǎn)足一組邏輯規(guī)則。這些規(guī)則被稱(chēng)為源語(yǔ)言的類(lèi)型系統(tǒng)。</p><p>  類(lèi)型檢查具有發(fā)現(xiàn)程序中的錯(cuò)誤的功能。原則上,如果目標(biāo)代碼在保存元素值的同時(shí)保存了元素類(lèi)型的信息,任何檢查都可以動(dòng)態(tài)地進(jìn)行。一個(gè)健全的類(lèi)型系統(tǒng)可以消除對(duì)動(dòng)態(tài)類(lèi)型檢查的需要,因?yàn)樗梢詭椭覀冹o態(tài)地確定這些錯(cuò)誤不會(huì)在程序運(yùn)行的時(shí)候發(fā)生。如果編譯器可以保證它接受的程序在運(yùn)行時(shí)刻不會(huì)發(fā)生類(lèi)

45、型錯(cuò)誤,那么該語(yǔ)言的這個(gè)實(shí)現(xiàn)就被稱(chēng)為強(qiáng)類(lèi)型的。</p><p>  第3章 系統(tǒng)詳細(xì)設(shè)計(jì)</p><p>  3.1 系統(tǒng)設(shè)計(jì)基本思路</p><p>  基于C語(yǔ)言源程序分析器的開(kāi)發(fā)在可行性分析的基礎(chǔ)上進(jìn)一步全面、深入的分析,弄清C語(yǔ)言的編譯原理及運(yùn)行狀況,在編譯程序工作的五個(gè)階段中,每個(gè)階段都必須遵從功能等價(jià)的原則。詞法規(guī)則與語(yǔ)法分析階段依據(jù)的語(yǔ)法規(guī)則一同構(gòu)成了

46、一個(gè)語(yǔ)言的語(yǔ)法,而語(yǔ)法則是從"形"的角度衡量一個(gè)程序是否合法。所以在詞法分析階段,詞法規(guī)則成為重要的研究對(duì)象。詞法分析器所處理的對(duì)象即詞法分析程序的輸入數(shù)據(jù),實(shí)際上是源程序經(jīng)過(guò)編譯預(yù)處理,去掉多余的符號(hào)后而形成的代碼,這樣給詞法分析帶來(lái)方便。詞法分析的過(guò)程是線(xiàn)性的從頭至尾掃描一遍,復(fù)雜度較低,易實(shí)現(xiàn)。最后概括出要實(shí)現(xiàn)的幾個(gè)功能流程圖如下:</p><p>  3.2 詞法分析模塊設(shè)計(jì) <

47、/p><p>  詞法分析程序需要完成的任務(wù)如下:</p><p>  1) 識(shí)別出源程序的各個(gè)語(yǔ)法單位;</p><p>  2) 剔除無(wú)用的空白字符、制表符、回車(chē)字符以及其他與輸入介質(zhì)相關(guān)的非實(shí)質(zhì)性字符 ;</p><p>  3) 過(guò)濾掉源程序中的注釋;</p><p>  4) 進(jìn)行詞法檢查,如果出現(xiàn)錯(cuò)誤,記錄出

48、錯(cuò)信息并報(bào)告。</p><p>  我們將編譯程序的重點(diǎn)放在中間代碼生成階段。詞法分析器的功能是輸入源程序,輸出單詞符號(hào)。這部分程序主要包括兩個(gè)類(lèi):</p><p><b>  包括兩個(gè)類(lèi):</b></p><p>  Class CTokenizer:</p><p>  從一個(gè)字符串中(這個(gè)把一個(gè)文件看作是一個(gè)字符串

49、,MFC中CFile->CString)分離出一個(gè)一個(gè)token,配上簡(jiǎn)單的類(lèi)型通過(guò)NextToken()返回:</p><p>  #define TT_EOL'\n'</p><p>  #define TT_EOF-1</p><p>  #define TT_INTEGER-2</p><p>  #d

50、efine TT_REAL-3</p><p>  #define TT_WORD-4</p><p>  #define TT_STRING'"'</p><p>  #define TT_CHAR'\''</p><p>  Class CScaner:</p>

51、<p>  得到具體的的token類(lèi)型,定義TokenType如下:</p><p>  enum TokenType</p><p><b>  {</b></p><p>  // reserved Keyword</p><p>  _AUTO, _DOUBLE, _INT, _STRUCT,</

52、p><p>  _BREAK, _ELSE, _LONG, _SWITCH, </p><p>  _CASE, _ENUM, _REGISTER, _TYPEDEF,</p><p>  _CHAR, _EXTERN, _RETURN, _UNION,</p><p>  _CONST, _FLOAT, _SHORT, _UNSIGNED,&l

53、t;/p><p>  _CONTINUE, _FOR, _SIGNED, _VOID,</p><p>  _DEFAULT, _GOTO, _SIZEOF, _VOLATILE,</p><p>  _DO, _IF, _STATIC, _WHILE,</p><p>  _READ, _WRITE, _PRINTF,</p>&

54、lt;p>  // operations</p><p>  ASSIGN, PLUS, MINUS, TIMES, DIV, MOD,</p><p>  BITWISE_AND, BITWISE_OR, BITWISE_NOT, LOGICAL_NOT, LT, GT,</p><p>  // interpunctions</p><

55、p>  LPARAN, RPARAN, LBRACE, RBRACE, LSQUARE, RSQUARE, COMMA, DOT, SEMI, COLON,</p><p>  // complex operations</p><p>  EQ/* == */, NEQ/* != */, PLUS_PLUS/* ++ */, MINUS_MINUS/* -- */,</p&g

56、t;<p>  PLUS_ASSIGN/* += */, MINUS_ASSIGN/* -= */, TIMES_ASSIGN/* *= */, DIV_ASSIGN/* /= */,</p><p>  NGT/* <= */, NLT/* >= */, LOGICAL_AND/* && */, LOGICAL_OR/* || */,</p><p&

57、gt;<b>  // others</b></p><p>  _EOF, _ID, _NUM, _STRING, _CHARACTER, _LABEL, _ERROR, _NONE</p><p><b>  };</b></p><p>  CScaner通過(guò)一個(gè)CMap<CString, LPCSTR, en

58、um TokenType, enum TokenType> m_KeyIndex 把CString的關(guān)鍵字和TokenType對(duì)應(yīng),便于查找和反向查找。</p><p><b>  C關(guān)鍵字表:</b></p><p><b>  標(biāo)識(shí)符詞法:</b></p><p>  identifier :</p>

59、<p>  nondigitidentifier nondigitidentifier digit</p><p>  nondigit : one of</p><p>  _ a b c d e f g h i j k l m n o p q r s t u v w x y zA B C D E F G H I J K L M N O P Q R S T U V W

60、 X Y Z</p><p>  digit : one of</p><p>  0 1 2 3 4 5 6 7 8 9</p><p><b>  escape:</b></p><p>  \n, \r, \b, \0-7</p><p>  3.3 語(yǔ)法分析模塊設(shè)計(jì) </p>

61、<p>  在上一節(jié)中,實(shí)現(xiàn)了詞法分析程序的功能。一個(gè)字符串形式的源程序經(jīng)過(guò)詞法分析,即被轉(zhuǎn)換為一串單詞符號(hào)。編譯程序在完成了詞法分析之后,就進(jìn)入語(yǔ)法分析階段。</p><p>  語(yǔ)法分析程序以單詞形式的源程序作為輸入或分析的對(duì)象。其基本任務(wù)是根據(jù)語(yǔ)言的語(yǔ)法規(guī)則(即描述該語(yǔ)言的上下文無(wú)關(guān)文法),分析源程序的語(yǔ)法結(jié)構(gòu)(即分析如何將這些單詞組成各種語(yǔ)法成分,如各種表達(dá)式、語(yǔ)句、函數(shù)或過(guò)程等),并在分析過(guò)

62、程中,對(duì)源程序進(jìn)行語(yǔ)法正確性檢查。其分析結(jié)果是識(shí)別出無(wú)語(yǔ)法錯(cuò)誤的語(yǔ)法成分。其輸出形式也有多種。</p><p>  語(yǔ)法分析模塊的核心部分設(shè)計(jì)如下:</p><p>  Class CParser:</p><p>  定義CTreeNode,和Tiny例程類(lèi)似:</p><p>  #define MAX_CHILDREN 3</p&

63、gt;<p>  class CTreeNode</p><p><b>  {</b></p><p><b>  public:</b></p><p>  CTreeNode*child[ MAX_CHILDREN ];// point to child node</p><p

64、>  CTreeNode*father;// point to father node</p><p>  CTreeNode*sibling;// point to sibling node</p><p>  intlineno;</p><p>  NodeKindnodekind;</p><p&

65、gt;<b>  union {</b></p><p>  StmtKindstmt;</p><p>  ExpKindexp;</p><p><b>  } kind;</b></p><p>  enum TokenTypetype;</p><p>  C

66、StringszName;</p><p>  CStringszScope;// node function scope</p><p>  BOOLbArray;// is this an array declaration</p><p>  intiArraySize;// array size</p&

67、gt;<p><b>  };</b></p><p>  通過(guò)文法及相應(yīng)規(guī)則建立語(yǔ)法樹(shù)。</p><p><b>  Grammar:</b></p><p>  program->declaration_list</p><p>  declaration_list->

68、declaration_list declaration | declaration</p><p>  declaration->var_declaration | fun_declaration</p><p>  var_declaration->type_specifier ID(, ...)`;` | type_specifier ID `[` NUM `]`(, .

69、..)`;`</p><p>  type_specifier->`int` | `void` | `char`, actually this step is in declaration_list()</p><p>  fun_declaration->type_specifier ID `(` params `)` compound_stmt</p><

70、;p>  params->param_list | `void` | empty, `void` is thought as empty</p><p>  param_list->param_list `,` param | param</p><p>  param->type_specifier ID | type_specifier ID `[` `]`&l

71、t;/p><p>  compound_stmt->`{` loal_declarations statement_list `}` | expression_stmt</p><p>  local_declarations->local_declarations var_declaration | var_declaration</p><p>  `r

72、ead` `(` var `)` `;`</p><p>  `write` `(` expression `)` `;`</p><p>  `printf` `(` `"` STRING `"` `)` `;`</p><p>  expression_stmt->expression `;` | `;`</p><

73、p>  expression->var `=` expression | logic1_expression</p><p>  logic1_expression->logic1_expression `||` logic2_expression | logic2_expression</p><p>  logic2_expression-> logic2_ex

74、pression `&&` simple_expression | simple_expression</p><p>  simple_expression->additive_expression relop additive_expression | additive_expression</p><p>  relop-> `<=` | `<

75、` | `>` | `>=` | `==` | `!=`</p><p>  additive_expression -> additive_expression addop term | term</p><p>  addop-> `+` | `-`</p><p>  term->term mulop logic3_express

76、ion | logic3_expression</p><p>  mulop-> `*` | `/` | `%`</p><p>  logic3_expression-> `!` logic3_expression | factor</p><p>  factor->`(` expression `)` | var | call | NUM&

77、lt;/p><p>  var->ID | ID `[` expression `]`</p><p>  call->ID `(` args `)`</p><p>  args->args_list | empty</p><p>  args_list->args_list `,` expression | expr

78、ession</p><p>  sub_compoundstmt->ID `:` | call `;` | expression_stmt</p><p>  if_stmt->`if` `(` expression `)` compound_stmt</p><p>  | `if` `(` expression `)` compound_stmt

79、`else` compound_stmt</p><p>  while_stmt->`while` `(` expression `)` compound_stmt</p><p>  for_stmt->`for` `(` var `=` expression `;` expression `;` var `=` expression `)` compound_stmt&l

80、t;/p><p>  goto_stmt->`goto` ID `;`</p><p>  break_stmt->`break` `;`</p><p>  continue_stmt->`continue` `;`</p><p>  return_stmt->`return` `;` | `return` expre

81、ssion `;`</p><p><b>  基本樹(shù)形結(jié)構(gòu):</b></p><p><b>  if語(yǔ)句: </b></p><p><b>  while語(yǔ)句:</b></p><p><b>  for循環(huán)語(yǔ)句:</b></p>&l

82、t;p><b>  復(fù)合語(yǔ)句:</b></p><p><b>  支持的語(yǔ)句及運(yùn)算:</b></p><p>  1) 數(shù)據(jù)類(lèi)型:int,char void,PCode里支持float,在80x86 ASM里不支持</p><p>  2) 語(yǔ)句:賦值(=),if, while,for,return,break,c

83、ontinue</p><p>  3) 數(shù)學(xué)運(yùn)算:+,-,*,/</p><p>  4) 關(guān)系運(yùn)算:= =,>,<,>=,<=,!=</p><p>  5) 邏輯運(yùn)算:&&,||,!</p><p>  6) 支持函數(shù)的定義、調(diào)用</p><p><b>  7)

84、 支持復(fù)合語(yǔ)句</b></p><p>  8) 注釋語(yǔ)句:C類(lèi)型的 /* */ 和C++類(lèi)型的 //</p><p>  3.4 語(yǔ)義分析模塊設(shè)計(jì)</p><p>  語(yǔ)義分析的任務(wù)是根據(jù)語(yǔ)義規(guī)則對(duì)識(shí)別出的各種語(yǔ)法成分分析其含義,進(jìn)行初步翻譯。具體來(lái)說(shuō),其主要任務(wù)包括以下幾部分。</p><p>  1、確定類(lèi)型。即確定標(biāo)識(shí)符所

85、對(duì)應(yīng)數(shù)據(jù)對(duì)象的數(shù)據(jù)類(lèi)型,這部分工作有時(shí)也由詞法分析來(lái)完成。</p><p>  2、語(yǔ)義檢查。動(dòng)態(tài)語(yǔ)義檢查在運(yùn)行時(shí)進(jìn)行,需要生成相應(yīng)的目標(biāo)代碼;而靜態(tài)語(yǔ)義檢查則在編譯時(shí)完成,它主要完成以下四個(gè)方面。</p><p>  3、識(shí)別含義。如果靜態(tài)語(yǔ)義正確,則進(jìn)行正真的翻譯,即識(shí)別程序中各種語(yǔ)法成分的含義,并做相應(yīng)的語(yǔ)義處理,生成相應(yīng)的中間代碼或直接生成目標(biāo)代碼。</p><

86、p>  語(yǔ)義分析程序是在詞法分析和語(yǔ)義分析之后,可以由語(yǔ)法分析程序直接調(diào)用相應(yīng)的語(yǔ)義子程序進(jìn)行語(yǔ)義處理,也可以先生成語(yǔ)法樹(shù)的某種表示方法,再進(jìn)行語(yǔ)義處理。</p><p>  編譯的各個(gè)階段都可能發(fā)現(xiàn)源程序中的錯(cuò)誤。發(fā)現(xiàn)錯(cuò)誤后如果立即停止編譯,往往會(huì)降低調(diào)式程序的效率,所以應(yīng)對(duì)出現(xiàn)的錯(cuò)誤做適當(dāng)?shù)奶幚?,從而使編譯能繼續(xù)進(jìn)行。詞法分析可以檢測(cè)出源程序中的非法字符,就好比自然語(yǔ)言中出現(xiàn)的錯(cuò)字和錯(cuò)詞。語(yǔ)法分析能夠發(fā)

87、現(xiàn)程序語(yǔ)句中的各種語(yǔ)法錯(cuò)誤,如括號(hào)不匹配等。語(yǔ)義分析能夠判斷運(yùn)算對(duì)象的類(lèi)型是否匹配,變量是否重復(fù)聲明或沒(méi)有聲明就使用等錯(cuò)誤。任何時(shí)刻發(fā)現(xiàn)錯(cuò)誤,都應(yīng)該報(bào)告錯(cuò)誤信息,包括錯(cuò)誤出現(xiàn)的位置和錯(cuò)誤性質(zhì)等,為程序員調(diào)試程序提供方便。</p><p>  本程序在語(yǔ)義分析部分設(shè)計(jì)主要包括兩方面的內(nèi)容,即建立符號(hào)表和類(lèi)型檢查。</p><p><b>  建立符號(hào)表:</b><

88、/p><p><b>  輔助類(lèi):</b></p><p>  Class LineListRec:</p><p>  主要成員是lineno,記錄某個(gè)Token(變量或函數(shù)名)聲明或使用時(shí)的行數(shù)。</p><p>  Class BucketListRec:</p><p><b>  

89、主要成員變量:</b></p><p>  CStringname;// variable name</p><p>  CStringscope;// function scope</p><p>  enum TokenTypetype;</p><p>  intmemloc;// memory

90、location for variable</p><p>  BOOLbArray; // for array checking</p><p>  LineListRec*lineno;</p><p>  BucketListRec*next;</p><p>  記錄每一個(gè)變量或函數(shù)名的具體情況。</p>

91、<p><b>  主要的類(lèi),</b></p><p><b>  建立符號(hào)表:</b></p><p>  Class CSymbolTable:</p><p>  主要成員變量:BucketListRec*hashTable[SIZE],把Class BucketListRec類(lèi)的對(duì)象通過(guò)hash函數(shù)找

92、到位置后插入。</p><p>  函數(shù)PrintSynbalTable(LPCTSTR lpszPathName),輸入文件名,通過(guò)一個(gè)遞歸函數(shù)輸出符號(hào)表到文件lpszPathName。</p><p>  Class CFunArgsCheck:</p><p>  插入函數(shù)參數(shù)的類(lèi)型,以備在下一個(gè)步驟中做匹配檢測(cè)。</p><p>&l

93、t;b>  類(lèi)型檢測(cè):</b></p><p>  Class CAnalyzer:</p><p><b>  包括兩個(gè)部分:</b></p><p><b>  類(lèi)型匹配:</b></p><p>  函數(shù)或變量聲明時(shí)檢測(cè)是否已聲明,如已聲明則拋出錯(cuò)誤;函數(shù)調(diào)用或變量使用時(shí)檢測(cè)

94、是否已聲明,如未聲明則拋出錯(cuò)誤。</p><p><b>  函數(shù)調(diào)用參數(shù)檢測(cè):</b></p><p>  檢測(cè)函數(shù)調(diào)用時(shí)傳入?yún)?shù)的類(lèi)型與函數(shù)聲明時(shí)參數(shù)的類(lèi)型是否匹配。</p><p><b>  第4章 結(jié)束語(yǔ)</b></p><p>  本次開(kāi)發(fā)設(shè)計(jì)是對(duì)C語(yǔ)言課程、數(shù)據(jù)結(jié)構(gòu)、編譯原理等一系列的

95、課程的回顧學(xué)習(xí)。在開(kāi)發(fā)基于C語(yǔ)言小型編譯器前端中,還是用系統(tǒng)分析、系統(tǒng)設(shè)計(jì)的思路。一個(gè)好的系統(tǒng)分析、設(shè)計(jì)工作,會(huì)使以后的系統(tǒng)實(shí)施順利高效的進(jìn)行,從而達(dá)到事半功倍的效果,這也是我的一點(diǎn)心得體會(huì)吧。</p><p>  對(duì)于系統(tǒng)的可擴(kuò)展性,在設(shè)計(jì)前也做了充分的考慮,在設(shè)計(jì)時(shí)預(yù)留了一些余地,以便本系統(tǒng)在C語(yǔ)言語(yǔ)法不變的情況下一直都能使用,而不需要再重新開(kāi)發(fā)。同時(shí)在設(shè)計(jì)上使用的是模塊化的設(shè)計(jì),更為系統(tǒng)以后的擴(kuò)展提供了良好

96、的條件。</p><p>  同時(shí)系統(tǒng)也存在的問(wèn)題與改進(jìn)方向,由于本人第一次開(kāi)發(fā)編程語(yǔ)言編譯程序,經(jīng)驗(yàn)不足,所以存在著許多不足之處。由于時(shí)間緊,開(kāi)發(fā)任務(wù)重,系統(tǒng)有些功能尚未健全。</p><p><b>  參考文獻(xiàn)</b></p><p>  [1] 錢(qián)煥延.編譯技術(shù)第2版[M].南京:東南大學(xué)出版社出版,2002。</p>&

97、lt;p>  [2] 康慕寧.編譯原理[M].西安:西北工業(yè)大學(xué)出版社出版,2003。</p><p>  [3] 賀世娟,陳冀川.Visual Basic 6.0 程序設(shè)計(jì)[M].北京:中國(guó)水利水電出版社出版,2002.8。</p><p>  [4] 楊克玉.VB6.0程序設(shè)計(jì)實(shí)訓(xùn)教程[M].北京:機(jī)械工業(yè)出版社出版,2005.2。</p><p>  [

98、5] 陳明.Visual Basic教程[M].北京:人民郵電出版社,2002.8。</p><p>  [6] 徐謖.Visual Basic應(yīng)用與開(kāi)發(fā)案例教程[M].北京:清華大學(xué)出版社,2005.4。</p><p>  [7] 周峰.Visual Basic案例開(kāi)發(fā)集錦[M].北京:電子工業(yè)出版社,2005。</p><p>  [8] 李冬梅,施海虎. 編

99、譯原理[M]. 人民郵電出版社,2006.8</p><p>  [9] 孫悅紅. 編譯原理及實(shí)現(xiàn)[M]. 清華大學(xué)出版社. 2005.4</p><p>  [10]木林森,高峰霞. Visual C++ 6.0 使用與開(kāi)發(fā)[M]. 清華大學(xué)出版社,2003.1</p><p>  附錄一:詞法分析核心代碼</p><p>  int ge

100、tch()</p><p><b>  {</b></p><p>  if(cc == ll)</p><p><b>  {</b></p><p>  if(feof(fin))</p><p><b>  {</b></p><

101、;p>  printf("program incoplete");</p><p>  return -1;</p><p><b>  }</b></p><p><b>  ll = 0;</b></p><p><b>  cc = 0;</b>

102、</p><p>  printf("%d",cx);</p><p>  fprintf(fal,"%d",cx);</p><p><b>  ch = '';</b></p><p>  while(ch != 10)</p><p>

103、<b>  {</b></p><p>  if(EOF == fscanf(fin,"%c",&ch))</p><p><b>  {</b></p><p>  line[ll] = 0;</p><p><b>  break;</b><

104、;/p><p><b>  }</b></p><p>  printf("%c",ch);</p><p>  fprintf(fal,"%c",ch);</p><p>  line[ll]=ch;</p><p><b>  ll++;</

105、b></p><p><b>  }</b></p><p>  printf("\n");</p><p>  fprintf(fal,"\n");</p><p><b>  }</b></p><p>  ch = line

106、[cc];</p><p><b>  cc++;</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  附錄二:語(yǔ)法分析核心代碼</p><p>  int getsym()<

107、/p><p><b>  {</b></p><p>  int i,j,k;</p><p>  while(ch==''||ch==10||ch==9)</p><p><b>  getchdo;</b></p><p>  if(ch>='a

108、'&&ch<='z')</p><p><b>  {</b></p><p><b>  k=0;</b></p><p><b>  do </b></p><p><b>  {</b></p>

109、;<p><b>  if(k<al)</b></p><p><b>  {</b></p><p><b>  a[k]=ch;</b></p><p><b>  k++;</b></p><p><b>  }<

110、/b></p><p><b>  getchdo;</b></p><p>  } while (ch>='a'&&ch<='z'||ch>='0'&&ch<='9');</p><p><b>  a[k]

111、=0;</b></p><p>  strcpy(id,a);</p><p><b>  i=0;</b></p><p><b>  j=norw-1;</b></p><p><b>  do{</b></p><p>  k=(i+j

112、)/2;</p><p>  if(strcmp(id,work[k])<=0)</p><p><b>  j=k-1;</b></p><p>  if(strcmp(id,work[k])>=0)</p><p><b>  i=k+1;</b></p><p&

113、gt;  }while(i<=j);</p><p><b>  if(i-1>j)</b></p><p>  sym=wsym[k];</p><p><b>  else</b></p><p>  sym=ident;</p><p><b> 

114、 }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  if(ch>='0'&&ch<='9')</p><p><b>  {</b><

115、;/p><p><b>  k=0;</b></p><p><b>  num=0;</b></p><p>  sym=number;</p><p><b>  do{</b></p><p>  num=10*num+ch-'0';&

116、lt;/p><p><b>  k++;</b></p><p><b>  getchdo;</b></p><p>  }while(ch>='0'&&ch<='9');</p><p><b>  k--;</b>&

117、lt;/p><p>  if(k>nmax)</p><p><b>  {</b></p><p>  ERROR(30);</p><p><b>  }</b></p><p><b>  }</b></p><p>&l

118、t;b>  else</b></p><p><b>  {</b></p><p>  if(ch==':')</p><p><b>  {</b></p><p><b>  getchdo;</b></p><p&g

119、t;  if(ch=='=')</p><p><b>  {</b></p><p>  sym=becomes;</p><p><b>  getchdo;</b></p><p><b>  }</b></p><p><b

120、>  else</b></p><p><b>  sym=nul;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p&

121、gt;  if(ch=='<')</p><p><b>  {</b></p><p><b>  getchdo;</b></p><p>  if(ch=='=')</p><p><b>  {</b></p><

122、;p><b>  sym=leq;</b></p><p><b>  getchdo;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  sym=lss;</b

123、></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  if(ch=='>')</p><p><b>  {</b

124、></p><p><b>  getchdo;</b></p><p>  if(ch=='=')</p><p><b>  {</b></p><p><b>  sys=geq;</b></p><p><b> 

125、 getchdo;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  sym=gtr;</b></p><p&g

126、t;<b>  }</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  sym=ssym[ch];</p><p>  if(sy

127、m!=period)</p><p><b>  getchdo;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b> 

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論