2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  畢業(yè)設計(論文)任務書</p><p><b>  第1頁</b></p><p> 畢業(yè)設計(論文)題目:C語言編譯器設計與實現(xiàn)畢業(yè)設計(論文)要求及原始數(shù)據(jù)(資料):1.C語言簡介和國內(nèi)外編譯器技術研究現(xiàn)狀;2.深入了解編譯器前端,包括詞法分析,語法分析, 語義分析;3.熟練掌握C語言語法及語法特點;4.深入分析編譯器編寫語言(C++);5.

2、設計并實現(xiàn)編譯過程中各個子過程,詞法分析,語法分析,語義分析;6.訓練檢索文獻資料和利用文獻資料的能力;7.訓練撰寫技術文檔與學位論文的能力。 </p><p><b>  第2頁</b></p><p><b>  第3頁</b></p><p>  C語言編譯器設計與實現(xiàn)</p><p>&l

3、t;b>  摘 要</b></p><p>  隨著計算機的廣泛應用,計算機程序設計語言也從初期的機器語言發(fā)展為匯編語言,以及現(xiàn)在的各種高級程序設計語言。而編譯技術是計算機語言發(fā)展的支柱,也是計算機科學中發(fā)展最迅速、最成熟的一個分支,他集中體現(xiàn)了計算機發(fā)展的成果與精華。</p><p>  其核心思想就是把同樣的邏輯結構和思想從一種語言表示的程序轉換為另外一種語言表示的程

4、序。從高級語言,甚至運行與虛擬平臺的高級語言,到機器語言,最終到硬件執(zhí)行的物理信號,這一層層的轉化,都涉及編譯技術的應用。</p><p>  本系統(tǒng)采用C++為編程語言。論文主要介紹了本課題的開發(fā)背景,所要完成的功能和開發(fā)的過程。重點的說明了系統(tǒng)設計的重點、設計思想、難點技術和解決方案。</p><p>  關鍵詞:編譯技術,編程程序,高級語言</p><p> 

5、 C language compiler design and Implementation</p><p><b>  Abstract</b></p><p>  With the wide application of the computer, computer programming languages ??are developed from the ea

6、rly machine language into assembly language , and now a variety of high-level programming language. The compiler technology is the backbone of computer language development, but also the fastest growing in computer scien

7、ce , a branch of the most mature , he epitomizes the essence of the computer and the fruits of development .</p><p>  The core idea is the same logical structure of the program and ideas expressed in the con

8、version from one language to another language program represented . From the high-level language , and even running with high-level language virtual platform to machine language , and ultimately to the hardware implement

9、ation of the physical signal , the layers of transformation involves application of compiler technology .</p><p>  System uses C++ as the programming language. Paper introduces the development background of

10、the topic, the development and function to complete the process. Note the focus of systems design, design ideas, technologies and solutions difficult. </p><p>  Key Words: Compiler technology,Programming pro

11、cedures,High-level programming language</p><p><b>  目  錄</b></p><p><b>  摘 要i</b></p><p>  Abstractii</p><p><b>  第一章 緒論1</b><

12、;/p><p>  1.1 開發(fā)背景1</p><p>  1.2 開發(fā)目標和意義1</p><p>  1.2 當前編譯器國內(nèi)外的發(fā)展情況2</p><p>  第二章 理論基礎4</p><p>  2.1 編譯系統(tǒng)概述4</p><p>  2.1.1 什么是編譯器4<

13、;/p><p>  2.1.2 編譯器的產(chǎn)生4</p><p>  2.2 編譯器的結構4</p><p>  2.3 編譯器的組織6</p><p>  2.3.1 編譯的分遍6</p><p>  2.3.2 分遍的設計6</p><p>  2.4 編譯器中的主要數(shù)據(jù)結構

14、7</p><p>  2.5 編譯程序的開發(fā)7</p><p>  2.5.1 歷史與發(fā)展7</p><p>  2.5.2 開發(fā)注意事項7</p><p>  2.5.3 編譯技術和軟件工具7</p><p>  第三章 C編譯器可行性分析及總體設計9</p><p> 

15、 3.1 可行性分析9</p><p>  3.1.1 經(jīng)濟可行性9</p><p>  3.1.2 技術可行性9</p><p>  3.1.3 運行可行性9</p><p>  3.1.4 時間可行性10</p><p>  3.1.5 法律可行性10</p><p> 

16、 3.2 C語言的基本描述10</p><p>  3.3 C編譯器的功能10</p><p>  3.4 C編譯器的程序結構11</p><p>  3.4.1 C編譯器的設計模式11</p><p>  3.4.2 C編譯器的文件組成12</p><p>  3.5 C編譯器中的主要數(shù)據(jù)結構

17、12</p><p>  第四章 C編譯器的實現(xiàn)14</p><p>  4.1 詞法分析階段14</p><p>  4.1.1 概述14</p><p>  4.1.2 C詞法分析程序的實現(xiàn)14</p><p>  4.1.3 關鍵字與標識符的識別16</p><p> 

18、 4.1.4 詞法識別具體實現(xiàn)16</p><p>  4.2 語法分析階段18</p><p>  4.2.1 概述18</p><p>  4.2.2 C語言抽象出來的文法規(guī)則19</p><p>  4.2.3 C語法分析程序的實現(xiàn)22</p><p>  4.3 語義分析階段27<

19、/p><p>  4.3.1 概述27</p><p>  4.3.2 C語言的語義27</p><p>  4.3.3 C的符號表27</p><p>  4.3.4 C語義分析程序的實現(xiàn)28</p><p>  4.4 中間代碼生成階段33</p><p>  4.4.1

20、概述33</p><p>  4.5 C編譯器的使用方法及測試33</p><p>  4.5.1 使用方法33</p><p>  4.5.2 測試源文件34</p><p>  4.5.3 測試詞法分析34</p><p>  4.5.4 測試語義分析及中間代碼生成35</p>

21、<p>  4.5.5 測試分析表文件的構造36</p><p><b>  參考文獻38</b></p><p><b>  致謝39</b></p><p><b>  第一章 緒論</b></p><p><b>  1.1 開發(fā)背景<

22、;/b></p><p>  隨著計算機科學技術的飛速發(fā)展,計算機技術被應用在了越來越廣泛的領域,實現(xiàn)各種各樣功能的計算機程序被大量地開發(fā)出來,應用在我們的生活、學習和工作當中。相應地,也產(chǎn)生了許多用以編寫這些計算機程序的高級程序設計語言。程序編制者通過特定語言的編譯器將自己編寫的源程序翻譯為特定機器上的目標程序,從而能夠最終達到程序執(zhí)行的目的。</p><p>  從20世紀60年

23、代以來,編譯器設計就一直是計算機研究發(fā)展和開發(fā)領域中的一個活躍主題。雖然編譯器設計已有很長的歷史,并且也是一門相對成熟的計算機技術,但編譯器畢竟是一種實現(xiàn)由高級語言源程序至機器或匯編指令的高效映射工具,隨著計算機軟、硬件水平的飛速發(fā)展,使得計算機應用日新月異,程序語言的設計在不斷地變化,目標機體系結構也在不斷地改進,軟件越來越復雜,其規(guī)模也越來越大。盡管編譯器設計問題在高級層次上沒有變化(或變化很?。?,但當我們深入其內(nèi)部研究時就會發(fā)現(xiàn),

24、編譯器的內(nèi)部構造其實也一直在變化。此外,由于我們能夠提供給編譯器本身使用的計算資源也在不斷增加。因此,現(xiàn)代編譯器可以采用比以前更耗費時間和空間的算法。當然,編譯技術研究人員也在繼續(xù)努力開發(fā)新的、更好的技術來解決傳統(tǒng)編譯器的一些設計性問題[1]。</p><p>  另一方面,很多編譯“前端”技術,如文法、正則表達式、語法分析器以及語法制導翻譯器等,仍然被廣泛使用。</p><p>  1.

25、2 開發(fā)目標和意義</p><p>  編譯器是一種相當復雜的系統(tǒng)程序,其代碼的長度可從幾千行到幾百萬行不等,所以編寫甚至讀懂這樣的一個程序都不是一件容易的事。絕大多數(shù)的計算機專業(yè)人員從來沒有編寫過一個完整的編譯器,但是,幾乎所有形式的計算均要用到編譯器,而且任何一個與計算機打交道的專業(yè)人員都應該掌握編譯器的基本結構和操作。除此之外,計算機應用程序中經(jīng)常遇到的一個任務就是有關命令解釋程序和界面程序的開發(fā),這比編

26、譯器的開發(fā)規(guī)模要小,但使用的卻是很類似的技術。因此,掌握編譯器的開發(fā)技術具有非常重大的實際意義。</p><p>  編譯器的設計的原理和技術還可以用于編譯器設計之外的眾多領域。因此,這些原理和技術通常會在一個計算機科學家的職業(yè)生涯中多次被用到。研究編譯器的編寫講設計程序設計語言、計算機體系結構、形式語言理論、算法和軟件工程。</p><p>  編譯器的設計從本質(zhì)上來說是一種工程活動,它

27、所使用的方法必須很好地解決現(xiàn)實中出現(xiàn)的各種翻譯問題(即用真實的語言編制且在真實的機器上能夠執(zhí)行的真實的程序)。大多數(shù)情況下,開發(fā)編譯器的人必須接受他們面對的語言和機器,很少能夠去影響或改善這兩者的設計。在開發(fā)過程中做什么樣的分析和轉換,以及什么時候去做,這些都是工程上的選擇,但正是這些選擇決定了一個編譯器的性能高低。本實驗就建立在一個自主開發(fā)的名為C的微型編譯器基礎之上,該編譯器雖然功能弱于像Turbo C或Borland Pascal

28、這樣的經(jīng)典編譯器,但也已經(jīng)完全具備了一個編譯器應有的所有特征。</p><p>  雖然本實驗只是一個規(guī)模很小的微型編譯器的開發(fā),但所謂“麻雀雖小,五臟俱全”,作為一次較為完整的編譯開發(fā)實踐,它已經(jīng)足夠讓我透徹地了解一個編譯器開發(fā)過程了,同時能更深刻地理解和運用編譯開發(fā)過程中的眾多技術和方法,并能在此基礎上針對編譯器的優(yōu)化展開深入的討論,這些對于自己以后的研究和發(fā)展方向?qū)⑵鸬椒浅4蟮耐苿幼饔谩?lt;/p>

29、<p>  C編譯器以C++語言作為開發(fā)語言,以Microsoft Visual Studio2012作為開發(fā)工具,C編譯器的各個階段以類的形式表示,最后以項目文件為單位來編譯生成C編譯器的可執(zhí)行文件。</p><p>  本實驗以Microsoft Visual Studio2012作為開發(fā)工具,用標準C++進行開發(fā),因此可以很好的的移植到其他平臺(比如:linux,用g++編譯生成可執(zhí)行文件)。

30、</p><p>  1.2 當前編譯器國內(nèi)外的發(fā)展情況</p><p>  在編譯器技術的發(fā)展過程中,如何提高編譯的效率一直是核心研究目標之一,編譯效率主要是根據(jù)該編譯器所生成的目標代碼在執(zhí)行過程中的時間指標和空間指標來衡量的,所以編譯優(yōu)化也必定圍繞時間和空間這兩個方面來實施。在編譯過程中針對代碼優(yōu)化的技術有很多,它們通常是通過搜集源代碼或中間代碼的特定信息,然后利用這些信息對代碼中的數(shù)

31、據(jù)結構或算法操作實施等價的改進變換,從而力求在時間效率和空間效率上達到一個最佳平衡點。編譯器的開發(fā)者們總是希望能夠?qū)⒏鞣N代碼優(yōu)化技術充分地運用在自己的編譯器設計中,但往往事與愿違,畢竟優(yōu)化操作本身也是需要付出開銷的。在C編譯器的開發(fā)過程中,雖然沒有運用到太復雜的代碼優(yōu)化技術,但通過本實驗的研究,在現(xiàn)有開發(fā)的C編譯器基礎之上,能夠在后續(xù)相關項目的開發(fā)中有效地提高程序代碼的編譯質(zhì)量,對于自己以后的研究和發(fā)展方向?qū)⑵鸬椒浅4蟮耐苿幼饔?。這正是

32、本實驗的研究意義所在。</p><p>  本實驗是以C微型編譯器的項目開發(fā)為基礎,該項目的開發(fā)目標是自定義一種C高級語言,然后編碼實現(xiàn)出C語言的編譯器(稱為C編譯器),完成將C語言源程序翻譯為基于MM機(Mini Machine)的目標代碼的任務,這是本實驗的實際應用背景。</p><p>  編譯器的開發(fā)具有極高的實用價值和意義,高級語言編譯器的性能決定了基于該語言平臺所開發(fā)出的軟件的

33、質(zhì)量。所以國內(nèi)外很多大學的科研和技術人員也在積極地開展這方面的技術探索和項目實踐。他們大多是以特定的軟件項目為背景來進行一些與編譯器開發(fā)相關或類似的研究分析,他們的研究目標大多是基于某種實驗型高級語言的編譯器開發(fā)和優(yōu)化改進,然后把有價值的研究成果移植或運用到產(chǎn)品級的編譯器開發(fā)中(比如.NET平臺編譯器)。</p><p>  最近十年以來,國外關于編譯器設計的發(fā)展動態(tài)主要體現(xiàn)在:首先,編譯器采用了大量的更加復雜的

34、算法,主要用于推斷或簡化程序中的信息,這又與更為復雜的程序設計語言的發(fā)展結合在一起,其中典型的有用于函數(shù)語言編譯的Hindley-Milner類型檢查的統(tǒng)一算法[2]。其次,編譯器已越來越成為基于窗口的可視化交互開發(fā)環(huán)境(Interactive Development Environment,IDE)的一部分,該環(huán)境還包括了智能編輯器、連接程序、調(diào)試程序以及項目管理程序等,已經(jīng)成為了事實上的編譯器行業(yè)標準。另一方面,盡管國內(nèi)外的專家學者

35、們近年來在編譯原理領域進行了大量的研究,但是基本的編譯器設計原理在近20年中都沒有多大的改變,它現(xiàn)在正迅速地成為計算機科學課程中的中心環(huán)節(jié)之一。</p><p>  在九十年代,作為GNU項目或其它開放源代碼項目的一部分,許多免費的編譯器或編譯器構造工具被開發(fā)出來。這些工具可用來編譯數(shù)種程序設計語言的源程序(典型的就是GCC)。它們中的一些項目被認為是高質(zhì)量的,而且對現(xiàn)代編譯理論感興趣的人都可以較容易地得到它們的

36、免費源代碼。典型的是在1999年,SGI公布了他們的一個工業(yè)化的并行優(yōu)化編譯器Pro64的源代碼,隨后被全世界多個編譯器研究小組用做研究平臺,并命名為Open64。Open64的設計結構好,分析優(yōu)化全面,是編譯器高級研究的理想平臺。</p><p>  反觀國內(nèi),現(xiàn)階段對于編譯技術的相關研究,基本上都是著眼于特定編譯器的特定部分來展開的,而本實驗將研究和分析的重點主要集中于一個完整的微型編譯器的構造的討論。<

37、;/p><p><b>  第二章 理論基礎</b></p><p>  2.1 編譯系統(tǒng)概述</p><p>  2.1.1 什么是編譯器</p><p>  編譯器,是將便于人類編寫、閱讀、維護的計算機高級語言程序翻譯為機器能夠識別、運行的計算機低級語言程序的一種系統(tǒng)軟件。編譯器將源程序(Source Program

38、)作為輸入,翻譯產(chǎn)生使用目標語言的等價目標程序((Target Program)。其中,源程序一般為高級語言(High-level language),如Pascal,C++等,而目標語言則是匯編語言或目標機器的機器語言[3]。編譯器的這一作用如圖2-1所示:</p><p>  圖2-1 編譯器的作用</p><p>  2.1.2 編譯器的產(chǎn)生</p><p>

39、;  本世紀四十年代,由于馮·諾依曼在存儲程序計算機方面的先鋒作用,使得編寫一串代碼或程序已成為可能和必要,這樣計算機就可以執(zhí)行所需的計算。在初期,這些程序都是用機器語言編寫,編寫或維護這樣的代碼是非??菰锓ξ肚倚实拖碌模詸C器語言很快就被匯編語言代替了。匯編語言大大提高了程序編寫速度和準確度,但它也有許多缺點。于是發(fā)展編程技術的下一個重要革新就是以一個更加類似于數(shù)學定義或自然語言的簡潔形式來編寫程序的功能操作,它應與任何

40、機器都無關,而且也可由一個程序翻譯為可執(zhí)行的代碼。</p><p>  隨著對形式語言和自動機理論的研究,人們對高級程序設計語言的認識越來越深,對編譯器結構的設計也越來越清晰。人們通過對形式語言文法規(guī)則的研究,相當完善地解決了分析問題。當分析問題變得相對成熟時,設計者們又花費了很多的精力來研究這一部分的編譯器的自動構造,這就是分析程序生成器(parser generator)最初的雛形。類似地,對有窮自動機的研究

41、也促進了一種稱為掃描程序生成器(scanner generator)工具的發(fā)展。接著,人們又深化了生成有效目標代碼的方法,這些就構成了傳統(tǒng)的編譯器,在這個過程中運用到的技術被一直使用至今。</p><p>  2.2 編譯器的結構</p><p>  嚴格地說,編譯器是一個將高級語言源程序轉換成能在一臺計算機上執(zhí)行的等價目標代碼或機器語言程序的軟件系統(tǒng)。這個定義可擴展到包含將一個高級語言

42、程序轉換成匯編語言程序的系統(tǒng),將一個高級語言程序轉換成另一種高級語言程序的系統(tǒng),從一個機器語言程序轉換成另一種機器語言程序的系統(tǒng),從一種高級語言程序轉換成一種中間語言程序的系統(tǒng),等等。</p><p>  在通常情況下,一個編譯器應由一系列的階段組成,這些階段從要編譯的源程序的字符序列開始,依次對一個給定形式的程序進行分析,并得到一種新的表示形式,在大多數(shù)情況下最終產(chǎn)生一個可以與其他目標代碼鏈接,并裝入一臺機器的

43、存儲器中執(zhí)行的可重定位目標模塊。這一編譯過程一般由如下6個階段構成,它們執(zhí)行不同的邏輯操作如圖2-2所示[4]:</p><p> ?。?) 掃描程序(scanner)</p><p>  在這個階段,編譯器閱讀源程序(通常以字符流的形式表示,比如本實驗設計的C語言的源程序.c),由掃描程序執(zhí)行詞法分析(lexical analysis):它將字符序列收集到稱為記號(token)的單元中,

44、也就是說,將其識別為一個個符合編程語言詞法規(guī)范的單詞符號。實際上,一個掃描程序所做的工作與自然語言中對英文單詞的拼寫是十分類似的。掃描程序還可完成與識別記號一起執(zhí)行的其他操作,例如,可將相應的記號輸入到對應的符號表中。</p><p> ?。?) 語法分析程序(parser)</p><p>  語法分析程序從掃描程序中獲取記號形式的代碼,并完成定義程序結構的語法分析(syntax ana

45、lysis),根據(jù)語言的語法規(guī)則將上階段產(chǎn)生的單詞串分解成各類語法單位(如表達式、語句、子過程等),這與自然語言中關于某篇文章的句子的語法分析類似。語法分析定義了程序的結構元素及其關系。通常將語法分析的結果表示為分析樹或語法樹。</p><p> ?。?) 語義分析程序(semantic analyzer)</p><p>  程序的語義就是它的“意思”,程序如何運行以及運行結果都由它的語

46、義來決定。大多數(shù)程序設計語言具有在執(zhí)行之前被確定語義的特征,這些特征不容易用語法結構表示,更無法用詞法分析程序進行分析,這些特征被稱為靜態(tài)語義。語義分析程序的職責就是分析這樣的語義,為代碼生成階段搜集相關的語義信息。一般程序設計語言的典型靜態(tài)語義有聲明和類型檢查。而在程序執(zhí)行階段才能確定的程序特性稱為動態(tài)語義,語義分析程序無法對這類特性做出分析。語義分析程序還要計算被稱為屬性(attribute)的程序固有信息,如數(shù)據(jù)類型、值等。語義分

47、析程序通常將計算后的屬性值添加到語法樹中(也可將屬性添加到符號表中)。</p><p> ?。?) 源代碼優(yōu)化程序(source code optimizer)</p><p>  完善的編譯器通常包括許多代碼改進和優(yōu)化步驟。這些優(yōu)化和改進一般是在語義分析之后完成的。在語法分析和語義分析的基礎之上,將源程序變換為等價的中間代碼。所謂中間代碼,是指一種結構簡單、含義明確、形式多樣化的記號系統(tǒng)

48、,它比較容易能轉換為目標代碼。優(yōu)化程序?qū)⒃创a以中間代碼(intermediate code)的形式輸出,進而完成對源代碼的相應優(yōu)化處理,目的是使將來生成的目標代碼更為高效(即省時間、省空間)。</p><p>  (5) 代碼生成器(code generator)</p><p>  這是編譯的最后必備階段,它將中間代碼(或經(jīng)優(yōu)化后的中間代碼)轉換成特定機器上的絕對指令代碼或可重新定位的

49、指令代碼或匯編指令代碼。由于該階段的工作與硬件系統(tǒng)結構和機器指令含義有關,涉及到硬件系統(tǒng)功能部件的運用、機器指令的選擇、各種數(shù)據(jù)的存儲空間分配以及寄存器調(diào)度等,也就是說目標機器的特性成為了主要因素,所以這個階段的工作相當復雜。正是出于這點考慮,本實驗設計選擇了與機器指令無關的三地址碼的四元式表示形式。</p><p> ?。?) 目標代碼優(yōu)化程序(target code optimizer)</p>

50、<p>  在這個階段中,編譯器嘗試著改進由代碼生成器生成的目標代碼。這種改進包括對編址模式的選擇、提高性能、將速度慢的指令更換成速度快的以及刪除多余的操作等。</p><p>  除了這6個階段,編譯器通常還包含一張符號表和訪問該表的若干例程,以及針對編譯過程中發(fā)現(xiàn)的各種錯誤進行檢查和處理的錯誤處理程序,它們在編譯過程的所有階段都會使用到。</p><p>  上述編譯過程的

51、階段劃分只是一個典型模式,事實上并非所有的編譯程序都分成這6個階段,有些編譯程序并不生成中間代碼,有些編譯程序并不進行優(yōu)化,有些最簡單的編譯程序甚至在語法分析的同時產(chǎn)生目標代碼。編譯器生成的目標代碼可以是可重定位目標代碼或匯編代碼,如果是匯編代碼則需要再用匯編器來生成可重定位目標代碼,本實驗設計的C編譯器生成的目標代碼是三地址碼的四元式表示形式。</p><p>  2.3 編譯器的組織</p>

52、<p>  2.3.1 編譯的分遍</p><p>  在2.2節(jié)中我們討論了一個編譯器的典型結構,簡要介紹了編譯器的6個階段各自應完成的基本工作,并通過圖2-2指出了它們之間的相互關系,但需要注意的是,這些關系僅代表它們之間的邏輯關系,并不一定就是執(zhí)行時間上的先后順序。事實上,可按不同的執(zhí)行流程來組織上述各階段的工作,這在很大程度上依賴于編譯過程中對源程序掃描的遍數(shù),以及如何劃分各遍掃描所進行的工作

53、。這里所說的“遍”,是指對源程序或其內(nèi)部表示從頭到尾掃視一次,并進行有關的加工處理工作,每一遍的工作都是從獲取上一遍的工作結果開始,經(jīng)過本遍的加工后,將結果保存起來以便交給下一遍[5]。例如,對于要求經(jīng)一遍掃描就能完成從源代碼到目標代碼翻譯的編譯程序,我們可以語法分析程序為中心來組織它的工作流程,這樣就不必產(chǎn)生中間代碼,顯然,這種做法所得到的目標代碼的質(zhì)量是不能保證的,總體來說弊大于利。</p><p>  對于

54、絕大部分語言(例如Pascal或C),實現(xiàn)一遍掃描的編譯程序是非常困難的,所以宜于采用多遍掃描的編譯程序結構。具體的做法是將整個編譯程序劃分為若干個相繼執(zhí)行的模塊,每一模塊都對它前一模塊的輸出掃描一遍,并在掃描過程中完成前述6個階段中的一個或幾個,然后將工作結果保存下來供下一模塊加工。顯然,第一個模塊所掃描的是字符序列形式的源程序,最后一個模塊所輸出的是目標代碼,而每一個中間模塊輸出的是與源程序等價的內(nèi)部表示或中間代碼。</p&g

55、t;<p>  2.3.2 分遍的設計</p><p>  在設計一個編譯程序時,如何確定掃描遍數(shù),如何組織各遍中的工作,主要取決于源語言的具體情況及編譯程序運行的具體環(huán)境,如語言的結構、計算機軟硬件的配置,以及對編譯程序本身運行效率的要求等等。一般而言,多遍掃描源程序具有如下優(yōu)點:</p><p>  (1) 由于采用了模塊結構,各遍掃描的功能相對獨立,整個編譯程序的結構

56、比較清晰。</p><p> ?。?) 由于對源程序及其內(nèi)部表示進行多次掃視和加工,有利于進行比較細致和充分的代碼優(yōu)化處理。</p><p>  (3) 由于可將編譯程序按模塊依次調(diào)入內(nèi)存,有利于采用覆蓋技術,以減少執(zhí)行編譯程序時所占的內(nèi)存空間。</p><p>  由于分遍問題對具體語言及編譯程序的運行環(huán)境有很強的依賴性,經(jīng)過權衡,本實驗設計的編譯器采用了簡單的1

57、遍掃描策略。</p><p>  2.4 編譯器中的主要數(shù)據(jù)結構</p><p>  當然,編譯器的各個階段使用的算法與支持這些階段的數(shù)據(jù)結構之間的交互是非常密切的。編譯器的編寫者在實施這些算法的同時應盡可能地保證它們不過于復雜,最理想的情況是:該編譯器在編譯時所耗費的時間與程序大小成線形比例,即時間復雜度為O(n)。能否達到這樣的理想情況,很大程度上取決于所采用的數(shù)據(jù)結構,它們是各個階

58、段都需要使用到的,并用來在各階段之間交流信息。通常編譯器中的主要數(shù)據(jù)結構包括:記號、語法樹、符號表、常數(shù)表、中間代碼、臨時文件等。 </p><p>  2.5 編譯程序的開發(fā)</p><p>  2.5.1 歷史與發(fā)展</p><p>  在編譯器開發(fā)的原始階段,人們主要用機器語言或匯編語言來構造編譯程序,難度極大且效率很低?,F(xiàn)在的大部分編譯器是用某種高級語言

59、開發(fā)的,這樣更節(jié)約時間,而且易讀、易改、易移植,同時也便于進行編譯器的優(yōu)化設計。相信在不久的將來,編譯器的開發(fā)將主要借助于成熟的自動化生成編譯程序技術。</p><p>  2.5.2 開發(fā)注意事項</p><p> ?。?) 源語言:對被編譯的源語言,要深刻理解其結構和含義。在定義C語言的過程中,是通過嚴格制定其詞法規(guī)則、語法規(guī)則和語義規(guī)則來達到的。</p><p&

60、gt; ?。?) 目標語言: C編譯器的目標語言選擇為三地址的四元表達式。</p><p> ?。?) 編譯技術:詞法分析、語法分析、語義分析、代碼優(yōu)化及代碼生成的相關技術有很多,必須根據(jù)所開發(fā)的編譯器的需求和特點來選擇最合適的編譯技術和方法。關于C編譯器中使用到的編譯技術可詳細參考論文第四章。</p><p> ?。?) 各種具體因素:例如系統(tǒng)功能要求、硬件開發(fā)環(huán)境、軟件開發(fā)工具等。&l

61、t;/p><p>  2.5.3 編譯技術和軟件工具</p><p>  為了提高軟件開發(fā)的效率和保證開發(fā)質(zhì)量,人們除了要遵循軟件工程中對軟件開發(fā)過程的規(guī)范化或標準化之外,還應盡量使用先進的軟件開發(fā)技術和相應的軟件工具,而大部分軟件工具的開發(fā),常常要用到編譯技術和方法。實際上編譯程序本身也是一種軟件開發(fā)工具。為了提高編程效率,縮短調(diào)試時間,軟件工作人員研制了不少對源程序處理的工具,這些工具的

62、開發(fā)不同程度地用到編譯程序各個部分的技術和方法,典型的有下面幾種[7]:</p><p> ?。?) 語言的結構化編輯器:結構化編輯器是引導用戶在語言的語法制導下編制程序,能自動地提供關鍵字和與其匹配的關鍵字,這樣可以減少語法上的錯誤,加快對源程序的輸入和調(diào)試,提高效率和質(zhì)量?,F(xiàn)在的可視化開發(fā)工具基本都具備了這個功能。</p><p>  (2) 語言程序的調(diào)試工具:調(diào)試是軟件開發(fā)過程中一

63、個重要環(huán)節(jié),凡是對算法的實現(xiàn)錯誤或程序沒能反映算法的功能等錯誤就需用調(diào)試器來協(xié)助解決。調(diào)試器的功能越強則實現(xiàn)越復雜,它必須與語法分析、語義處理有緊密聯(lián)系。</p><p>  (3) 語言程序測試工具:對源程序進行語法分析并制定相應表格,檢查變量定值與引用的關系;也可在源程序的適當位置插入某些信息,并用測試用例記錄程序運行時的實際路徑,將運行結果與期望的結果進行比較分析,幫助編程人員快速查找問題所在。</p

64、><p> ?。?) 高級語言之間的轉換工具:為了減少重新編制程序所耗費的人力和時間,就要解決如何把一種高級語言轉換成另一種高級語言,乃至匯編語言轉換成高級語言的問題,這種異種程序設計語言之間的翻譯轉換工作要對被轉換的語言進行詞法和語法分析,只不過生成的目標語言是另一種高級語言而已,這與實現(xiàn)一個完整的編譯程序相比工作量要少些。</p><p> ?。?) 并行編譯技術:隨著并行機及多處理機的發(fā)

65、展,對軟件的并行處理提出了新的要求,特別是并行編譯技術發(fā)展很快。運用重構技術把已有的串行語言編寫的程序經(jīng)過分析分解成可并行的成分,然后分配到多處理機上運行。如果編程人員能按程序設計情況寫出并行語言程序,那么兩者結合將產(chǎn)生更高的效率。</p><p>  第三章 C編譯器可行性分析及總體設計</p><p>  3.1 可行性分析 </p><p>  3.1.1 經(jīng)

66、濟可行性</p><p>  經(jīng)濟可行性研究是對組織的經(jīng)濟現(xiàn)狀和投資能力進行分析,對系統(tǒng)建設運行和維護費用進行估算,對系統(tǒng)建成后可能取得的社會和經(jīng)濟效益進行估計。由于本系統(tǒng)是作為畢業(yè)設計由我們自己開發(fā)的,在經(jīng)濟上的投入甚微,系統(tǒng)建成之后將為今后C源程序的編譯提供很大的方便,估算新系統(tǒng)的開發(fā)費用和今后的運行、維護費用,估計新系統(tǒng)將獲得的效益,并將費用與效益進行比較,看是否有利。開發(fā)、運行和維護費用主要包括:<

67、/p><p>  購買和安裝設備的費用:無。軟件開發(fā)費用:若由實習單位的技術人員開發(fā),則該項費用可以計入下面的人員費用一項;人員費用:系統(tǒng)開發(fā)人員、操作人員和維護人員的工資、培訓費用等;消耗品費用:系統(tǒng)開發(fā)所用材料、系統(tǒng)正常運行所用消耗品,例如水、電費,打印紙、軟盤、色帶等開支。所有開支都不大,所以經(jīng)濟上是可行的。</p><p>  3.1.2 技術可行性</p><p

68、>  技術可行性要考慮現(xiàn)有的技術條件是否能夠順利完成開發(fā)工作,軟硬件配置是否滿足開發(fā)的需求等。C編譯系統(tǒng)用的是標準C++開發(fā)語言,調(diào)試相對簡單,當前的計算機硬件配置也完全能滿足開發(fā)的需求,因此在技術上是絕對可行的。軟件方面:由于目前BS模式軟件相對發(fā)展成熟,故軟件的開發(fā)平臺成熟可行,它們速度快、容量大、可靠性能高、價格低,完全能滿足系統(tǒng)的需求。</p><p>  3.1.3 運行可行性</p>

69、;<p>  對新系統(tǒng)運行后給現(xiàn)行系統(tǒng)帶來的影響(包括組織機構、管理方式、工作環(huán)境等)和后果進行估計和評價。同時還應考慮現(xiàn)有管理人員的培訓、補充,分析在給定時間里能否完成預定的系統(tǒng)開發(fā)任務等。</p><p>  運行可行性是對組織結構的影響,現(xiàn)有人員和機構和環(huán)境對系統(tǒng)的適應性及人員培訓補充計劃的可行性。當前我國信息化技術已經(jīng)相當普及,各類操作人員水平都有相當?shù)母叨龋栽谶\行上是可行性的。<

70、/p><p>  本系統(tǒng)的開發(fā),是用典型的VS2012或者其他c++編譯工具開發(fā),主要是對算法的處理,包括詞法分析和分析表的構造,及目標代碼的輸出。已無技術上的問題。</p><p>  3.1.4 時間可行性</p><p>  從時間上看,在兩個月的時間里學習相關知識,并開發(fā)C編譯器系統(tǒng),時間上是有點緊,但是不是不可能實現(xiàn),通過兩個多月的努力功能應該基本實現(xiàn)。&l

71、t;/p><p>  3.1.5 法律可行性</p><p> ?、?所有技術資料都為合法。</p><p>  ② 開發(fā)過程中不存在知識產(chǎn)權問題。</p><p> ?、?未抄襲任何已存在的會員信息管理系統(tǒng),不存在侵犯版權問題。</p><p> ?、?開發(fā)過程中未涉及任何法律責任。</p><p&

72、gt;  綜上所述,本系統(tǒng)的開發(fā)從技術上、從經(jīng)濟上、從法律上都是完全可靠的。</p><p>  3.2 C語言的基本描述</p><p>  C語言是本實驗設計要實現(xiàn)的一種微型語言的名稱,該語言的源程序為文本形式的ASCII字符序列??紤]到針對現(xiàn)有的處理器來說,如果使用真正的機器代碼作為C編譯器的目標語言會太過于復雜,所以C語言將目標程序簡化為三地址碼的四元式表示形式。可在任意一種文本

73、編輯器中編輯C語言的源程序并保存為擴展名為.c的文件,然后用命令行的形式調(diào)用C編譯器(C.EXE)對該源程序進行編譯,經(jīng)過詞法分析、語法分析并在此基礎上展開語義處理,如果源程序中沒有錯誤,則最終生成目標代碼即三地址碼的四元式表示形式。這種四元式表達式更接近于中間語言形式,由于這種形式的中間語言便于優(yōu)化處理,因此是一種比較普遍采用的中間代碼形式。</p><p>  C語言的程序結構很簡單,它的語法與C相似但規(guī)模小

74、于C語言。C源程序是一個由分號分隔開的語句序列。C只有兩個控制語句:if語句和while 語句,這兩個控制語句本身也可包含語句序列。if語句有一個可選的else部分。除此之外,還有數(shù)據(jù)的輸入和輸出(輸入語句一次只讀入一個變量,而輸出語句一次只輸出一個表達式)。</p><p>  C的表達式也局限于布爾表達式和整型算術表達式。布爾表達式由對兩個算術表達式的比較組成,所有比較使用<和=比較運算符。算術表達式可

75、以包括整型常數(shù)、變量、參數(shù)以及4個整型算符+、-、*、/,它們具備和通用語言相似的數(shù)學屬性。布爾表達式通常只作為測試條件出現(xiàn)在控制語句中。</p><p>  雖然缺少實用程序設計語言(如C、Pascal)所需要的許多特征——比如數(shù)組和指針等,但作為一次完整的編譯開發(fā)實踐,它已經(jīng)足夠體現(xiàn)出一個編譯器的開發(fā)過程了。</p><p>  3.3 C編譯器的功能</p><

76、p>  C編譯器的主要任務是分析基于C語言規(guī)范的字符組成的C源程序,把它們識別為一個個具有獨立意義的單詞符號(Token),并識別其有關屬性再轉換成長度統(tǒng)一的屬性字,以供后續(xù)語義部分分析使用。簡單的說,C編譯器的功能就是掃描C源程序,識別單詞,轉換成屬性字,再經(jīng)過語義處理和代碼生成,最終得到目標代碼文件即三地址四元表達式。</p><p>  一般的說,C編譯器實現(xiàn)了下列幾項功能: </p>

77、<p>  (1)從C源程序中逐一取出單詞。</p><p>  (2)生成LR(1)分析表。</p><p> ?。?)識別單詞的屬性并填入構造好的符號表中。</p><p>  (4)將單詞轉換成屬性字,并輸出二元組屬性字流。</p><p> ?。?)將符號表提供給語義分析程序加工處理。</p><p>

78、;  (6)生成目標代碼。</p><p> ?。?)提供基本出錯處理。</p><p>  3.4 C編譯器的程序結構</p><p>  3.4.1 C編譯器的設計模式</p><p>  C編譯器用C++實現(xiàn),下面是主要類的類圖:</p><p>  圖3-1 C++實現(xiàn)C語言編譯器的類圖</p>

79、;<p>  主控模塊main.cpp:C編譯器的主程序。</p><p>  文法類ReadCfg:文法規(guī)則類,定義C語言文法的規(guī)則。</p><p> ?。?)詞法掃描類Scanner:關鍵字、算符與界符將直接形成Token字;標識符將插入符號表后形成Token字,數(shù)字將插入常數(shù)表后形成Token字。</p><p>  (4) 詞法掃描類Scan

80、ner:將源程序的字符序列收集到稱作記號(token)的有意義單元中,即完成與語言單詞拼寫相類似的任務。</p><p> ?。?) LR(1)分析表的構造類Grammer:根據(jù)C語言文法的特點,夠造出相應的分析表(包括ACTION表和GOTO表)。</p><p> ?。?) 語法分析類Lr:將語言結構的語義以屬性(attribute)的形式賦予代表此結構的文法符號,而屬性的計算以語義規(guī)

81、則(semantic rules)的形式賦予由文法符號組成的產(chǎn)生式;在語法分析推導或歸約的每一步驟中,通過語義規(guī)則實現(xiàn)對屬性的計算,以達到對語義的處理。</p><p>  3.4.2 C編譯器的文件組成</p><p>  表3-1 C編譯器的文件組成</p><p>  基類Token,它包括了編譯器中各種數(shù)據(jù)類型的定義和整個編譯器均可能使用到的全局變量的定義

82、。ReadCfg類從文件讀取C語言文法,并保存在文法結點Cfg_node中。C語言文法總結出有57個產(chǎn)生式,終結符(terminal)31和存放在set<int>terminal中,非終結符26個,存放在set<int>nonterminal中。Scanner類是詞法分析的類,成員函數(shù)scan()每次返回一個Token字。Grammer類主要負責大量數(shù)據(jù)結構的保存和LR(1)分析表的構造,最終分析表存放在ac

83、tion_goto_table.txt中。Lr類的包含語法分析的總控程序,用成員函數(shù)analyse()實現(xiàn)對語法的分析,在語法分析推導或歸約的每一步驟中,通過語義規(guī)則實現(xiàn)對屬性的計算,以達到對語義的處理。main.c 文件是C編譯器的主程序,它負責整個程序的掌控。</p><p>  3.5 C編譯器中的主要數(shù)據(jù)結構</p><p>  下面列舉出在C編譯器中使用到的主要數(shù)據(jù)結構,它們通

84、常在編譯的多個階段都需要使用到,并用來在各階段中共享一些特定數(shù)據(jù)[8]。</p><p> ?。?) 記號(token)</p><p>  當掃描程序?qū)⑷舾蓚€字符收集到一個記號中時,它通常是以符號表示這個記號的,也就是說,用一個枚舉數(shù)據(jù)類型的值來表示源程序的記號集。有時還必須保留字符串本身或由此派生出的其他信息(例如:與標識符記號相關的名字或數(shù)字記號值)。在C編譯器中,掃描程序一次只需要

85、生成一個記號(這稱為單符號先行),考慮到這種情況,可以用全程變來量放置記號信息。</p><p> ?。?) 符號表(symbol table)</p><p>  符號表中的信息與標識符(函數(shù)、變量、常量以及數(shù)據(jù)類型等)有關。它幾乎與編譯器的所有階段交互:掃描程序、分析程序或?qū)俗R符輸入到表格中的語義分析程序;語義分析程序?qū)⒃黾訑?shù)據(jù)類型和其它語義信息;優(yōu)化階段和代碼生成階段也將利用由符號

86、表提供的信息生成正確而恰當?shù)拇a。因為在編譯的全程中對符號表的訪問非常頻繁,所以插入、刪除和訪問等符號表操作都必須比常規(guī)操作更有效。盡管可以使用各種樹的結構,但雜湊表卻是能達到這一要求的最理想的數(shù)據(jù)結構。</p><p> ?。?) 項目(item)</p><p>  在文法G中,某個產(chǎn)生式的右部標上“點號”的產(chǎn)生式,再放置一個向前所搜符號a,成為LR(1)項目。每個LR(1)項目集簇由

87、若干狀態(tài)組成,每個狀態(tài)由若干項目組成。因此,對于構建項目集簇,項目的操作相當頻繁,如何表示和處理項目成為構造分析表的重點。</p><p> ?。?) 中間代碼(intermediate code)</p><p>  根據(jù)中間代碼的類型(例如三元式代碼和P-代碼)和優(yōu)化的類型,該代碼可以是字符串數(shù)組(指針數(shù)組)、臨時文本文件或是結構的連接列表。對于進行復雜優(yōu)化的編譯器,應特別注意選擇允許

88、簡單重組的中間代碼表示。</p><p>  第四章 C編譯器的實現(xiàn)</p><p>  C編譯器從整體上被劃分為4個階段:詞法分析、語法分析、語義分析、代碼生成,這4個階段分別用不同的程序模塊來實現(xiàn)(如表3-1)。一個C源程序經(jīng)過C編譯器的編譯之后,生成三地址的四元表達式目標代碼,在整個編譯過程中,這4個階段分別承擔了相應的翻譯任務。</p><p>  4.1

89、 詞法分析階段</p><p><b>  4.1.1 概述</b></p><p>  編譯器的詞法分析階段可將源程序讀作有序字符文件并將其掃描分解為若干個記號(token)。記號與自然語言中的單詞類似:每一個記號都是表示源程序中信息單元的字符序列。典型的有:關鍵字(keyword),例如if和while,它們是字母的固定串,在該語言中具有特定的含義;標識符(i

90、dentifier)是由用戶定義的串,它們通常由字母和數(shù)字組成并由一個字母開頭,例如變量名函數(shù)名等;算符符(operation symbol)在語言中是作為語法上的運算符號使用的。例如,+,-,*,/,(,),和++, --, <=;界符在語言中作為語法上的分界;數(shù)字,廣義上就是源程序中的字面值。</p><p>  如前所述,詞法分析程序的輸入是源程序字符串,輸出是與源程序等價的符號序列。作為詞法分析程序

91、的符號可以有各種不同的內(nèi)部表現(xiàn)形式,原則是不同的符號能彼此區(qū)別開且有唯一的表示。</p><p>  為了便于編譯程序的進一步加工(語法分析),內(nèi)部表示的符號都按屬性字形式,因此,詞法分析程序的輸出即是屬性字序列,采用二元式來表示一個單詞符號的內(nèi)部形式。</p><p>  表4-1 詞法Token字</p><p>  這五類單詞將用不同的方法處理。關鍵字、算符與

92、界符將直接形成Token字;標識符將插入符號表后形成Token字,數(shù)字將插入常數(shù)表后形成Token字。 </p><p>  在實際做詞法分析時,考慮了所有的C語言現(xiàn)象,使得每一個C語言程序都可以被此法分析切割為單詞并且賦值上屬性。</p><p>  一般情況下,可以通過兩種途徑來設計詞法分析程序。一種是用手工方式構造,另一種是所謂詞法分析程序的自動生成。為了實現(xiàn)簡單,本實驗采取手工構造

93、方式。</p><p>  4.1.2 C詞法分析程序的實現(xiàn)</p><p>  C語言的記號分為5種類型:標示符,關鍵字,數(shù)字,算符和界限符。關鍵字一共有8個,它們的含義類似于標準C語言中的相應關鍵字。特殊符號共有12種:分別是4種基本的整數(shù)運算符號,5種比較符號(等號、小于號、小于等于、大于、大于等于),以及左括號、右括號、分號、賦值符號。其中,除了比較等號、小于等于符號和大于等于是

94、兩個字符的長度之外,其余均為單個字符。“其他”記號就是數(shù)和標識符了,數(shù)是一個或多個數(shù)字的序列,而標識符又是一個或多個字母的序列。所有這些記號歸納如下表4-2:</p><p>  表4-2C語言的記號</p><p>  除了上表的記號之外,C語言的源程序還要遵循以下的詞法規(guī)則:代碼應是自由書寫格式;空白符由空格、制表位和新行組成。</p><p>  根據(jù)對語言中

95、各類單詞某種描述的定義,用手工方式構造詞法分析程序。</p><p>  詞法分析程序的主要任務就是掃描程序、識別單詞、轉換并輸出屬性字。下面給出單獨成趟詞法分析控制流程圖。</p><p>  圖4-1 單獨成趟的詞法分析控制流程圖</p><p>  詞法分析主要包含在Scanner.h和Scanner.cpp文件中,其核心函數(shù)是scan( ),它每次從第一個非

96、空格或換行符開始識別,直到遇到空格或者換行符,遇到單行注釋就跳過本行從“//”開始的以后字符識別,遇到多行注釋就跳過直到遇到“*/”為止(不支持注釋嵌套)。每次返回一個識別的單詞,遇到不識別的單詞就報錯,輸出不識別的單詞和該單詞的行數(shù)。</p><p>  掃描程序在識別出每個記號的同時,還會計算出該記號的特性(比如串值)這五類單詞將用不同的方法處理。關鍵字、算符與界符將直接形成Token字;標識符將插入符號表后

97、形成Token字,數(shù)字將插入常數(shù)表后形成Token字。 </p><p>  Token是本實驗的所有類的基類,有2個成員變量:Tag,Value。Value是文法中非終結符,而Tag是Value對應的唯一標記。</p><p>  4.1.3 關鍵字與標識符的識別</p><p>  C對于關鍵字的識別,是通過先將它們看作是標識符,然后再調(diào)用Token類的get

98、_int()方法,根據(jù)返回值Tag是否22(標示符的標志)為來判斷是標示符還是關鍵字。</p><p>  4.1.4 詞法識別具體實現(xiàn)</p><p>  //分析一個單詞,并返回單詞的Token字</p><p>  Token Scanner::scan()</p><p><b>  {</b></p&g

99、t;<p><b>  int i=0;</b></p><p><b>  string s;</b></p><p>  static char prev_c = 0;</p><p>  char line[Token::NAME_SIZE] = {0};</p><p>  p

100、rev_c = c;</p><p>  while (true)</p><p><b>  {</b></p><p>  if (fin.get(c)==NULL)//到文件結尾</p><p>  return (Token());</p><p>  if (c=='\n&

101、#39;)//遇到換行符</p><p>  linenum++;//行數(shù)+1</p><p>  else if (c==' ' || c=='\t')//遇到空格或者制表符</p><p>  continue;//跳過,繼續(xù)讀</p><p>  else//遇到普通字符,跳出循環(huán)

102、</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  //遇到注釋的情況</b></p><p>  while (c=='/' && (fin.peek()=='/

103、9; || fin.peek()=='*'))</p><p><b>  {</b></p><p><b>  //處理注釋</b></p><p>  } //end while</p><p>  if (isalpha(c))//字母</p><p

104、>  return (alpha_process());</p><p>  else if (isdigit(c))//數(shù)字</p><p>  return (digit_process());</p><p>  else//其他</p><p><b>  {</b></p&

105、gt;<p>  switch(c)//對字符進行分析</p><p><b>  {</b></p><p><b>  case '+':</b></p><p><b>  {...}</b></p><p><b>  cas

106、e '-':</b></p><p><b>  {...}</b></p><p><b>  case '*':</b></p><p><b>  {...}</b></p><p><b>  case '/

107、':</b></p><p><b>  {...}</b></p><p><b>  case '=':</b></p><p><b>  {...}</b></p><p><b>  case '<'

108、:</b></p><p><b>  {...}</b></p><p><b>  case '>':</b></p><p><b>  {...}</b></p><p><b>  case '!':<

109、/b></p><p><b>  {...}</b></p><p><b>  case '&':</b></p><p><b>  {...}</b></p><p><b>  case '|':</b&g

110、t;</p><p><b>  {...}</b></p><p><b>  case '~':</b></p><p><b>  {...}</b></p><p>  case '(':return (Token(get_int(&

111、quot;("), "("));</p><p>  case ')':return (Token(get_int(")"), ")"));</p><p>  case '[':return (Token(get_int("["), "["

112、));</p><p>  case ']':return (Token(get_int("]"), "]"));</p><p>  case '{':return (Token(get_int("{"), "{"));</p><p>  ca

113、se '}':return (Token(get_int("}"), "}"));</p><p>  case '"':return (string_process());</p><p>  case ';':return (Token(get_int(";"

溫馨提示

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

評論

0/150

提交評論