資源描述:
《【精品】詞法分析》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、MXXX院系:專業(yè)、年級(jí):課程名稱:編譯原理班級(jí):學(xué)號(hào):姓名:指導(dǎo)教師:2010年11月21日08軟件工程實(shí)驗(yàn)類別:綜合型組員學(xué)號(hào)姓名實(shí)驗(yàn)名稱實(shí)驗(yàn)一:詞法分析實(shí)驗(yàn)室9205實(shí)驗(yàn)?zāi)康幕蛞笠?、?shí)驗(yàn)?zāi)康耐ㄟ^(guò)設(shè)計(jì)編制調(diào)試一個(gè)具體的詞法分析程序,加深對(duì)詞法分析原理的理解。并掌握在對(duì)程序設(shè)計(jì)語(yǔ)言源程序進(jìn)行掃描過(guò)程中將其分解為各類單詞的詞法分析方法。編制一個(gè)讀單詞過(guò)程,從輸入的源程序中,識(shí)別出各個(gè)具有獨(dú)立意義的單詞,即基本保留字、標(biāo)識(shí)符、常數(shù)、運(yùn)算符、分隔符五大類。并依次輸出各個(gè)單詞的內(nèi)部編碼及旳詞符號(hào)自身值。二、實(shí)驗(yàn)要求1、基本要求識(shí)別保留字:if、int、for>whil
2、esdo、return>breakxcontinue等等;單詞種別碼為1。其他的都識(shí)別為標(biāo)識(shí)符;單詞種別碼為2。常數(shù)為無(wú)符號(hào)數(shù);單詞種別碼為3。運(yùn)算符包括:+、-、*、/、二、>、〈等;單詞種別碼為4。分隔符包括:”等;單詞種別碼為5。2、擴(kuò)充功能增加保留字。case、char、double等。識(shí)別負(fù)數(shù)(浮點(diǎn)數(shù))。增加更復(fù)雜情況如>=、<=、!=等兩個(gè)字符的運(yùn)算符。處理注釋“//”和“/**/”,包括存在干擾的“/***/”。實(shí)驗(yàn)原理(算法流程)一、實(shí)驗(yàn)說(shuō)明本次實(shí)驗(yàn)所川語(yǔ)言為C#,開(kāi)發(fā)環(huán)境為VisualStudio2008,采川事件驅(qū)動(dòng)來(lái)完成相關(guān)操作。可以通過(guò)兩種
3、方式來(lái)導(dǎo)入源程序。一是宜接導(dǎo)入cpp或者txt文件:二是直接在窗口里而敲入源代碼進(jìn)行分析。二、實(shí)驗(yàn)原理單擊“開(kāi)始分析”按鈕后。先會(huì)將整個(gè)源程序保存到一個(gè)str的字符串甲面。然后判斷字符串的長(zhǎng)度是否為0。不為0則取出str的第一個(gè)字符,并調(diào)用分類函數(shù)(classify)進(jìn)行分類,山一個(gè)全變量num記錄種類。接著進(jìn)入由str的長(zhǎng)度控制的循環(huán),并根據(jù)不用的種類進(jìn)行不同的操作。保留字、標(biāo)識(shí)符:num為1時(shí)(第一個(gè)字符為字母),在不超iistr.Length-1的情況下,讀取下一個(gè)字符,同時(shí)把已讀的字符存入token字符串中(后面會(huì)輸出token),直到讀取的字符不為字母或
4、者當(dāng)前字符位置(由j記錄)超過(guò)str.Length-1(下面的其它情況中,讀取吋均會(huì)考慮此越界問(wèn)題,兇此下而的情況就不贅述了),最后再調(diào)用Check函數(shù),檢查token字符串是保留字還是其它標(biāo)識(shí)符,并輸出該字符串及對(duì)應(yīng)的種別碼再跳出該情況。數(shù)字:num為3時(shí)(當(dāng)前字符為數(shù)字),讀取情況同num為1類似,只是讀取過(guò)程中會(huì)判斷是有“?”,即浮點(diǎn)數(shù)。同樣,讀取的字符不為數(shù)字或者,”時(shí),直接輸出token及數(shù)字的種別碼并跳出該情況。運(yùn)算符:num為4吋(當(dāng)前字符為運(yùn)算符)。運(yùn)算符可以是一個(gè)字符也可以是多個(gè)字符,同吋“■”可以是減運(yùn)算符也可以是負(fù)號(hào),所以得多次單獨(dú)讀取下一個(gè)
5、字符進(jìn)行判斷。先讀取下一個(gè)字符,若為數(shù)字,則會(huì)繼續(xù)讀到非數(shù)字(浮點(diǎn)數(shù)也有考慮)為止,最后輸入負(fù)數(shù)及其種別碼;若不為數(shù)字,則考慮兩個(gè)運(yùn)算符的情況(如“+=”),最后都輸IBtoken(一個(gè)字符的運(yùn)算符兩個(gè)的運(yùn)算符卻別表現(xiàn)在j上面)并跳出這種情況。分隔符:num為5時(shí)(當(dāng)前字符為分隔符),山于分隔符只用一?個(gè)字符,所以直接輸出分隔符及對(duì)應(yīng)的種別碼,跳出該情況。注釋:num為6時(shí)(當(dāng)前字符為“/”,除運(yùn)算或者注釋)。讀取下一個(gè)字符,若為“/”則說(shuō)明讀到單行注禪,就一直讀到木行末;若為“*”,則說(shuō)明讀到多行注釋的情況,同樣一直讀下去,知道遇到“*/”為止;剩下的情況則為除
6、運(yùn)算符,進(jìn)行輸出。結(jié)朿這種情況。判斷j7、ata;usingSystem.Drawing;usingSystem?Linq;usingSystem?Text;usingSystem.Windows.Forms;namespaceWinForml{publicpartialclassForml:Form{intnum=0;//分類標(biāo)記charch='';//當(dāng)前讀到的字符stringtoken=//存已讀字符程序代碼stringstr=“";〃保存整個(gè)源文件publicForml()//構(gòu)造慚數(shù){InitializeComponent();}privatevoidForml_Load(objectsende
8、r,Evo