高級語言編譯器中詞法分析器的設計與實現(xiàn)_第1頁
高級語言編譯器中詞法分析器的設計與實現(xiàn)_第2頁
高級語言編譯器中詞法分析器的設計與實現(xiàn)_第3頁
高級語言編譯器中詞法分析器的設計與實現(xiàn)_第4頁
高級語言編譯器中詞法分析器的設計與實現(xiàn)_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 四川師范大學本科畢業(yè)設計高級語言編譯器中詞法分析器的設計與實現(xiàn)學生姓名張彪院系名稱物理與電子工程學院專業(yè)名稱通信工程班 級2008級 4 班學 號指導教師 陳萬川完成時間2012年 5月 12日高級語言編譯器中的詞法分析器的設計與實現(xiàn)學生姓名:張彪 指導老師:陳萬川內容摘要:編譯器是程序員使用的關鍵工具,程序員毎天都在使用編譯器,并且非常依賴于其正確性和可靠性。本文首先介紹了C語言及C語言編譯器的發(fā)展歷程,其次對本次開發(fā)所用到的工具Visual Studio C+2005以及面向對象的程序設計方法做一下簡單介紹。最后重點介紹了編譯器的詳細開發(fā)過程,分為四個部分分別闡述:詞法分析器的設計;語法

2、分析器的設計;語義分析;以及系統(tǒng)的用戶界面部分。每個部分又分別從總體框架,詳細流程,重點數據結構和函數,以及與其他部分的接口等方面予以闡述。由于C語言本身的復雜性,很難面面?zhèn)樀綄崿F(xiàn)所有標準定義,所以本次設計只象征性的選擇部分具有代表性的功能。在本文的第四章詳細給出了此次設計所實現(xiàn)的功能和語法規(guī)范,同時也給出了編譯器的運行方式。關鍵詞:編譯器 C源程序 VC+The lexical analyzers Design and Implementation of high-level language compilerAbstract: The compiler is a key tool used

3、 by the programmer. Programmers every day in the compiler, and is very dependent on its accuracy and reliability. This paper first describes the C language and C language compiler development process, make a brief introduction followed by the tools used to develop Visual Studio C + + 2005 as well as

4、 object-oriented programming method. Finally, highlight the compiler development process is divided into four parts, respectively, explained: The design of lexical analyzer, parser design, semantic analysis, as well as the system's user interface part. Each part separately from the overall frame

5、work of the process, focusing on data structures and functions, as well as other parts of the interface to be elaborated. Due to the complexity of the C language itself, difficult to Powerphones Ju to all standard definition, so the wood design is only symbolic choice of representative functions. Ch

6、apter IV of this paper is given in detail the design features and syntax specification, but also gives the compiler run.Keywords: compiler the C source VC + +目 錄1 緒論11.1 C語言及編譯器概述11.2 C編譯器設計思想11.3開發(fā)工具的選用及介紹21.4論文組織結構32 C語言詞法分析器的總體分析與設計42.1系統(tǒng)設計目標與功能分析42.2詞法分析42.3語法分析42.3.1自頂向下的語法分析52.3.2自底向上的語法分析52.4

7、語義分析52.5符號表62.6類型檢查73 系統(tǒng)詳細設計73.1系統(tǒng)設計基本思路73.2詞法分析模塊設計83.3語法分析模塊設計103.4語義分析模塊設計133.5界面設計考量153.5.1可用性原則153.5.2可視性原則163.5.3系統(tǒng)主要界面組成174 系統(tǒng)原型測試194.1系統(tǒng)測試基本原則194.2系統(tǒng)測試的步驟194.3測試結果205 結束語20致謝21參考文獻21高級語言編譯器中的詞法分析器的設計與實現(xiàn)1 緒論1.1 C語言及編譯器概述C語言是一種計算機程序設計語言。它既具有高級語言的特點,又具有匯編語言的特點。它由美國貝爾研究所的D.M.Ritchie于1972年推出。1978

8、后,C語言已先后被移植到大、中、小及微型機上。它可以作為工作系統(tǒng)設計語言,編寫系統(tǒng)應用程序,也可以作為應用程序設計語言,編寫不依賴計算機硬件的應用程序。它的應用范圍廣泛,具備很強的數據處理能力,不僅僅是在軟件開發(fā)上,而且各類科研都需要用到C語言,適于編寫系統(tǒng)軟件,三維,二維圖形和動畫。具體應用比如單片機以及嵌入式系統(tǒng)開發(fā)。詞法分析代表了一類問題的集合,即如何對輸入字符串中的特定模式進行具備特定動作的匹配。解決此類問題,不僅對于編譯器開發(fā)中的階段抽象具有重要意義,更對應用領域中有關字符處理的需求具有深刻價值。設計和實現(xiàn)詞法分析器,要用到詞素、記號、正則表達式、輸入字符雙緩沖區(qū)、符號表、狀態(tài)轉換圖

9、設計等概念。抽象地闡述這些概念往往晦澀難懂,而結合某一具體編譯器的前端實現(xiàn)來分析探討,則容易使概念條理清晰,目的明確。因此,從設計一個輕量級語言開始,根據語言編譯的要求設計和實現(xiàn)詞法分析器,將原理與實踐結合,將是研究此類問題的最佳途徑。 編譯是從源代碼(通常為高階語言)到能直接被計算機或虛擬機執(zhí)行的目標代碼(通常為低階語言或機器語言)的翻譯過程。然而,也存在從低階語言到高階語言的編譯器,這類編譯器中用來從由高階語言生成的低階語言代碼重新生成高階語言代碼的又被叫做反編譯器。也有從一種高階語言生成另一種高階語言的編譯器,或者生成一種需要進一步處理的的中間代碼的編譯器(又叫級聯(lián))。典型的編譯器輸出是

10、由包含入口點的名字和地址,以及外部調用(到不在這個目標文件中的函數調用)的機器代碼所組成的目標文件。一組目標文件,不必是同一編譯器產生,但使用的編譯器必需采用同樣的輸出格式,可以鏈接在一起并生成可以由用戶直接執(zhí)行的可執(zhí)行程序。1.2 C編譯器設計思想一個編譯器的主要工作過程可以概括為以下幾個步驟:(1)詞法分析詞法分析器根據詞法規(guī)則識別出源程序中的各個記號(token),每個記號代表一類單詞(lexeme)。源程序中常見的記號可以歸為幾大類:關鍵字、標識符、字面量和特殊符號。詞法分析器的輸入是源程序,輸出是識別的記號流。詞法分析器的任務是把源文件的字符 流轉換成記號流。本質上它查看連續(xù)的字符然

11、后把它們識別為“單詞”。(2)語法分析語法分析器根據語法規(guī)則識別出記號流中的結構短語、句子,并構造一棵能夠正確反映該結構的語法樹。(3)語義分析語義分析器根據語義規(guī)則對語法樹中的語法單元進行靜態(tài)語義檢查,如果類型檢查和轉換等,其目的在于保證語法正確的結構在語義上也是合法的。(4)中間代碼生成中間代碼生成器根據語義分析器的輸出生成中間代碼。中間代碼可以有若干種形式,它們的共同特征是與具體機器無關。最常用的一種中間代碼是三地址碼,它的一種實現(xiàn)方 式是四元式。三地址碼的優(yōu)點是便于閱讀、便于優(yōu)化。(5)中間代碼優(yōu)化優(yōu)化是編譯器的個重要組成部分,由于編譯器將源程序翻譯成中間代碼的工作是機械的、按固定模式

12、進行的,因此,生成的中間代碼往往在時間和空間上有很大浪費。當需要生成高效目標代碼時,就必須進行優(yōu)化。(6)目標代碼生成目標代碼生成是編譯器的最后一個階段。在生成目標代碼時要考慮以下幾個問題:計算機的系統(tǒng)結構、指令系統(tǒng)、寄存器的分配以及內存的組織等。編譯器生成的目標程序代 碼可以有多種形式:匯編語言、可重定位二進制代碼、內存形式。(7)符號表管理符號表的作用是記錄源程序中符號的必要信息,并加以合理組織,從而在編譯器的各個階段能對它們進行快速、準確的查找和操作。符號表中的某些內容甚至要保留到程序的 運行階段。(8)出錯處理用戶編寫的源程序中往往會有一些錯誤,可分為靜態(tài)錯誤和動態(tài)錯誤兩類。所謂動態(tài)

13、錯誤,是指源程序中的邏輯錯誤,它們發(fā)生在程序運行的時候,也被稱作動態(tài)語義錯誤,如變量取值為零時作為除數,數組元素引用時下標出界等。靜態(tài)錯誤又可分為語法錯誤和 靜態(tài)語義錯誤。語法錯誤是指有關語言結構上的錯誤,如單詞拼寫錯、表達式中缺少操作數、begin和end不匹配等。靜態(tài)語義錯誤是指分析源程序時可以發(fā)現(xiàn)的語言意義上的錯誤,如加法的倆個操作數中一個是整型變量名,而另一個是數組名等。本系統(tǒng)的設計主要是實現(xiàn)了其中的詞法分析、語法分析和語義分析三個部分。1.3開發(fā)工具的選用及介紹軟件環(huán)境使用Window2000/XP操作系統(tǒng),用Visual C+.Net為開發(fā)平臺,在開發(fā)此軟件時用的是VC+中的MFC

14、框架。Visual C+.Net2005是微軟公司推出的開發(fā)Win32應用程序(Windows95/98/2000/XP/NT)的面向對象的可視化集成工具。從原來的Visual C+6.0/ Visual C+.Net 2005升級而來,它的最大優(yōu)點就是提供了功能強大的MFC類庫,MFC是一個很大的類層次結構,其中封裝了大量的類及其函數,很多Windows程序所共有的標準內容可以由MFC的類來提供,MFC類為這些內容提供了用戶接口的標準實現(xiàn)方法,程序員所要做的就是通過預定義的接門把具體應用程序特有的東西填入這個輪廓,這將簡化編程工作,大大的減少程序員編寫的代碼數量,使編程工作變得更加輕松容易。

15、當然還有Visual 2008 和最新的Visual 2010beta版也已經發(fā)布。Visual Studio2005的成功已被證實,即開發(fā)人員偏愛一個具備對他們需要的工具提供接口的集成開發(fā)環(huán)境。下面主要介紹它的特點。通過將開發(fā)人員在開發(fā)環(huán)境中需要的測 試和性能工具(例如,單元測試、代碼分析和性能分析)合并在一起,Visual Studio 2005 Team System也期待著這種成功。這使開發(fā)人員能夠在生命周期的較早階段就改善其代碼的質量,而無需中斷他們的工作。通過盡早地為開發(fā)人員提供他們需要用于識別和解決質量問題的工具,更多的產品缺陷就能夠在它們還未構成危害之前即被發(fā)現(xiàn)并解決。Visu

16、al Studio 2005 Team System,那么過程就不僅僅是文檔了。它還能將自己體現(xiàn)為實際的工具行為更改。當您在項目初期選擇過程時,還需要選擇工作流和工作產品,它們會驅動系統(tǒng)的行為方式。對SDL過程的支持是內置的,這使得對工作流的支持是無縫的。通過將過程集成到團隊成員日常使用的基本工具中,Visual Studio 2005 Team System加大消除了過程釆納的障礙,并使自動收集跨職能的項目標準成為可能,而無需實施人工報告的相關開銷。通過使用一個公共的跨工具集的數據倉庫,Visual Studio 2005 Team System解決了在大多數SDLC工具中建立數據倉庫這一問

17、題,并啟動了一個聚合的項月狀態(tài)視圖。團隊根據能夠收集到的規(guī)則來管理項目。今天,數據主要限于缺陷跟蹤。Visual Studio 2005 Team System中集成的數據將開創(chuàng)一條新路通過平衡利用貫穿于SDLC的大量、多樣的數據來管理項目規(guī)則。Visual Studio 2005 Team System會收集精確的數據不僅限于缺陷跟蹤,而是包括測試結果、代碼涵蓋、代碼生成、任務進度等這些貫穿于團隊常規(guī)工作流程的數據。該數據以某些標準的報告方式呈現(xiàn),客戶和Mcrosoft內部團隊已在報告中建立了成功項目管理的關鍵規(guī)則。此外,團隊還能夠創(chuàng)建自定義報告。僅當以項目的大范圍上下文查看數據時,才能夠精

18、確地報告項目狀態(tài)。這些優(yōu)點也是此次畢業(yè)設計選用此開發(fā)工具的主要原因。1.4論文組織結構全文共由四部分組成: 第一章 緒論簡述了C語言的發(fā)展以及一般編譯器的工作原理,并介紹了本系統(tǒng)開發(fā)的主要平臺和工具及其特點。第二章 C語言詞法分析器的總體分析與設計簡單的介紹了系統(tǒng)的設計目標及系統(tǒng)要實現(xiàn)的功能。簡單的介紹了幾個要實現(xiàn)的編譯步驟的概念和要完成的任務。第三章 系統(tǒng)的詳細設計介紹了系統(tǒng)的基本流程,各個模塊的設計思想和核心代碼部分。第四章 系統(tǒng)原型的測試對原型系統(tǒng)進行了測試。 2 C語言詞法分析器的總體分析與設計2.1系統(tǒng)設計目標與功能分析本系統(tǒng)的設計同標是完成一個小型的C語言編譯器,由于要完成一個完美

19、的C語言編譯器是一件非常復雜的事情,不僅要考慮C語言代碼的各種靈活用法,還需要熟悉生成目標代碼和生成解析可執(zhí)行文件的原理,甚至是匯編語言。所以本系統(tǒng)只完成整個編譯過程中的詞法分析、語法分析、語義分析以及其中的建立符號表和類型檢查幾個步驟,并不生成最后的可執(zhí)行文件。另外,本系統(tǒng)包含一個簡單易用的用戶界面部分,可以進行C語言代碼的編寫、打開、保存等功能,并且代碼視圖釆用的是關鍵字高亮顯示技術,使代碼的閱讀更加直觀。而在編譯過程中,下部的輸出窗門實時顯示編譯過程中發(fā)現(xiàn)的錯誤等信息,最后顯示編譯結果。下面分別概括介紹編譯過程中的這幾個階段。2.2詞法分析詞法分析程序又稱掃描器,它是編譯過程的第一個階段

20、。其主要任務是從左到右依次描述字符中形式的源程序的各個字符,逐個識別出其中的單詞,并將其轉換成為內部編碼形式的單詞符號串輸出,用于進行語法分析。通??舍娪枚剑–LASS,VALUE)來表示一個單詞符號的內部編碼,其中CLASS為一整數碼,用于表示該單詞的類別;VALUE則是單詞之值(如變量名在符號表中的序號,常數的二進制表示,以及運算符和分隔符的編碼,等等。概括的說,掃描器在其工作過程中,一般應完成下列的任務:(1)識別出源程序中的各個單詞符號,并將其轉換成內部編碼形式;(2)刪除無用的空白字符、回車字符以及其他非實質性字符;(3)刪除注釋;(4)進行詞法檢查,報告所發(fā)現(xiàn)的錯誤。此外,視編

21、譯工作流程的組織,一些編譯程序在進行詞法分析時,還要完成將所識別出的標志符登錄到符號表的工作。從功能上看,詞法分析上把字符幣形式的源程序轉換為單詞形式,然后進行語法分析。從工作方式上看,與語法分析之間存在兩種接口方式。一種方式是將詞法分析的輸出結果存放在一個中間文件上,后面的語法分析程序將它作為輸入進行語法分析。另一種方式是將詞法分析編成一個子程序,該子程序由語法分析程序調用,當語法分析程序需要一個新的單詞時,就調用該子程序,每調用一次,則從源程序字符中中讀出一個具有獨立意義的單詞。本設計釆用前一種方式。2.3語法分析語法分析程序又稱分析器,它以單詞串形式的源程序作為輸入或分析的對象,其基本任

22、務是:報據程序設計語言的語法規(guī)則(即定義該語言的前后無關文法,分析源程序的語法結構,即分析如何由這些單詞組成該源程序的各種語法成分如下標變量、函數、各種表達式、各種程序語句等,并在分析過程中進行語法正確性檢查,產生內部形式的中間代碼,供編譯程序后續(xù)階段處理。目前,已存在多種語法分析方面的方法,但就產生語法樹的方向而言,可大致把它們分為自頂向下分析和自底向上分析兩大類。2.3.1自頂向下的語法分析所謂自頂向下的語法分析,只指對于給定輸入串w,試圖為其構造一個從文法開始符號S到W的最左推導S=>W或為自上而下地構造一棵S為報結點的語法樹。如果這一嘗試得到成功,則證明w是相應文法的一個句子;反

23、之,則不是。在進行自頂向下的語法分析時,通常有兩個障礙須加以解決:(1) 由于釆取了最左推導,故當相應文法G中含有左遞歸的非終結符號時,便會使語法分析過程陷入循環(huán)不已的狀態(tài);(2)采用最左推導以實現(xiàn)對符號串雙的匹配,實際上是一個用文法產生式的諸候選式反復進行試探的過程,這勢必會出現(xiàn)大量的回溯,從而導致語法分析效率的大幅度下降。因此,欲實現(xiàn)自頂向下的語法分析,其首要任務是改造程序設計語言的文法,使得文法無左遞歸且無左公因子,以消除其中的左遞歸和避免回溯的出現(xiàn)。2.3.2自底向上的語法分析所謂自底向上的語法分析,是指從給定的輸入串w=a1a2出發(fā),試圖利用相應文法中的產生式,逐步將其歸納為文法的開

24、始符號S,即從葉結點a1,a2,an出發(fā),試圖逐步向上構造一個語法樹,而其報結點恰好為S0由于上述分析過程通常釆用的是最左歸納,所以實現(xiàn)此種語法分析的關鍵,是在分析的每一步,如何尋找或確定當前句型的句柄,以及確定將其歸納為什么非終結符號。在自頂向下的分析過程一樣,實現(xiàn)自底向上的分析,通常也須使用一個分析棧來存放分析過程中所得的文法符號。分析開始時,在棧底放置一個界符#,然后將輸入符號逐個推入棧內,一旦在分析棧的棧頂出現(xiàn)句柄,就用相應的產生式的左部去替換這個句柄,即進行一次歸納。由于歸納,便得到了新的桟頂,此時再查看桟的頂部是否形成新的句柄:若是,再進行歸納;反之,則繼續(xù)將后續(xù)的輸入符號移入棧內

25、,并重復上述過程。若最終能將全部輸入符號不包括右界符#移掉,且分析桟中只留下棧底符號#及最后一步歸納所 得的文法開始符號,則表明對輸入串的分析已經成功。但若全部輸入符號已被移掉,而分析棧卻不能出現(xiàn)上述格局,則表明輸入符號串不是文法的一個句子,其中必定存在語法錯誤。通常將上述過程稱為“移進-歸納”分析,它是最基本的自底叫上分析過程。在此基礎上,根據尋找句柄策略的不同,便形成了不同的自底向上的語法分析方法。2.4語義分析在完成了上述過程后編譯程序將源程序變成一種內部表示形式,這種內部表示形式就叫做中間代碼或中間語言,它是一種結構簡單、含義明確的記號系統(tǒng)。有些快速編譯程序幾乎沒有中間代碼,但是為了使

26、目標代碼的優(yōu)化比較容易實現(xiàn),獨立于機器進行,許多編譯程序都采用了某種復雜性程度介于源程序語言和機器語言之間的中間語言。2.5符號表 符號表的信息欄中登記了每個名字的有關性質,如類型(整、實或布爾等、種屬(簡單變量、數組、過程等、大?。ㄩL度,即所需的存儲單元字數)以及相對數(指分配給該名字的存儲單元的相對地址)。不同的程序語言對于名字性質的定義各有不同?,F(xiàn)今多數程序語言中的名字或者是用說明語句規(guī)定其性質,或者采用某種隱含約定(如FORTRAN中凡 以字符I,J,N開頭的標識符代表整型變量名。有些程序語言,如ADL沒有說明語句也沒有隱含約定,因此,符號表的性質須到目標程序運行時才能確定下來。但編譯

27、時登記在符號表中的各名字的性質只能來自說明語句(包括隱含約定和標號定義或其它引用情形。對于變量名、數組名和過程名而言,它們的信息欄中一般要求有下列信息:種屬(簡單變量、數組或記錄結構等);長度(所需的存儲單元數);相對數(存儲單元相對地址);若為數組,則記錄其內情向量);若為記錄結構,則把它與其分量按某種形式聯(lián)系起來;形式參數標志;若在COMMON或EQUVALENCE語句中(FORTRAN語言),把它和有關名字連接在一起;它是否已處理過(即標志位“定義否”);是否對這個變量進行過賦值(包括出現(xiàn)在輸人名表中)的標志位;過程是否為程序的外部過程;若為函數,類型是什么;其說明是否處理過;是否遞歸;

28、形式參數是些什么;為了與實參進行比較,必須把它們的種屬、類型信息間過程名聯(lián)系在一起。對于那些只使圖單一符號表的簡單語言,對符號表填入新項的工作可由詞法分析程序 來完成。也就是,當掃描器碰到一個標識符時就對它查填符號表,然后回送它在符號表中的位置作為單詞值。但在某些語言中,甚至在同一過程段里允許不同一標識符標識各種不同對象。例如,XYZ既是一個實變量名又是一個標號名,或者又是某個結構型數據的一個分量名。在這種情況下,使用單一符號表或由詞法分析程序負責查填符號表都是非常不方便的。因此,釆用多種符號表并讓語法語義分析程序負責查填工作是比較妥當的。 對于詞法分析程序來說,只要求它凡碰到標識符就直接送出

29、此標識符自身即可。符號表中信息欄的具體組織和安排取決于所翻譯的具體語言與目標機器(的字長和指令系統(tǒng)。2.6類型檢查為了進行類型檢査,編譯器需要給源程序的每一個組成成分賦予一個類型表達式。然后,編譯器需要確定這些類型表達式是否滿足一組邏輯規(guī)則。這些規(guī)則被稱為源語言的類型系統(tǒng)。類型檢查具有發(fā)現(xiàn)程序中的錯誤的功能。原則上,如果目標代碼在保存元素值的同時保存了元素類型的信息,任何檢查都可以動態(tài)地進行。一個健全的類型系統(tǒng)可以消除對動態(tài)類型檢查的需要,因為它可以幫助我們靜態(tài)地確定這些錯誤不會在程序運行的時候發(fā)生。 如果編譯器可以保證它接受的程序在運行時刻不會發(fā)生類型錯誤,那么該語言的這個實現(xiàn)就被稱為強類型

30、的。3 系統(tǒng)詳細設計3.1系統(tǒng)設計基本思路 基于C語言源程序分析器的開發(fā)在可行性分析的基礎上進一步全面、深入的分析,弄清C語言的編譯原理及運行狀況,在編譯程序工作的五個階段中,每個階段都必須遵從功能等價的原則。詞法規(guī)則與語法分析階段依據的語法規(guī)則一同構成了一個語言的語法,而語法 則是從"形”的角度衡量一個程序是否合法。所以在詞法分析階段,詞法規(guī)則成為重要的研究對象。詞法分析器所處理的對象即詞法分析程序的輸入數據,實際上是源程序經過編譯預處理,去掉多余的符號后而形成的代碼,這樣給詞法分析帶來方便。詞法分析的過程是線性的從頭至尾掃描一遍,復雜度較低,易實現(xiàn)。最后概括出要實現(xiàn)的幾個功能流程

31、圖如下: 圖1 功能流程圖3.2詞法分析模塊設計詞法分析程序需要完成的任務如下:1識別出源程序的各個語法單位;2剔除無用的空白字符、制表符、回車字符以及其他與輸入介質相關的非實質性字符;3過濾掉源程序中的注釋;4進行詞法檢查,如果出現(xiàn)錯誤,記錄出錯信總并報告。我們將編譯程序的重點放在中間代碼生成階段。詞法分析器的功能是輸入源程序,輸出單詞符號。這部分程序主要包括兩個類: Class CTlkenizer從一個字符串中(這個把一個文件看作是一個字符串,MFC中Cfile->CString)分離出 一個一個token,配上簡單的類型通過NextToken( )返回:#define TT_EO

32、L 'n'#define TT_EOF -1#define TT_INTEGER -2#define TT_REAL -3#define TT_WORD -4#define TT_STRING #define TT_CHAR 得到具體的token類型,定義TokenType如下:enum TokenType / reserved Keyword _AUTO, _DOUBLE, _INT, _STRUCT, _BREAK, _ELSE, _LONG, _SWITCH, _CASE, _ENUM, _REGISTER, _TYPEDEF, _CHAR, _EXTERN, _RETU

33、RN, _UNION, _CONST, _FLOAT, _SHORT, _UNSIGNED, _CONTINUE, _FOR, _SIGNED, _VOID, _DEFAULT, _GOTO, _SIZEOF, _VOLATILE, _DO, _IF, _STATIC, _WHILE, _READ, _WRITE, _PRINTF, / operations ASSIGN, PLUS, MINUS, TIMES, DIV, MOD, BITWISE_AND, BITWISE_OR, BITWISE_NOT, LOGICAL_NOT, LT, GT, / interpunctions LPARA

34、N, RPARAN, LBRACE, RBRACE, LSQUARE, RSQUARE, COMMA, DOT, SEMI, / operations ASSIGN, PLUS, MINUS, TIMES, DIV, MOD, BITWISE_AND, BITWISE_OR, BITWISE_NOT, LOGICAL_NOT, LT, GT, / interpunctions LPARAN, RPARAN, LBRACE, RBRACE, LSQUARE, RSQUARE, COMMA, DOT, SEMI, COLON, / complex operations 11 EQ/* = */,

35、NEQ/* != */, PLUS_PLUS/* + */, MINUS_MINUS/* - */, PLUS_ASSIGN/* += */, MINUS_ASSIGN/* -= */, TIMES_ASSIGN/* *= */, DIV_ASSIGN/* /= */, NGT/* <= */, NLT/* >= */, LOGICAL_AND/* && */, LOGICAL_OR/* | */, / others _EOF, _ID, _NUM, _STRING, _CHARACTER, _LABEL, _ERROR, _NONE ;CScaner通過一個CMa

36、p<CString, LPCSTR, enum TokenType, enum TokenType> m_KeyIndex 把CString的關鍵字和TokenType對應,便于查找和反向查找。表1 C關鍵字表標識符詞法:identifier :nondigitidentifier nondigitidentifier digitnondigit : one of_ 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 X Y Zdigit :

37、 one of0 1 2 3 4 5 6 7 8 9escape:n, r, b, 0-7 3.3語法分析模塊設計在上一節(jié)中,實現(xiàn)了詞法分析程序的功能。一個字符串形式的源程序經過詞法分析,即被轉換為一串單詞符號。編譯程序在完成了詞法分析之后,就進入語法分析階段。語法分析程序以單詞形式的源程序作為輸入或分析的對象。其基本任務是根據語言的語法規(guī)則(即描述該語言的上下文無關文法),分析源程序的語法結構即分析如何將這些單 詞組成各種語法成分,如各種表達式、語句、函數或過程等,并在分析過程中,對源程序進行語法正確性檢查。其分析結果是識別出無語法錯誤的語法成分。其輸出形式也有多種。 語法分析模塊的核心部分

38、設計如下:Class Cparser:定義CTreeNode,和Tiny例程類似: #define MAX_CHILDREN 3 class CTreeNode public: CTreeNode* child MAX_CHILDREN ; / point to child node CTreeNode* father; / point to father node CTreeNode* sibling; / point to sibling node int lineno; NodeKind nodekind; union StmtKind stmt; ExpKind exp; kind;

39、enum TokenType type; CString szName; CString szScope; / node function scope BOOL bArray; / is this an array declaration int iArraySize; / array size ; 通過文法及相應規(guī)則建立語法樹。 Grammar: program->declaration_list declaration_list->declaration_list declaration | declaration declaration->var_declaration

40、 | fun_declaration var_declaration->type_specifier ID(, .); | type_specifier ID NUM (, .); type_specifier->int | void | char, actually this step is in declaration_list() fun_declaration->type_specifier ID ( params ) compound_stmt params->param_list | void | empty, void is thought as empt

41、y param_list->param_list , param | param param->type_specifier ID | type_specifier ID compound_stmt-> loal_declarations statement_list | expression_stmt local_declarations->local_declarations var_declaration | var_declaration read ( var ) ; write ( expression ) ; printf ( " STRING &

42、quot; ) ; expression_stmt->expression ; | ; expression->var = expression | logic1_expression logic1_expression->logic1_expression | logic2_expression | logic2_expression logic2_expression-> logic2_expression && simple_expression | simple_expression simple_expression->additive_

43、expression relop additive_expression | additive_expression relop-> <= | < | > | >= | = | != additive_expression -> additive_expression addop term | term addop-> + | - term->term mulop logic3_expression | logic3_expression mulop-> * | / | % logic3_expression-> ! logic3_e

44、xpression | factor factor->( expression ) | var | call | NUM var->ID | ID expression call->ID ( args ) args->args_list | empty args_list->args_list , expression | expression sub_compoundstmt->ID : | call ; | expression_stmt if_stmt->if ( expression ) compound_stmt | if ( express

45、ion ) compound_stmt else compound_stmt while_stmt->while ( expression ) compound_stmt for_stmt->for ( var = expression ; expression ; var = expression ) compound_stmt goto_stmt->goto ID ; break_stmt->break ; continue_stmt->continue ; return_stmt->return ; | return expression ;基本樹形結

46、構:圖2 if語句基本樹形結構圖圖3 while語句基本樹形結構圖圖4 for語句基本樹形結構圖 圖5 合語句基本樹形結構圖支持的語句及運算: 1)數據類型:int,char void,PCode里支持float,在80x86 ASM里不支持 2)語句:賦值(=),if, while,for,return,break,continue 3)數學運算:+,*,/ 4)關系運算:= =,>,<,>=,<=,!= 5)邏輯運算:&&,|,! If6)支持函數的定義、調用7)支持復合語句 8)注釋語句:C類型的/* */ 和C+類型的/3.4語義分析模塊設計語義

47、分析的任務是根據語義規(guī)則對識別出的各種語法成分分析其含義,進行初步翻譯。具體來說,其主要任務包括以下幾部分:1、確定類型。即確定標識符所對應數據對象的數據類型,這部分工作有時也由詞法分析來完成。2、語義檢查。動態(tài)語義檢查在運行時進行,需要生成相應的目標代碼;而靜態(tài)語義檢查則在編譯時完成,它主要完成以下四個方而。3、識別含義。如果靜態(tài)語義正確,則進行正真的翻譯,即識別程序中各種語法成分的含義,并做相應的語義處理,生成相應的中間代碼或直接生成目標代碼。語義分析程序是在詞法分析和語義分析之后,可以由語法分析程序直接調用相應的語義子程序進行語義處理,也可以先生成語法樹的某種表示方法,再進行語義處理。編

48、譯的各個階段都可能發(fā)現(xiàn)源程序中的錯誤。發(fā)現(xiàn)錯誤后如果立即停止編譯,往往會降低調式程序的效率,所以應對出現(xiàn)的錯誤做適當的處理,從而使編譯能繼續(xù)進行。詞法分析可以檢測出源程序中的非法字符,就好比自然語言中出現(xiàn)的錯字和錯詞。語法分析能夠發(fā)現(xiàn)程序語句中的各種語法錯誤,如括號不匹配等。語義分析能夠判斷運算對象的類型是否匹配,變量是否重復聲明或沒有聲明就使用等錯誤。任何時刻發(fā)現(xiàn)錯誤,都應該報告錯誤信息,包括錯誤出現(xiàn)的位置和錯誤性質等,為程序員調試程序提供方便。本程序在語義分析部分設計主要包括兩方而的內容,即建立符號表和類型檢查。 建立符號表: 輔助類:Class BucketListRec:主要成員是li

49、neno,記錄某個Token(變量或函數名)聲明或使用時的行數。主要成員變量:CString name; / variable name CString scope; / function scope enum TokenType type; int memloc;/ memory location for variable BOOL bArray; / for array checking LineListRec* lineno; BucketListRec* next;記錄每一個變量或函數名的具體情況。主要的類:建立符號表:Class CsymbolTable:主要成員變量:BucketL

50、istRec* hashTableSIZE,把Class BucketListRec類的對象通過:函數PrintSynbalTable(LPCTSRT lpszPathName),輸入文件名,通過個遞歸函數輸 出符號表到文件lpszPathName。Class CfunArgsCheck:插入函數參數的類型,以備在下一個步驟中做匹配檢測。類型檢測:Class CAnalyzer包括兩個部分:(1)類型匹配:函數或變量聲明時檢測是否已聲明,如已聲明則拋出錯誤;函數調用或變量使用時檢測是否已聲明,如未聲明則拋出錯誤。(2)函數調用參數檢測:檢測函數調用時傳入參數的類型與函數聲明時參數的類型是否匹配

51、。3.5界面設計考量界面設計需要遵循一個基本理論,其核心內容是以已有的界面設計規(guī)范為指導原則,在不破壞已有的界面交互習慣的基礎上修改創(chuàng)新。桌面界面的設計,在最早的個人電腦上就有實施,后來由蘋果公司和微軟公司反復修改和優(yōu)化,如今已經逐漸演變成一套系統(tǒng)的設計規(guī)范,所有軟件圖形界面,所有而向的指導文檔,甚至許多為新型移動設備提供的設計參考都相繼遵從,大多數的界面開發(fā)工具都默認支持這些規(guī)范所設定的描述語言和相關內容。最重要的是,用戶交互界面在多年來透過操作系統(tǒng)和通用軟件已經漸漸被使用者熟悉。無論是界面放置和控制方法(例如鼠標點擊和快捷鍵操作)都已成為習慣,如果這種習慣被打破,就會引起客戶的抗拒心理,因

52、為他們需要花時間學習和掌握,甚至會降低客戶的工作效率。另一方而,通用的界面規(guī)范不一定能夠滿足程序語言分析軟件的功能要求,因為畢竟客戶是軟件開發(fā)者而不是普通的應用性使用者,因此,需要在界面設計上有一些修改與創(chuàng)新,讓編譯結果對于客戶一目了然。3.5.1可用性原則可用性是源代碼分析器設計的根本目的,其概念包含三個方面的內容。首先,有用性和有效性,即系統(tǒng)能否實現(xiàn)一定的功能以及交互界面能否有效支持產品功能。其次是交互效率,包括交互過程的安全性、用戶績效、出錯頻率及嚴重性、易學性和易記性等因素。最后,用戶對交互界面的滿意度。(1)可視性可視性是建立目標操作和實際操作之間的對應。用戶在對某個對象進行操作時,

53、需要始終能在屏幕上看得見該對象,并及時呈現(xiàn)執(zhí)行結果。這樣“直接”的操作可以使用戶避免處理一些瑣碎流程。此外,在界面設計時利用隱喻方法,將日常生活中具體、熟悉的概念具像化,使其清晰、明顯,更能便于用戶對于界面的理解和使用。(2)反饋適當的反饋能令用戶隨時掌握分析器所處的運行狀態(tài)。系統(tǒng)的反饋按形式可以分為兩類,一類是非文字反饋,另一類是文字反饋。如利用不同顏色的源代碼來區(qū)分關鍵字,利用背景的變化或是字體的前景色。反饋必須是直接、簡單的。(3)一致性保持界面的一致性能夠幫助用戶迅速熟悉系統(tǒng)的功能,包括內部一致性和外部一致性,體現(xiàn)在字體、圖標、色彩、版式、質感、指令音等多個方面。一方面在系統(tǒng)各部分之間

54、保持外觀、用詞、布局的一致性,另一方面與其它系統(tǒng)、傳統(tǒng)習慣及標準之間也需保持一致。界面的設計在很大程度上還要遵循以往的經驗與傳統(tǒng),最大限度地與用戶預期達成一致。(4)容錯性錯誤是和用戶對系統(tǒng)的理解以及使用的熟練程度有關的。系統(tǒng)通過允許犯錯機制,鼓勵用戶勇于嘗試。同時使用幫助信息,幫助他們在解決問題的過程中建立對系統(tǒng)的正確理解。此外,界面表達清楚并能適時提供反饋也將有助于避免錯誤狀況的發(fā)生。3.5.2可視性原則視覺是人類獲取信息的主要途徑。可視設計即利用構圖原則、對比原則等來科學合理地組織屏幕的色彩、字體、圖標等要素,以便引導用戶操作。而可視性往往受到顯示設備的影響和限制,成為設計中的不確定因素

55、。(1)布局合理一些傳統(tǒng)的平面設計理論、公認的優(yōu)良格式與版面安排在界面設計中同樣有效。如利用黃金分割原則設計界面、保持視覺平衡、適當的留白、通過線條或圖形引導用戶等視覺設計原則,妥善有效地組織界面信總,令用戶即使長時間盯著屏幕也可以愉悅地使用。(2)圖形簡潔在設計中應保持圖形的單純性,除非圖形的運糾能夠有助于提升界面的使用性。對圖 標、窗口、對話框等界面基本組成要素在設計時都應遵循此原則,避免在屏幕上堆積過多窗口、添加過復雜的圖標或在對話框中放置過多按鈕,使用戶產生混淆與困擾。 (3)語義明確圖形自身所具有的特殊語義功能可快速地幫助用戶理解和使用系統(tǒng)界面,因此在設計時要避免令同一圖形產生不同語義。此外,對于加入菜單、對話框或其它界面要素中的非標準符號,其意義需要經過反復確認,使其與用戶所期望的代表行為盡可能一致。 (4)色彩協(xié)調色彩是設計師向用戶傳遞特定信息的一種方式。通過不同色彩間的有機搭配,可以令界面賞心悅目,但過多的色彩反而會使信息混亂不堪。此外,利用約

溫馨提示

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

評論

0/150

提交評論