畢業(yè)設(shè)計(論文)c語言編譯器的設(shè)計開發(fā)-字節(jié)代碼格式設(shè)計與實現(xiàn)_第1頁
已閱讀1頁,還剩43頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  C語言編譯器的設(shè)計開發(fā) </p><p>  字節(jié)代碼格式設(shè)計與實現(xiàn) </p><p>  畢業(yè)設(shè)計(論文)中文摘要</p><p> C語言編譯器的設(shè)計開發(fā)摘要 編譯程序是現(xiàn)代計算機系統(tǒng)的基本組成部分之一,而且多數(shù)計算機系統(tǒng)都含有不止一個高級語言的編譯程序,對有些高級語言甚至配置了幾個不同性能的編譯程序

2、。從功能上看,一個編譯程序就是一個語言翻譯程序。它把一種語(稱作源語言)書寫的程序翻譯成另一種語言(稱作目標(biāo)語言)的等價的程序。比如匯編程序是一個翻譯程序,它把匯編語言程序翻譯成機器語言程序。如果源語言是像FORTRAN,PASCAL,或C那樣的高級語言,目標(biāo)語言是像匯編語言或機器語言那樣的低級機器語言,則這種翻譯程序稱作編譯程序。一個編譯程序的重要性體現(xiàn)在它使得多數(shù)計算機用戶不必考慮與機器有關(guān)的繁索細節(jié),使程序員和程序設(shè)計專家獨立于機

3、器,這對于當(dāng)今機器的數(shù)量和種類持續(xù)不斷地增長的年代尤為重要。編譯過程劃分了詞法分析、語法分析、語義分析、中間代碼生成、代碼優(yōu)化、目標(biāo)代碼生成、六個階級。另外兩個重要的工作:表格處理和出錯處理與上述六個階級都有聯(lián)系。關(guān)鍵詞 編譯程序,源語言,目標(biāo)語言,詞法分析,語法分析,語義分析,字節(jié)代碼,中間代碼,代碼優(yōu)化,目標(biāo)代碼。</p><p>  畢業(yè)設(shè)計(論文)外文摘要</p><p><

4、;b>  目 次 </b></p><p>  1 引言(或緒論)………………………………………………………………………1</p><p>  2 編譯器的基礎(chǔ)知識…………………………………………………………………2</p><p>  2.1編譯器的發(fā)展背景……………………… ………………………………………3</p><

5、;p>  2.2編譯器研發(fā)的可行性分析…………………………………………………………3</p><p>  2.3編譯過程概述………………………… ………………………………………… 5</p><p>  3系統(tǒng)需求分析………………… ………………………………………… 8</p><p>  3.1 LEX概述……………………………………………………………………

6、……… 8</p><p>  3.2 C語言簡介……………………………………………………………9</p><p>  3.3軟件工程方法論的應(yīng)用………………………………………………………10</p><p>  3.4詞法語法分析簡介……………………………………………………………… 13</p><p>  3.5詞法需求分析簡介……………

7、………………………………………………… 13</p><p>  3.6語法需求分析簡介……………………………………………………………… 14</p><p>  3.7符號表的應(yīng)用……………………………………………………………………15</p><p>  4系統(tǒng)設(shè)計…………………………………………………………………………… 16</p><p

8、>  4.1系統(tǒng)設(shè)計總體流程圖……………………………………………………………16</p><p>  4.2語法分析體流程圖……………………………………………………………… 17</p><p>  4.3語法分析概要設(shè)計……………………………………………………………… 18</p><p>  4.4目標(biāo)代碼的分析…………………………………………………………

9、……… 21</p><p>  4.5 80x86指令系統(tǒng)…………………………………………………………………24</p><p>  4.6字節(jié)代碼設(shè)計…………………………………………………………………… 25</p><p>  4.7虛擬寄存器的設(shè)計……………………………………………………………… 26</p><p>  4.8字節(jié)代

10、碼詳細設(shè)計……………………………………………………………… 27</p><p>  5 使用說明書……………………………………………………………………… 34</p><p>  6結(jié)論 …………………………………………………………………………………35</p><p>  致謝 ………………………………………………………………………………… 36</p&

11、gt;<p>  參考文獻………………………………………………………………………………37</p><p><b>  1 引言(或緒論)</b></p><p>  編譯器的設(shè)計涉及到編譯程序構(gòu)造的一般原理、基本設(shè)計方法、主要實現(xiàn)技術(shù)和一些自動構(gòu)造工具。盡管“編譯程序”是特指將高級程序設(shè)計語言翻譯成低級語言的軟件,但編譯程序構(gòu)造的基本原理和技術(shù)也廣泛應(yīng)

12、用于一般的設(shè)計和實現(xiàn),因此,是一門對實踐性要求較高的課程。</p><p>  目前,世界上存在著數(shù)千種源語言,既有Fortran和Pascal這樣的傳統(tǒng)程序設(shè)計語言,也有各計算機應(yīng)用領(lǐng)域中出現(xiàn)的專用語言。目標(biāo)語言也同樣廣泛,目標(biāo)語言可以是另一種程序設(shè)計語言或者是從微處理機到計算機的任何計算機的機器語言。不同語言需要不同的編譯器。根據(jù)編譯器的構(gòu)造方法或者它們要實現(xiàn)的功能,編譯器被分為一遍編譯器、多遍編譯器、裝入并

13、執(zhí)行編譯器、調(diào)試編譯器、優(yōu)化編譯器等多種類別。從表面上看,編譯器的種類似乎千變?nèi)f化,多種多樣,實質(zhì)上任何編譯器所要完成的基本任務(wù)都是相同的。通過理解這些任務(wù),我們可以利用同樣的基本技術(shù)為各種各樣的源語言和目標(biāo)機器構(gòu)建編譯器。</p><p>  編譯器也可能沒有生成真正的可執(zhí)行代碼,而是生成了某種形式的匯編代碼,這必須由匯編器、鏈接器和裝入器進行進一步處理。匯編器、鏈接器和裝入器可由操心系統(tǒng)提供或由編譯器自帶。在

14、翻譯期間,中間表示或IR代表了源程序和數(shù)據(jù)結(jié)構(gòu)。雖然抽象語法樹是源代碼完美充分的表達,即使對于代碼生成也不過這樣,但是它與目標(biāo)代碼極不相像,在控制流構(gòu)造上尤為如此。在控制流構(gòu)造上,目標(biāo)代碼使用轉(zhuǎn)移語句而不是if和while語句。因此,編譯器編寫者可能希望從語法樹生成一個更接近目標(biāo)代碼的中間表示形式,或者用這樣一個中間表示代替語法樹,然后再從這個新的中間表示生成目標(biāo)代碼。</p><p>  中間代碼生成在進行了上

15、述的語法分析和語義分析的工作之后,有的編譯程序?qū)⒃闯绦蜃兂梢环N內(nèi)部表示形式,這種內(nèi)部表示形式叫做中間語言或中間代碼。所謂“中間代碼”是一種結(jié)構(gòu)簡單、含義明確的記號系統(tǒng),這種記號系統(tǒng)可以設(shè)計為多種多樣的形式,重要的設(shè)計原則為兩點:一是容易生成;二是容易將它翻譯成目標(biāo)代碼。很多編譯程采用了一種近似“三地址指令”的“四元式”中間代碼,這種四元式的形式為:(運算符,運算對象1,運算對象2,結(jié)果)。</p><p><

16、;b>  2編譯器的基礎(chǔ)知識</b></p><p>  一個編譯程序就是一個語言翻譯程序。它把一種語(稱作源語言)書寫的程序翻譯成另一種語言(稱作目標(biāo)語言)的等價的程序。比如匯編程序是一個翻譯程序,它把匯編語言程序翻譯成機器語言程序。如果源語言是像FORTRAN,PASCAL,或C那樣的高級語言,目標(biāo)語言是像匯編語言或機器語言那樣的低級語言,則這種翻譯程序稱作編譯程序。</p>

17、<p>  2.1 編譯器的發(fā)展背景</p><p>  編譯程序是現(xiàn)代計算機系統(tǒng)的基本組成部分之一,而且多數(shù)計算機系統(tǒng)都含有不止一個高級語言的編譯程序,對有些高級語言甚至配置了幾個不同性能的編譯程序。從功能上看,一個編譯程序就是一個語言翻譯程序。它把一種語(稱作源語言)書寫的程序翻譯成另一種語言(稱作目標(biāo)語言)的等價的程序。比如匯編程序是一個翻譯程序,它把匯編語言程序翻譯成機器語言程序。如果源語言是

18、像FORTRAN,PASCAL,或C那樣的高級語言,目標(biāo)語言是像匯編語言或機器語言那樣的低級語言,則這種翻譯程序稱作編譯程序。</p><p>  一個編譯程序的重要性體現(xiàn)在它使得多數(shù)計算機用戶不必考慮與機器有關(guān)的繁索細節(jié),使程序員和程序設(shè)計專家獨立于機器,這對于當(dāng)今機器的數(shù)量和種類持續(xù)不斷地增長的年代憂為重要。除了編譯程序外,還需要一些其它的程序才能生成一個可在計算機執(zhí)行的目標(biāo)程序。</p>&l

19、t;p>  一個源程序有時可能分成幾個模塊存放在不同的文件里,將這些源程序匯集在一起的任務(wù),由一個叫做預(yù)處理程序的程序完成,有些預(yù)處理程序也負責(zé)宏展開,像C語言和預(yù)處理程序要完成文件合并、宏展開等任務(wù)。也就是說,一個編譯程序的輸入可能要一個或多個預(yù)處理程序來產(chǎn)生,另外,為得到能運行的機器代碼,編譯程序的輸出可能仍需要進一步地處理。</p><p>  詞法分析階級是編譯過程的第一個階級。這個階級的任務(wù)是從左

20、到右一個字符一個字符地讀入源程序,對構(gòu)成源程序的字符流進行掃描和分解,從而識別一個個單詞(也稱為單詞符號或符號)。這里所謂的單詞是指邏輯上緊密相連的一組字符,這些字符具有集體含義。比如標(biāo)識是由字母開頭,后跟字母、數(shù)字字符序列組成的一種單詞,。保留字是一種單詞,此外還有算符,界符等等。</p><p>  語法分析是編譯過程的第二個階段。語法分析的任務(wù)是在詞法分析的基礎(chǔ)上將單詞序列分解成各類語法短語。如“程序”,“

21、語句”,“表達式”等等。一般這種語法短語也稱為語法單位,可表示成語法樹。語法分析所依據(jù)的是語言的語法規(guī)則,即描述程序結(jié)構(gòu)的規(guī)則。通過語法分析確定整個輸入串是否構(gòu)成一個語法上正確的程序。</p><p>  典型的文法的語法分析器有三類:一類是通用的語法分析方法,如Cocke-Younger-Kasami算法和Early算法,這些方法在生成編譯器時效率太低。編譯器常用的是自頂向下和自底向上的方法。</p>

22、;<p>  采用自頂向下的遞歸子程序法,就是對應(yīng)每個非終結(jié)符語法單元,編一個獨立的處理子程序。語法分析從讀入第一個單詞開始,由非終結(jié)符即開始符出發(fā),沿語法描述圖箭頭指出的方向進行分析。當(dāng)遇到非終結(jié)符時,則調(diào)用相應(yīng)的處理子程序,從語法描述圖看也就進入了一個語法單元,再沿當(dāng)前所進入的語法描述圖的箭頭方向進行分析,當(dāng)遇到終結(jié)符時,則判斷當(dāng)前讀入的單詞是否與圖中的終結(jié)符相匹配,若匹配,則執(zhí)行相應(yīng)的語義程序。再讀取下一個單詞繼續(xù)分

23、析。遇到分支點時將當(dāng)前的單詞與分支點上的多個終結(jié)符逐個相比較,若都不匹配時可能是進入下一非終結(jié)符語法單位或是出錯。</p><p>  自頂向下的分析算法通過在最左推導(dǎo)中描述出各個步驟來分析記號串輸入。之所以稱這樣的算法為自頂向下是由于分析樹隱含的編號是一個前序編,而且其順序是由根到葉子。自頂向下的分析程序有兩類:回溯分析程序和預(yù)測分析程序。預(yù)測分析程序試圖利用一個或多個先行記號來預(yù)測出輸入串中的下一個構(gòu)造,而回

24、溯分析程序則試著分析其他可能的輸入,當(dāng)一種可能失敗時就要求輸入中備份任意數(shù)量的字符。雖然回溯分析程序比預(yù)測強大許多,但它們都非常慢,一般都在指數(shù)的數(shù)量級上,所以對于實際的編譯器并不適合。遞歸下降程序分析和LL(1)分析一般地都要求計算先行集合,它們分別稱作First集合和Follow集合。由于無需顯示地構(gòu)造出這些集合就可以構(gòu)造出簡單的自頂向下的分析程序,所以在基本算法的介紹之后我們再討論它們。之后我償還要談到一個由遞歸下降分析構(gòu)造的分析

25、程序。</p><p>  由于代碼生成較復(fù)雜,所以編譯器一般將這一階段分成幾個涉及不同中間數(shù)據(jù)結(jié)構(gòu)的步驟,其中包括了某種稱作中間代碼的抽象代碼。編譯器也可能沒有生成真正的可執(zhí)行代碼,而是生成了某種形式的匯編代碼,這必須由匯編器、鏈接器和裝入器進行進一步處理。匯編器、鏈接器和裝入器可由操心系統(tǒng)提供或由編譯器自帶。在翻譯期間,中間表示或IR代表了源程序和數(shù)據(jù)結(jié)構(gòu)。雖然抽象語法樹是源代碼完美充分的表達,即使對于代碼生

26、成也不過這樣,但是它與目標(biāo)代碼極不相像,在控制流構(gòu)造上尤為如此。在控制流構(gòu)造上,目標(biāo)代碼使用轉(zhuǎn)移語句而不是if和while語句。因此,編譯器編寫者可能希望從語法樹生成一個更接近目標(biāo)代碼的中間表示形式,或者用這樣一個中間表示代替語法樹,然后再從這個新的中間表示生成目標(biāo)代碼。這種類似目標(biāo)代碼的中間表示稱為中間代碼。</p><p>  2.2編譯器研發(fā)的可行性分析</p><p>  編寫編譯

27、器的原理和技術(shù)具有十分普遍的意義,以致于在每一個計算機科學(xué)家的研究生涯中,許多原理和技術(shù)都會反復(fù)用到。編譯器的編寫涉及到程序設(shè)計語言、計算機體系結(jié)構(gòu)、語言理論、算法和軟件工程等學(xué)科。幸運的是,有幾種基本編譯器編寫技術(shù)已經(jīng)被用于構(gòu)建許多計算機的多種語言翻譯器。簡單的說,編譯器是一個程序,它讀入用某種語言(源語言)編寫的程序并將其翻譯成一個與之等價的以另一種語言(目標(biāo)語言)編寫的程序。作為這個翻譯過程匠一個重要組成部分,編譯器能夠向用戶報告

28、被編譯的源程序中出現(xiàn)的錯誤。</p><p>  編譯器由兩部分組成:分析與綜合。分析部分將源程序切分成一些基本塊并形成源程序的中間表示,綜合部分把源程序的中間表示轉(zhuǎn)為所需的目標(biāo)程序。在分析期間,源程序所蘊含的操作將被確定下來并被表示成為一個稱為語法樹的分層結(jié)構(gòu)。語法樹的每個節(jié)點表示一個操作,該節(jié)點的子節(jié)點表示這個操作的參數(shù)。</p><p>  許多操縱源程序的軟件工具都首先完成某種類型

29、的分析。下邊是這類工具的示例:</p><p>  結(jié)構(gòu)編輯器,結(jié)構(gòu)編輯器將一個命令序列作為輸入一構(gòu)造程序。</p><p>  智能打印機,智能打印機能夠?qū)Τ绦蜻M行分析,打印出結(jié)構(gòu)清晰的程序。</p><p>  靜態(tài)檢查器,靜態(tài)檢查器讀入一個程序,分析這個程序,并在不運行這個程序的條件試圖發(fā)現(xiàn)程序的潛在錯誤。</p><p>  解釋器,

30、解釋器不是通過翻譯來產(chǎn)生目標(biāo)程序,而是直接執(zhí)行源程序中蘊含的操作。</p><p>  目前,世界上存在著數(shù)千種源語言,既有Fortran和Pascal這樣的傳統(tǒng)程序設(shè)計語言,也有各計算機應(yīng)用領(lǐng)域中出現(xiàn)的專用語言。目標(biāo)語言也同樣廣泛,目標(biāo)語言可以是另一種程序設(shè)計語言或者是從微處理機到計算機的任何計算機的機器語言。不同語言需要不同的編譯器。根據(jù)編譯器的構(gòu)造方法或者它們要實現(xiàn)的功能,編譯器被分為一遍編譯器、多遍編譯器

31、、裝入并執(zhí)行編譯器、調(diào)試編譯器、優(yōu)化編譯器等多種類別。從表面上看,編譯器的種類似乎千變?nèi)f化,多種多樣,實質(zhì)上任何編譯器所要完成的基本任務(wù)都是相同的。通過理解這些任務(wù),我們可以利用同樣的基本技術(shù)為各種各樣的源語言和目標(biāo)機器構(gòu)建編譯器。</p><p>  從20世紀50年代早期第一個編譯器出現(xiàn)到今,我們所掌握的有關(guān)編譯器的知識已經(jīng)得到了長足的發(fā)展。整個20世紀50年代,編譯器的編寫一直被認為是一個極難的問題。目前我

32、們已經(jīng)系統(tǒng)地掌握了處理編譯期間發(fā)生的許多重要任務(wù)的技術(shù)。良好的實現(xiàn)語言、程序設(shè)計環(huán)境和軟件工具也已經(jīng)被開發(fā)出來。</p><p>  20世紀50年代末有人開始研究編譯程序的自動生成技術(shù),提出并研制編譯程序的編譯程序。它的功能是以任一語言的詞法規(guī)則、語法規(guī)則和語義解釋出發(fā),自動產(chǎn)生該語言的編譯程序。目前,很多自動生成的工具已廣泛使用,如詞法分析的生成系統(tǒng)LEX,語法分析程序的生成系統(tǒng)YACC等。20世紀60年代起

33、,不斷有人使用自展技術(shù)來構(gòu)造編譯程序。自展的主要特征是用被編譯的語言來書寫該語言自身的編譯程序。自從1971年,PASCAL的編譯程序用自展技術(shù)生成后,起影響就越來越大。</p><p>  研究編譯程序是有意義在于:</p><p>  編譯程序構(gòu)造是計算機科學(xué)中的一個非常成功的分支,也是最早獲的成功的分支之一;</p><p>  它與文件轉(zhuǎn)換程序關(guān)系密集,且不

34、僅僅適用于編譯程序;</p><p>  它包含許多在實際應(yīng)用中有用的算法。</p><p>  由于近幾年并行機及多處理機的發(fā)展,對軟件的并行處理技術(shù)提出了新的要求。特別是并行編譯技術(shù)發(fā)展很快,目前處理并行編譯技術(shù)有兩種方法:</p><p>  第一種方法,運用重構(gòu)技術(shù)把已有的串行語言編寫的程序經(jīng)過相關(guān)分析,分解成可并行的成分,分配到多CPU或多處理機上運行,這

35、種技術(shù)國內(nèi)已有FORTRAN和C語言的并行重構(gòu)處理系統(tǒng),相當(dāng)成功。</p><p>  第二種方法,即在程序設(shè)計語言機制上允許用戶自己編寫并行程序,這當(dāng)然比編寫串行語言對編程人員提出的要求更多。即用戶自己必須知道程序各模塊之間邏輯結(jié)構(gòu)關(guān)系及調(diào)用關(guān)系乃至運算量,以確定哪些模塊可以并行執(zhí)行。若編程者能按程序設(shè)計情況編出并行程序,無疑并行程序效率將比第一種方法要好。</p><p>  隨著并行

36、技術(shù)和并行語言的發(fā)展,處理并行語言的并行編譯技術(shù)正在深入研究之中,將串行程序轉(zhuǎn)換成并行程序的自動并行編譯技術(shù)也正在深入研究之中。</p><p>  代碼生成較復(fù)雜,所以編譯器一般將這一階段分成幾個涉及不同中間數(shù)據(jù)結(jié)構(gòu)的步驟,其中包括了某種稱作中間代碼的抽象代碼。編譯器也可能沒有生成真正的可執(zhí)行代碼,而是生成了某種形式的匯編代碼,這必須由匯編器、鏈接器和裝入器進行進一步處理。匯編器、鏈接器和裝入器可由操心系統(tǒng)提供

37、或由編譯器自帶。在翻譯期間,中間表示或IR代表了源程序和數(shù)據(jù)結(jié)構(gòu)。雖然抽象語法樹是源代碼完美充分的表達,即使對于代碼生成也不過這樣,但是它與目標(biāo)代碼極不相像,在控制流構(gòu)造上尤為如此。在控制流構(gòu)造上,目標(biāo)代碼使用轉(zhuǎn)移語句而不是if和while語句。因此,編譯器編寫者可能希望從語法樹生成一個更接近目標(biāo)代碼的中間表示形式,或者用這樣一個中間表示代替語法樹,然后再從這個新的中間表示生成目標(biāo)代碼。這種類似目標(biāo)代碼的中間表示稱為中間代碼。然后編譯程

38、序再調(diào)用相應(yīng)的處理程序,將中間代碼轉(zhuǎn)換為計算機能處理的機器指令,最終得到目標(biāo)代碼。</p><p><b>  2.3編譯過程概述</b></p><p>  編譯程序是現(xiàn)代計算機系統(tǒng)的基本組成部分之一,而且多數(shù)計算機系統(tǒng)都含有不止一個高級語言的編譯程序,對有些高級語言甚至配置了幾個不同性能的編譯程序。從功能上看,一個編譯程序就是一個語言翻譯程序。它把一種語(稱作源語

39、言)書寫的程序翻譯成另一種語言(稱作目標(biāo)語言)的等價的程序。比如匯編程序是一個翻譯程序,它把匯編語言程序翻譯成機器語言程序。如果源語言是像FORTRAN,PASCAL,或C那樣的高級語言,目標(biāo)語言是像匯編語言或機器語言那樣的低級玉器言,則這種翻譯程序稱作編譯程序。</p><p>  一個編譯程序的重要性體現(xiàn)在它使得多數(shù)計算機用戶不必考慮與機器有關(guān)的繁索細節(jié),使程序員和程序設(shè)計專家獨立于機器,這對于當(dāng)今機器的數(shù)量

40、和種類持續(xù)不斷地增長的年代憂為重要。除了編譯程序外,還需要一些其它的程序才能生成一個可在計算機執(zhí)行的目標(biāo)程序。</p><p>  高級語言程序的處理過程如圖:</p><p><b>  需處理的源程序</b></p><p><b>  源程序</b></p><p><b>  目標(biāo)

41、匯編程序 </b></p><p><b>  可再裝配的機器代碼</b></p><p><b>  可在裝配的目標(biāo)文件</b></p><p>  絕對機器代碼 </p><p>  一個源程序有時可能分成幾個模塊存放在不同的

42、文件里,將這些源程序匯集在一起的任務(wù),由一個叫做預(yù)處理程序的程序完成,有些預(yù)處理程序也負責(zé)宏展開,像C語言和預(yù)處理程序要完成文件合并、宏展開等任務(wù)。也就是說,一個編譯程序的輸入可能要一個或多個預(yù)處理程序來產(chǎn)生,另外,為得到能運行的機器代碼,編譯程序的輸出可能仍需要進一步地處理。</p><p>  編譯程序完成從源程序到目標(biāo)程序的翻譯工作,是一個復(fù)雜的整體的過程。從概念上來講,一個編譯程序和整體工作過程是劃分成階

43、級進行的,每個階級將源程序的一種表示形式換成另一種表示形式,各個階級進行的操場作在邏輯上是緊密連接在一起的,如圖1所示,給出了一個編譯過的和各個階級,這是一種比較典型的劃分方法。</p><p><b>  源程序</b></p><p><b>  圖1</b></p><p>  圖1將編譯過程劃分了詞法分析、語法分析

44、、語義分析、中間代碼生成、代碼優(yōu)化、目標(biāo)代碼生成、六個階級。另外兩個重要的工作:表格處理和出錯處理與上述六個階級都有聯(lián)系。編譯過程是源程序和各種信息被子保留在種種不同的表格里,編譯各階級的工作都涉及到構(gòu)造、查找或更新有關(guān)的表格,因此需要有表格處理的工作;如果編譯過程中發(fā)現(xiàn)源程序有錯誤,編譯程序應(yīng)報告錯誤的性質(zhì)和錯誤發(fā)生的地點,并且將錯誤所造成的影響限制在盡可能小的范圍內(nèi),使得源程序的其余部分能繼續(xù)被編譯下去,有些編譯程序還能自動校正錯誤

45、,這些工作稱之為出錯處理。</p><p>  詞法分析階級是編譯過程的第一個階級。這個階級的任務(wù)是從左到右一個字符一個字符地讀入源程序,對構(gòu)成源程序的字符流進行掃描和分解,從而識別一個個單詞(也稱為單詞符號或符號)。這里所謂的單詞是指邏輯上緊密相連的一組字符,這些字符具有集體含義。比如標(biāo)識是由字母開頭,后跟字母、數(shù)字字符序列組成的一種單詞,。保留字是一種單詞,此外還有算符,界符等等。</p>&l

46、t;p>  語法分析是編譯過程的第二個階級。語法分析的任務(wù)是在詞法分析的基礎(chǔ)上將單詞序列分解成各類語法短語,如“程序”,“語句”,“表達式”等等。一般這種語法短語,也稱為語法單位,可表示成語法樹。語法分析所依據(jù)的是語言的語法規(guī)則,即描述程序結(jié)構(gòu)的規(guī)則。通過語法分析確定整個輸入串是否構(gòu)成一個語法上正確的程序。詞法分析和語法分析本質(zhì)上都是對源程序的結(jié)構(gòu)進行分析。但詞法分析的任務(wù)僅對源程序進行線性掃描即可完成,比如識別標(biāo)識符,因為標(biāo)識符

47、的結(jié)構(gòu)是字母打頭的字母和數(shù)字序列,這只要順序掃描輸入流,遇到既不是字母又不是數(shù)字字符時,將前面所發(fā)現(xiàn)的所有字母和數(shù)字組合在一起而構(gòu)成單詞標(biāo)識符。但這種線性掃描則不能用于識別遞歸定義的語法成分,比如就不能用此辦法去匹配表達式中的括號。</p><p>  語義分析階級是審查源程序有無語義錯誤,為代碼生成階級收集類型信息。比如語分析的一個工作是進行類型審查,審查每個算符是否具有語言規(guī)范允許的運算對象,當(dāng)不符合語言規(guī)范

48、時,編譯程序應(yīng)報告錯誤。如有的編譯程序要對實數(shù)用個數(shù)組下標(biāo)的情況報告錯誤。又如某些語言規(guī)定運算對象可被強制,那么當(dāng)二目運算一整數(shù)和一實型時,編譯程序應(yīng)將整型轉(zhuǎn)換成實型而不能認為是源程序的錯誤。</p><p>  中間代碼生成在進行了上述的語法分析和語義分析的工作之后,有的編譯程序?qū)⒃闯绦蜃兂梢环N內(nèi)部表示形式,這種內(nèi)部表示形式叫做中間語言或中間代碼。所謂“中間代碼”是一種結(jié)構(gòu)簡單、含義明確的記號系統(tǒng),這種記號系統(tǒng)

49、可以設(shè)計為多種多樣的形式,重要的設(shè)計原則為兩點:一是容易生成;二是容易將它翻譯成目標(biāo)代碼。很多編譯程采用了一種近似“三地址指令”的“四元式”中間代碼,這種四元式的形式為:(運算符,運算對象1,運算對象2,結(jié)果)。</p><p>  代碼優(yōu)化在此階級的任務(wù)是對前階級產(chǎn)生的是間代碼進行變換或進行改造,目的是使生成的目標(biāo)代碼更為高效,即省時間和省空間。</p><p>  目標(biāo)代碼生成的任務(wù)是

50、把是間代碼變換成特定機器上的絕對指令代碼或可重定位的指令代碼或匯編指令代碼。這是編譯的最后階級,它的工作與硬件系統(tǒng)結(jié)構(gòu)和指令含義有關(guān),這個階的工作很復(fù)雜,涉及到硬件系統(tǒng)功能部件的運用、機器指令的選擇、各種數(shù)據(jù)類型變量的存儲空間分配以及寄存器和后緩寄存器的調(diào)度等。</p><p>  有時,常常把編譯的過程分為前端和后端,前端由那樣一些階級組成:這些階級的工作主要依賴于源語言而與目標(biāo)機無關(guān)。通常這些階段包括詞法分析

51、、語法分析、語義分析和中間代碼生成,某些優(yōu)化工作也可在前端做,也包括與前端每個階級相關(guān)的出錯處量工作和符號表管理工作。后端工作指那些依賴于目標(biāo)機而一般不依賴源語言,只與中間代碼有關(guān)的那些階段,即目標(biāo)代碼生成,以及相關(guān)出錯處理和符號表操作。若按照這種姐合方式實現(xiàn)編譯程序,可以設(shè)想,某一編譯程序的前端加上相應(yīng)不同的后端則可以為不同的機器構(gòu)成一個源語言的編譯程序。也可以設(shè)想,不同語言編譯的前端生成同一種中間語言,再使用一個共同的后端,則可為同

52、一機器生成幾個語言的編譯程序。一個編譯過程可由一遍、兩遍或多遍完成。所謂“遍”,也稱作“趟”,是對源程序或其等價的中間語言程序從頭到尾掃視并完成規(guī)定任務(wù)的過程。每一遍掃視可完成上述一個階段或多個階段的工作。例如一遍可以只完成詞法分析工作;一遍完成詞法分析和語法分析工作;甚至一遍完成整個編譯工作。對于多遍的編譯程序,第一遍的輸入是用戶書寫的源程序,最后一遍是輸出是目標(biāo)語言程序,其余是上一遍的輸出為下一遍的輸入。</p>&l

53、t;p><b>  3系統(tǒng)需求分析</b></p><p><b>  3.1 LEX概述</b></p><p>  LEX是一個詞法分析器(掃描器)的自動產(chǎn)生系統(tǒng),它的示意圖如下:</p><p>  LEX源程序 LEX yylex</p><p>  輸入串

54、 yylex 單詞符號串 </p><p>  LEX源程序是用一種面向問題的語言寫成的。這個語言的核心是正規(guī)表達式(正規(guī)式),用它描述輸入串的詞法結(jié)構(gòu)。在這個語言中用戶還可以描述某一個詞形被識別出來時要完成的動作,例如在高級語言的詞法分析器中,當(dāng)識別出一個關(guān)鍵字時,它應(yīng)該向語法分析器返回該關(guān)鍵字的內(nèi)部編碼。LEX并不是一個完整的語言,它只是某種高級語言(稱為LEX的宿主

55、語言)的擴充,因此,LEX沒有為描述動作設(shè)計新的語言,而是借助其宿主語言來描述動作。LEX自動地把表示輸入串詞法結(jié)構(gòu)的正規(guī)式及相應(yīng)的動作轉(zhuǎn)換成一個宿主語言的程序,即詞法分析程序,它有一個固定的名字yylex,在這里yylex是一個C語言程序。</p><p><b>  3.2 C語言簡介</b></p><p> ?。谜Z言是在 70 年代初問世的。一九七八年由美國電

56、話電報公司(AT&T)貝爾實驗室正式發(fā)表了C語言。同時由B.W.Kernighan和D.M.Ritchit合著了著名的“THE C PROGRAMMING LANGUAGE”一書。通常簡稱為《K&R》,也有人稱之為《K&R》標(biāo)準。但是,在《K&R》中并沒有定義一個完整的標(biāo)準C 語言,后來由美國國家標(biāo)準協(xié)會(American National Standards Institute)在此基礎(chǔ)上制定了一個C

57、語言標(biāo)準,于一九八三年發(fā)表。通常稱之為ANSI C。早期的C 語言主要是用于UNIX系統(tǒng)。由于C語言的強大功能和各方面的優(yōu)點逐漸為人們認識,到了八十年代,C開始進入其它操作系統(tǒng),并很快在各類大、中、小和微型計算機上得到了廣泛的使用,成為當(dāng)代最優(yōu)秀的程序設(shè)計語言之一。</p><p>  目前最流行的C語言有以下幾種:</p><p>  ·Microsoft C 或稱 MS C&

58、lt;/p><p>  ·Borland Turbo C 或稱 Turbo C</p><p><b>  ·AT&T C</b></p><p>  這些C語言版本不僅實現(xiàn)了ANSI C標(biāo)準,而且在此基礎(chǔ)上各自作了一些擴充,使之更加方便、完美。</p><p><b> ?。谜Z言的特點

59、:</b></p><p>  1·C語言簡潔、緊湊,使用方便、靈活。ANSI C一共只有32個關(guān)鍵字:</p><p>  9種控制語句,程序書寫自由,主要用小寫字母表示,壓縮了一切不必要的成分。</p><p>  Turbo C擴充了11個關(guān)鍵字:</p><p>  asm_cs_ds_es_ss

60、cdeclfar</p><p>  hugeinterruptnearpascal</p><p>  注意:在C語言中,關(guān)鍵字都是小寫的。</p><p>  2·運算符豐富。共有34種。C把括號、賦值、逗號等都作為運算符處理。從而使C的運算類型極為豐富,可以實現(xiàn)其他高級語言難以實現(xiàn)的運算。</p><p>  

61、3·數(shù)據(jù)結(jié)構(gòu)類型豐富。</p><p>  4·具有結(jié)構(gòu)化的控制語句。</p><p>  5·語法限制不太嚴格,程序設(shè)計自由度大。</p><p>  6·C語言允許直接訪問物理地址,能進行位(bit)操作,能實現(xiàn)匯編語言的大部分功能,可以直接對硬件進行操作。因此有人把它稱為中級語言。</p><p>

62、;  7·生成目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高。</p><p>  8·與匯編語言相比,用C語言寫的程序可移植性好。</p><p>  但是,C語言對程序員要求也高,程序員用C寫程序會感到限制少、靈活性大,功能強,但較其他高級語言在學(xué)習(xí)上要困難一些。</p><p><b>  C語言的字符集:</b></p>

63、<p>  字符是組成語言的最基本的元素。C語言字符集由字母,數(shù)字,空格,標(biāo)點和特殊字符組成。在字符常量,字符串常量和注釋中還可以使用漢字或其它可表示的圖形符號。</p><p><b>  1.字母</b></p><p>  小寫字母a~z共26個</p><p>  大寫字母A~Z共26個</p><p&

64、gt;<b>  2.數(shù)字</b></p><p><b>  0~9共10個</b></p><p><b>  3.空白符</b></p><p>  空格符、制表符、換行符等統(tǒng)稱為空白符??瞻追辉谧址A亢妥址A恐衅鹱饔?。在其它地方出現(xiàn)時,只起間隔作用,編譯程序?qū)λ鼈兒雎圆挥嫛R虼嗽诔绦蛑?/p>

65、使用空白符與否,對程序的編譯不發(fā)生影響,但在程序中適當(dāng)?shù)牡胤绞褂每瞻追麑⒃黾映绦虻那逦院涂勺x性。</p><p><b>  4.標(biāo)點和特殊字符</b></p><p><b>  C語言詞匯:</b></p><p>  在C語言中使用的詞匯分為六類:標(biāo)識符,關(guān)鍵字,運算符,分隔符,常量,注釋符等。</p>

66、<p><b>  1.標(biāo)識符</b></p><p>  在程序中使用的變量名、函數(shù)名、標(biāo)號等統(tǒng)稱為標(biāo)識符。除庫函數(shù)的函數(shù)名由系統(tǒng)定義外,其余都由用戶自定義。C 規(guī)定,標(biāo)識符只能是字母(A~Z,a~z)、數(shù)字(0~9)、下劃線(_)組成的字符串,并且其第一個字符必須是字母或下劃線。</p><p>  以下標(biāo)識符是合法的:</p><

67、;p>  a, x, x3, BOOK_1, sum5</p><p>  以下標(biāo)識符是非法的:</p><p>  3s 以數(shù)字開頭</p><p>  s*T 出現(xiàn)非法字符*</p><p>  -3x 以減號開頭</p><p>  bowy-1 出現(xiàn)非法字符-(減號)<

68、/p><p>  在使用標(biāo)識符時還必須注意以下幾點:</p><p>  (1)標(biāo)準C不限制標(biāo)識符的長度,但它受各種版本的C 語言編譯系統(tǒng)限制,同時也受到具體機器的限制。例如在某版本C 中規(guī)定標(biāo)識符前八位有效,當(dāng)兩個標(biāo)識符前八位相同時,則被認為是同一個標(biāo)識符。</p><p>  (2)在標(biāo)識符中,大小寫是有區(qū)別的。例如BOOK和book 是兩個不同的標(biāo)識符。</

69、p><p>  (3)標(biāo)識符雖然可由程序員隨意定義,但標(biāo)識符是用于標(biāo)識某個量的符號。因此,命名應(yīng)盡量有相應(yīng)的意義,以便于閱讀理解,作到“顧名思義”。</p><p><b>  2.關(guān)鍵字</b></p><p>  關(guān)鍵字是由C語言規(guī)定的具有特定意義的字符串,通常也稱為保留字。用戶定義的標(biāo)識符不應(yīng)與關(guān)鍵字相同。C語言的關(guān)鍵字分為以下幾類:<

70、/p><p><b>  (1)類型說明符</b></p><p>  用于定義、說明變量、函數(shù)或其它數(shù)據(jù)結(jié)構(gòu)的類型。如前面例題中用到的int,double等</p><p><b>  (2)語句定義符</b></p><p>  用于表示一個語句的功能。如例1.3中用到的if else就是條件語句的

71、語句定義符。</p><p><b>  (3)預(yù)處理命令字</b></p><p>  用于表示一個預(yù)處理命令。如前面各例中用到的include。</p><p><b>  3.運算符</b></p><p>  C語言中含有相當(dāng)豐富的運算符。運算符與變量,函數(shù)一起組成表達式,表示各種運算功能。

72、運算符由一個或多個字符組成。</p><p><b>  4.分隔符</b></p><p>  在C語言中采用的分隔符有逗號和空格兩種。逗號主要用在類型說明和函數(shù)參數(shù)表中,分隔各個變量??崭穸嘤糜谡Z句各單詞之間,作間隔符。在關(guān)鍵字,標(biāo)識符之間必須要有一個以上的空格符作間隔,否則將會出現(xiàn)語法錯誤,例如把int a;寫成 inta;C編譯器會把inta</p>

73、;<p>  當(dāng)成一個標(biāo)識符處理,其結(jié)果必然出錯。</p><p><b>  5.常量</b></p><p>  C 語言中使用的常量可分為數(shù)字常量、字符常量、字符串常量、符號常量、轉(zhuǎn)義字符等多種。在后面章節(jié)中將專門給予介紹。</p><p><b>  6.注釋符</b></p><

74、p>  C 語言的注釋符是以“/*”開頭并以“*/”結(jié)尾的串。在“/*”和“*/”之間的即為注釋。程序編譯時,不對注釋作任何處理。注釋可出現(xiàn)在程序中的任何位置。注釋用來向用戶提示或解釋程序的意義。在調(diào)試程序中對暫不使用的語句也可用注釋符括起來,使翻譯跳過不作處理,待調(diào)試結(jié)束后再去掉注釋符。</p><p>  3.3軟件工程方法論的應(yīng)用</p><p>  軟件工程是指導(dǎo)計算機軟件開

75、發(fā)和維護的工程學(xué),采用工程的概念、原理、技術(shù)、和方法開發(fā)與維護軟件,把經(jīng)過時間考驗而證明正確的管理技術(shù)和當(dāng)前能夠得到的最好的技術(shù)方法結(jié)合起來。</p><p>  自從1968年在聯(lián)邦德國召開的國際會議上正式提出并使用了“軟件工程”這個術(shù)語以來,研究軟件工程的專家學(xué)者們陸續(xù)提出了100多條關(guān)于軟件工程的準則或“信條”。著名的軟件工程專家B.W.Boehm綜合這些學(xué)者們的意見并總結(jié)了TRW公司多年開發(fā)軟件的經(jīng)驗,于

76、1983年在一篇論文中提出軟件工程的七條原理。他認為這七條原理是確保軟件產(chǎn)品質(zhì)量和開發(fā)效率的原理的最小集合。這七條原理是互相獨立的,其中任意六條原理的組合都不能代替另一條原理,因此,它們是缺一不可的最小集合,然而這七條原理又是相當(dāng)完備的,人們雖然不能用數(shù)學(xué)方法嚴格證明它們是一個完備的集合,但是,可以證明在此之前已經(jīng)提出的100多條軟件工程原理都可以由這七條原理的任意組合蘊含或派生。</p><p>  用分階段的

77、生命周期計劃嚴格管理</p><p>  經(jīng)統(tǒng)計表明,不成功的軟件項目中有一半左右是由于計劃不周造成的。</p><p>  Boehm認為,在軟件的整個生命周期中應(yīng)制定并嚴格執(zhí)行六類計劃:項目概要計劃、里程碑計劃、項目控制計劃、產(chǎn)品控制計劃、驗證計劃、運行維護計劃</p><p><b>  堅持進行階段評審</b></p>&

78、lt;p>  大部分錯誤是在編碼之前造成的</p><p>  錯誤發(fā)現(xiàn)與改正得越晚,所需付出的代價越高。</p><p>  因此,在每個階段都進行嚴格的評審,以便盡早發(fā)現(xiàn)在軟件開發(fā)過程的錯誤</p><p><b>  實行嚴格的產(chǎn)品控制</b></p><p>  在軟件開發(fā)過程中不要隨意改變需求,因為改變某

79、項需求往往需要付出較高的代價,但在實踐中用戶往往會提出需求變更,因此需要采取科學(xué)的產(chǎn)品控制技術(shù)。</p><p>  目前主要實行基準配置管理:基準配置是指經(jīng)過階段評審后的軟件配置成分,如各個階段產(chǎn)生的文檔或程序代碼。</p><p>  對涉及基準配置的修改,必須經(jīng)過嚴格的評審,通過后才能實施修改。</p><p>  采用現(xiàn)代程序設(shè)計技術(shù)</p>

80、<p>  實踐表明:采用先進的技術(shù)既可提高軟件開發(fā)的效率,又可提高軟件維護的效率。</p><p>  80年代及之前:結(jié)構(gòu)化分析、設(shè)計技術(shù)</p><p>  90年代:面向?qū)ο蠓治?、設(shè)計技術(shù)</p><p><b>  結(jié)果應(yīng)能清楚地審查</b></p><p>  軟件產(chǎn)品是看不見、摸不著的邏輯產(chǎn)品,開

81、發(fā)過程難以評價和管理。</p><p>  根據(jù)軟件開發(fā)項目的總目標(biāo)及完成期限,規(guī)定開發(fā)組織的責(zé)任和產(chǎn)品標(biāo)準,使所得的結(jié)果能夠清楚地審查</p><p>  開發(fā)小組的人員應(yīng)該少而精</p><p>  開發(fā)小組人員的素質(zhì)和數(shù)量是影響軟件產(chǎn)品質(zhì)量和開發(fā)效率的重要因素。</p><p>  開發(fā)小組人員數(shù)目的增加,使相互交流復(fù)雜、費用增加。&l

82、t;/p><p>  承認不斷改進軟件工程實踐的必要性</p><p>  遵循前6條基本原理,就能夠按照當(dāng)代軟件工程基本原理實現(xiàn)軟件的工程化生產(chǎn),但不能保證趕上時代前進的步伐。</p><p>  積極主動采納新的軟件技術(shù),且不斷總結(jié)經(jīng)驗</p><p>  軟件工程的傳統(tǒng)途徑是“生命周期法”,強調(diào)“結(jié)構(gòu)化分析、結(jié)構(gòu)化設(shè)計”。</p>

83、;<p> ?。?)“生命周期法”的起源</p><p>  人類解決復(fù)雜問題時普遍采用的一個策略是“各個擊破”,也就是對問題進行分解,然后再分別解決各個子問題的策略。</p><p>  軟件工程采用的“生命周期法”,就是從時間角度對軟件開發(fā)和維護的復(fù)雜問題進行分解,把軟件生存的漫長周期依次劃分為若干個階段,每個階段有相對獨立的任務(wù),然后再逐步完成每個階段的任務(wù)。</

84、p><p>  (2)生命周期劃分的原則</p><p>  各階段的任務(wù)彼此間盡可能相對獨立,同一個階段各項任務(wù)的性質(zhì)盡可能相同,從而降低每個階段任務(wù)的復(fù)雜性,簡化不同階段之間的聯(lián)系,有利于軟件開發(fā)過程的組織管理。</p><p> ?。?) 生命周期的劃分</p><p>  軟件生命周期一般分為:軟件定義(問題定義、可行性研究、需求分析)、

85、軟件開發(fā)(總體設(shè)計、詳細設(shè)計、編碼和單元測試、綜合測試)、軟件維護等三個時期。</p><p>  軟件工程各階段的基本任務(wù)</p><p><b>  問題定義:</b></p><p>  問題定義階段需要回答的關(guān)鍵問題是:“有解決的問題是什么?”通過問題定義階段的工作,系統(tǒng)分析員應(yīng)該提出關(guān)于問題性質(zhì)、工程目標(biāo)和規(guī)模的書面報告。通過對實際用

86、戶和使用部門負責(zé)人的訪問調(diào)查,分析員扼要地寫出他對問題的理解,并在用戶和使用部門負責(zé)人的會議上認真討論這份書面報告,澄清含糊不清的地方,改正理解不正確的地方,最后得到一份雙方都滿意的文檔。</p><p><b>  可行性研究</b></p><p>  這個階段要回答的關(guān)鍵問題是:“對于上一個階段所確定的問題有行的通的解決方法嗎?”在問題定義階段提出的對工程目標(biāo)和

87、規(guī)模的報告通常比較模糊。可行性研究階段應(yīng)該導(dǎo)出系統(tǒng)的高層邏輯模型(通常用數(shù)據(jù)流圖表示),并且在此基礎(chǔ)上更準確、更具體地確定工程規(guī)模和目標(biāo)。然后分析員更準確地估計系統(tǒng)的成本和效益,對建議的系統(tǒng)進行仔細的成本/效益分析。</p><p><b>  需求分析</b></p><p>  這個階段的任務(wù)是“為了解決這個問題,目標(biāo)系統(tǒng)必須做什么”,主要是確定目標(biāo)系統(tǒng)必須具備哪

88、些功能。在需求分析階段確定的系統(tǒng)邏輯模型是以后設(shè)計和實現(xiàn)目標(biāo)系統(tǒng)的基礎(chǔ),因此必須準確完整地體現(xiàn)用戶的要求。該階段有寫的文檔有規(guī)格說明書、初步的用戶使用手冊、系統(tǒng)功能框架圖等。</p><p><b>  總體設(shè)計</b></p><p>  這個階段要回答的關(guān)鍵問題是:“概括地說,應(yīng)該如何解決這個問題?”首先應(yīng)該考慮幾種可能的解決方案。例如,目標(biāo)系統(tǒng)的一些主要功能是用

89、計算機自動完成還是用人工完成。通常至少考慮下述幾類可能的方案:低成本解決方案、中等成本的解決方案和高成本的“十全十美”的系統(tǒng)。系統(tǒng)分析員應(yīng)該使用系統(tǒng)流程圖或者其他工具描述每種可能的系統(tǒng)。</p><p><b>  詳細設(shè)計</b></p><p>  總體設(shè)計階段以比較抽象概括的方式提出了解決問題的方法。詳細設(shè)計階段的任務(wù)就好似把解決方法具體化,也就是回答下面這個關(guān)

90、鍵問題:“應(yīng)該怎樣具體地實現(xiàn)這個系統(tǒng)呢?”這個階段的任務(wù)還不是編寫程序,而是設(shè)計出程序的詳細規(guī)格說明。通常用HIPO圖(層次圖加輸入/處理/輸出圖)或PDL語言(過程設(shè)計語言)描述詳細的結(jié)果。該階段要產(chǎn)生的文檔有偽代碼、詳細的測試計劃、最終的用戶使用手冊等。</p><p><b>  編碼和單元測試</b></p><p>  這個階段的關(guān)鍵任務(wù)是寫出正確的容易理解

91、、容易維護的程序模塊。程序員應(yīng)該根據(jù)目標(biāo)系統(tǒng)的性質(zhì)和實際環(huán)境,選取一種適當(dāng)?shù)母呒壋绦蛟O(shè)計語言,把詳細設(shè)計的結(jié)果翻譯成用選定的語言書寫的程序,并且仔細測試編寫出的每一個模塊。</p><p><b>  綜合測試</b></p><p>  這個階段的主要任務(wù)是通過各種類型的測試(及相應(yīng)的調(diào)試)使軟件達到預(yù)定的要求。最基本的測試是集成測試和驗收測試。所謂集成測試是根據(jù)設(shè)

92、計的軟件結(jié)構(gòu),把經(jīng)過單元測試檢驗的模塊按某種選定的策略裝備起來,在裝配過程中對程序進行必要的測試。所謂驗收測試是按照規(guī)格說明書的規(guī)定(通常在需求分析階段確定),有用戶(或在用戶的積極參加下)對目標(biāo)系統(tǒng)進行驗收。</p><p><b>  軟件維護</b></p><p>  軟件維護階段的關(guān)鍵任務(wù)是,通過各種必要的維護活動是系統(tǒng)持久地滿足用戶的需要。通常有四類維護活

93、動:改正性維護,有就是診斷和改正在使用過程中發(fā)現(xiàn)的軟件錯誤;適應(yīng)性維護,即修改軟件以適應(yīng)環(huán)境的變化;完善性維護,即根據(jù)用戶的要求改進或擴充軟件是它更完善;預(yù)防性維護,即修改軟件為將來的維護活動預(yù)先做準備。每一項維護活動都應(yīng)該準確地記錄下來,作為正式的文檔加以保存。</p><p>  3.4詞法語法分析簡介</p><p>  詞法分析的任務(wù)是從左到右一個字符一個字符地讀入源程序,對構(gòu)成源

94、程序的字符流進行掃描和分解,從而識別出一個個的單詞(也稱單詞符號或符號)。這里所謂的單詞是指邏輯上緊密相連的一組字符,這些字符具有集體含義。</p><p>  語法分析的任務(wù)是在詞法分析的基礎(chǔ)上將單詞序列分解成各類語法短語,如“程序”,“語句”,“表達式”等等,即判斷單詞序列是否符合組成各類語法短語的組成規(guī)則,一般這種語法短語,也稱為語法單位,可表示成語法樹。</p><p>  3.5

95、詞法需求分析簡介</p><p>  詞法分析階級是編譯過程的第一個階級。這個階級的任務(wù)是從左到右一個字符一個字符地讀入源程序,對構(gòu)成源程序的字符流進行掃描和分解,從而識別一個個單詞(也稱為單詞符號或符號)。這里所謂的單詞是指邏輯上緊密相連的一組字符,這些字符具有集體含義。比如標(biāo)識是由字母開頭,后跟字母、數(shù)字字符序列組成的一種單詞,。保留字是一種單詞,此外還有算符,界符等等。</p><p&g

96、t;  詞法分析器的主要任務(wù)是讀入輸入字符,產(chǎn)生記號序列,提交給語法分析使用。詞法分析器與語法分析器之間的交互如下圖:</p><p><b>  源程序記號</b></p><p><b>  取下一個字符</b></p><p><b>  剔除空白符和注釋</b></p><

97、;p>  詞法分析器讀入輸入串,將其轉(zhuǎn)換成將被語法分析器分析的記號流。許多語言允許“空白符”(空格,制表符或者換行符)出現(xiàn)在記號之間。原程序中的注釋一般都被語法分析器和翻譯器忽略,所以他們也可以看成空白符。</p><p><b>  常數(shù)</b></p><p>  在一個表達式中,任何一個允許單個數(shù)字出現(xiàn)的位置都應(yīng)該允許任何整型常數(shù)出現(xiàn)。由于翻譯期間把數(shù)作為

98、一個單元來處理,收集數(shù)字形成整數(shù)這一任務(wù)一般由詞法分析器完成。</p><p><b>  識別標(biāo)識符和關(guān)鍵字</b></p><p>  保留關(guān)鍵字的集合可以通過適當(dāng)?shù)爻跏蓟柋矶玫秸_的處理。</p><p>  實現(xiàn)詞法分析器的接口</p><p>  在詞法分析中,使用術(shù)語“記號”,“模式”,“詞素”表示特定

99、含義。記號包括:關(guān)鍵字、標(biāo)識符、操作符、常量、文字串、和標(biāo)點符號。詞法分析器把與記號有關(guān)的信息收集在記號的屬性中。記號影響語法分析,而屬性影響記號的翻譯。在實際實現(xiàn)時,記號通常只有一個屬性,即指向符號表中一個表項的指針,與記號有關(guān)的信息保存在這個詞素第一次出現(xiàn)的行為。這些信息存儲在符號表中該標(biāo)識符對應(yīng)的表項內(nèi)。</p><p>  記號的命名規(guī)則:正規(guī)表達式</p><p>  建立正規(guī)表

100、達式時,可以先定義簡單的正規(guī)表達式,然后用它們構(gòu)造出更復(fù)雜的正規(guī)表達式。每個表達式r表示一個語言L(R)。</p><p>  記號的識別:狀態(tài)轉(zhuǎn)換圖</p><p>  3.6語法需求分析簡介</p><p>  語法分析是編譯過程的第二個階級。語法分析的任務(wù)是在詞法分析的基礎(chǔ)上將單詞序列分解成各類語法短語,如“程序”,“語句”,“表達式”等等。一般這種語法短語,

101、也稱為語法單位,可表示成語法樹。語法分析所依據(jù)的是語言的語法規(guī)則,即描述程序結(jié)構(gòu)的規(guī)則。通過語法分析確定整個輸入串是否構(gòu)成一個語法上正確的程序。詞法分析和語法分析本質(zhì)上都是對源程序的結(jié)構(gòu)進行分析。但詞法分析的任務(wù)僅對源程序進行線性掃描即可完成,比如識別標(biāo)識符,因為標(biāo)識符的結(jié)構(gòu)是字母打頭的字母和數(shù)字序列,這只要順序掃描輸入流,遇到既不是字母又不是數(shù)字字符時,將前面所發(fā)現(xiàn)的所有字母和數(shù)字組合在一起而構(gòu)成單詞標(biāo)識符。但這種線性掃描則不能用于識

102、別遞歸定義的語法成分,比如就不能用此辦法去匹配表達式中的括號。</p><p>  語法分析的任務(wù)是語法分析器接收詞法分析研究器提供的記號串,檢查它們是否能由源程序的文法產(chǎn)生,語法分析器在編譯器中的位置如圖所示:</p><p>  源程序記號 中間表示</p><p><b>  語法樹&

103、lt;/b></p><p><b>  取下一</b></p><p><b>  個記號</b></p><p>  典型的文法的語法分析器有三類:一類是通用的語法分析方法,如Cocke-Younger-Kasami算法和Early算法,這些方法在生成編譯器時效率太低。編譯器常用的是自頂向下和自底向上的方法。&l

104、t;/p><p>  采用自頂向下的遞歸子程序法,就是對應(yīng)每個非終結(jié)符語法單元,編一個獨立的處理子程序。語法分析從讀入第一個單詞開始,由非終結(jié)符即開始符出發(fā),沿語法描述圖箭頭指出的方向進行分析。當(dāng)遇到非終結(jié)符時,則調(diào)用相應(yīng)的處理子程序,從語法描述圖看也就進入了一個語法單元,再沿當(dāng)前所進入的語法描述圖的箭頭方向進行分析,當(dāng)遇到終結(jié)符時,則判斷當(dāng)前讀入的單詞是否與圖中的終結(jié)符相匹配,若匹配,則執(zhí)行相應(yīng)的語義程序。再讀取下

105、一個單詞繼續(xù)分析。遇到分支點時將當(dāng)前的單詞與分支點上的多個終結(jié)符逐個相比較,若都不匹配時可能是進入下一非終結(jié)符語法單位或是出錯。</p><p><b>  3.7符號表的應(yīng)用</b></p><p>  在編譯程序中符號表用來存放語言中出現(xiàn)的有關(guān)標(biāo)識符的屬性信息,這些信息集中反映了標(biāo)識符的語義特征屬性。在詞法分析及語法分析過程中不斷積累和更新表中的信息,并在詞法分析

106、到代碼生成和各階段,按各自的需要從表中獲得不同的屬性信息。不論編譯策略是否分趟,符號表的作用和地位是完全一致的。符號表的功能主要有:</p><p>  收集符號屬性:在分析語言程序中標(biāo)識符說明部分時,編譯程序根據(jù)說明信息收集有關(guān)標(biāo)識符的屬性,并在符號表中建立符號的相應(yīng)屬性信息。</p><p>  上下文語義的合法性檢查的依據(jù):同一個標(biāo)識符可能在程序和不同地方出現(xiàn),而有關(guān)該符號和屬性是在

107、不同情況下收集的,特別是在多趟編譯及程序分段編譯的情況下,更需檢查標(biāo)識符屬性在上下文中的一致性和全法性。通過符號表中屬性記錄可進行這些語義檢查。</p><p>  作為目標(biāo)代碼生成階段地址分配的依據(jù):除語言中規(guī)定的臨時分配存儲的變量外,每個符號變量在目標(biāo)代碼生成時需要確定其在存儲分配的位置。語言程序中的符號變量由它被定義的存儲類別或被定義的位置來確定。首先要確定其被分配的區(qū)域。其次是根據(jù)變量出現(xiàn)的次序。<

108、/p><p>  在編譯程序中符號表用來存放語言程序中出現(xiàn)的有關(guān)標(biāo)識符的屬性信息,這些信息集中反映了標(biāo)識符的語義特征屬性。在詞法分析及語法分析過程中不斷積累和更新表中的信息,并在詞法分析到代碼生成的各階段,按各自的需要從表中獲取不同的屬性信息。不論編譯策略是否分趟,符號表的作用和地位是完全一致的。</p><p>  符號表的功能主要有:</p><p>  收集符號屬

109、性:在分析語言程序中標(biāo)識符說明部分時,編譯程序根據(jù)說明信息收集有關(guān)標(biāo)識符的屬性,并在符號表中建立符號的相應(yīng)屬性信息。</p><p>  下文語義的合法性檢查的依據(jù):同一個標(biāo)識符可能在程序和不同地方出現(xiàn),而有關(guān)該符號和屬性是在不同情況下收集的,特別是在多趟編譯及程序分段編譯的情況下,更需檢查標(biāo)識符屬性在上下文中的一致性和全法性。通過符號表中屬性記錄可進行這些語義檢查。</p><p>  

110、作為目標(biāo)代碼生成階段地址分配的依據(jù):除語言中規(guī)定的臨時分配存儲的變量外,每個符號變量在目標(biāo)代碼生成時需要確定其在存儲分配的位置。語言程序中的符號變量由它被定義的存儲類別或被定義的位置來確定。首先要確定其被分配的區(qū)域。其次是根據(jù)變量出現(xiàn)的次序。</p><p>  語言符號可分為關(guān)鍵字(保留字)符號,操作符號幾標(biāo)識符號。他們之間的主要屬性有較大的差別。因此通常為他們建立不同的符號表。</p><

溫馨提示

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

評論

0/150

提交評論