【正文】
設(shè)計能與自然語言處理相互印證,是一個值得思考的領(lǐng)域。本文首先介紹了C語言及C語言編譯器的發(fā)展歷程,其次對本次開發(fā)所用到的工具Visual Studio C++2005以及面向?qū)ο蟮某绦蛟O(shè)計方法做一下簡單介紹。“THE C PROGRAMMING LANGUAGE”一書。它層次清晰,便于按模塊化方式組織程序,易于調(diào)試和維護(hù)。編譯是從源代碼(通常為高階語言)到能直接被計算機(jī)或虛擬機(jī)執(zhí)行的目標(biāo)代碼(通常為低階語言或機(jī)器語言)的翻譯過程。詞法分析器的任務(wù)是把源文件的字符流轉(zhuǎn)換成記號流。當(dāng)然還有Visual 2008和最新的Visual 2010beta版也已經(jīng)發(fā)布。當(dāng)您在項目初期選擇過程時,還需要選擇工作流和工作產(chǎn)品,它們會驅(qū)動系統(tǒng)的行為方式。該數(shù)據(jù)以某些標(biāo)準(zhǔn)的報告方式呈現(xiàn),客戶和 Microsoft 內(nèi)部團(tuán)隊已在報告中建立了成功項目管理的關(guān)鍵規(guī)則。本系統(tǒng)只完成整個編譯過程中的詞法分析、語法分析、語義分析以及其中的建立符號表和類型檢查幾個步驟。從工作方式上看,他與語法分析之間存在兩種接口方式。在進(jìn)行自頂向下的語法分析時,通常有兩個障礙須加以解決:(1) 由于采取了最左推導(dǎo),故當(dāng)相應(yīng)文法G中含有左遞歸的非終結(jié)符號時,便會使語法分析過程陷入循環(huán)不已的狀況。但若全部輸入符號已被移掉,而分析棧卻不能出現(xiàn)上述格局,則表明輸入符號串不是文法的一個句子,其中必定存在語法錯誤。現(xiàn)今多數(shù)程序語言中的名字或者是用說明語句規(guī)定其性質(zhì),或者采用某種隱含約定(如FORTRAN中凡以字符I,J,…N開頭的標(biāo)識符代表整型變量名)。例如,XYZ可能既是一個實變量名又是一個標(biāo)號名,或者又是某個結(jié)構(gòu)型數(shù)據(jù)的一個分量名。類型檢查具有發(fā)現(xiàn)程序中的錯誤的功能。詞法分析的過程是線性的從頭至尾掃描一遍,復(fù)雜度較低,易實現(xiàn)。\n39。 */, LOGICAL_OR/* || */, // others _EOF, _ID, _NUM, _STRING, _CHARACTER, _LABEL, _ERROR, _NONE}。其輸出形式也有多種。 } kind。Grammar:programdeclaration_listdeclaration_listdeclaration_list declaration | declarationdeclarationvar_declaration | fun_declarationvar_declarationtype_specifier ID(, ...)`。amp。` | `return` expression `。動態(tài)語義檢查在運(yùn)行時進(jìn)行,需要生成相應(yīng)的目標(biāo)代碼;而靜態(tài)語義檢查則在編譯時完成,它主要完成以下四個方面。語義分析能夠判斷運(yùn)算對象的類型是否匹配,變量是否重復(fù)聲明或沒有聲明就使用等錯誤。 // memory location for variableBOOL bArray。函數(shù)調(diào)用參數(shù)檢測:檢測函數(shù)調(diào)用時傳入?yún)?shù)的類型與函數(shù)聲明時參數(shù)的類型是否匹配。參考文獻(xiàn)[1] [M].南京:東南大學(xué)出版社出版,2002。 return 1。ch)) { line[ll] = 0。 } ch = line[cc]。a39。 } getchdo。039。 i=0。 } else { if(ch=39。 sym=number。amp。) { getchdo。) { getchdo。) { getchdo。 } } } } } return 0。=39。=39。=39。939。039。amp。 do{ k=(i+j)/2。amp。a39。amp。 return 0。 } printf(%c,ch)。 cc = 0。[3] 賀世娟, Basic 程序設(shè)計[M].北京:中國水利水電出版社出版。在開發(fā)基于C語言小型編譯器前端中,還是用系統(tǒng)分析、系統(tǒng)設(shè)計的思路。BucketListRec* next。本程序在語義分析部分設(shè)計主要包括兩方面的內(nèi)容,即建立符號表和類型檢查。如果靜態(tài)語義正確,則進(jìn)行正真的翻譯,即識別程序中各種語法成分的含義,并做相應(yīng)的語義處理,生成相應(yīng)的中間代碼或直接生成目標(biāo)代碼。amp。` | expression_stmtif_stmt`if` `(` expression `)` pound_stmt| `if` `(` expression `)` pound_stmt `else` pound_stmtwhile_stmt`while` `(` expression `)` pound_stmtfor_stmt`for` `(` var `=` expression `。`type_specifier`int` | `void` | `char`, actually this step is in declaration_list()fun_declarationtype_specifier ID `(` params `)` pound_stmtparamsparam_list | `void` | empty, `void` is thought as emptyparam_listparam_list `,` param | paramparamtype_specifier ID | type_specifier ID `[` `]`pound_stmt`{` loal_declarations statement_list `}` | expression_stmtlocal_declarationslocal_declarations var_declaration | var_declaration`read` `(` var `)` `。 CString szName。 // point to child node CTreeNode* father。C關(guān)鍵字表:autodoubleintstructbreakelselongswitchcaseenumregistertypedefcharexternreturnunionConstfloatshortunsignedContinueforsignedvoidDefaultgotosizeofvolatileDoifstaticwhile標(biāo)識符詞法: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 : one of0 1 2 3 4 5 6 7 8 9 escape: \n, \r, \b, \07 語法分析模塊設(shè)計 在上一節(jié)中,實現(xiàn)了詞法分析程序的功能。39。 2) 剔除無用的空白字符、制表符、回車字符以及其他與輸入介質(zhì)相關(guān)的非實質(zhì)性字符 。一個健全的類型系統(tǒng)可以消除對動態(tài)類型檢查的需要,因為它可以幫助我們靜態(tài)地確定這些錯誤不會在程序運(yùn)行的時候發(fā)生。因此,采用多種符號表并讓語法——語義分析程序負(fù)責(zé)查填工作是比較妥當(dāng)?shù)?。但編譯時登記在符號表中的各名字的性質(zhì)只能來自說明語句(包括隱含約定和標(biāo)號定義)或其它引用情形。在此基礎(chǔ)上,根據(jù)尋找句柄策略的不同,便形成了不同的自底向上的語法分析方法。因此,欲實現(xiàn)自頂向下的語法分析,其首要任務(wù)是改造程序設(shè)計語言的文法,使得文法無左遞歸且無左公因子,以消除其中的左遞歸和避免回溯的出現(xiàn)。另一種方式是將詞法分析編成一個子程序,該子程序由語法分析程序調(diào)用,當(dāng)語法分析程序需要一個新的單詞時,就調(diào)用該子程序,每調(diào)用一次,則從源程序字符串中讀出一個具有獨(dú)立意義的單詞。 詞法