版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
工學第三章詞法分析詞法:描述語言的單詞符號的文法。語言的種類很多,因此需要用不同的詞法來描述他們。例如描述某一語言標識符的文法也稱為詞法。3.1詞法分析與詞法分析程序思考:詞法是哪類文法?詞法分析的任務:對輸入的字符串形式的源程序按順序進行掃描,根據(jù)源程序的詞法規(guī)則識別具有獨立意義的單詞(符號),并產(chǎn)生與其等價的屬性字流作為輸出。詞法分析程序定義:編譯程序中完成詞法分析任務的程序段,又稱詞法分析器或掃描器(scanner)。
詞法分析程序的功能識別出單詞(內部表示);詞法分析器(scanner)源程序屬性字流L1While(i!=j)doif(i>j)i=i-j;//求i,j的差值詞法分析器‘while’,‘(’,‘i’,‘!=’,‘j’,‘)’,‘do’,‘if’,‘(’,‘i’,‘>’,‘j’,‘)’,'i','=’,'i',’-’,'j',‘;'3.2詞法分析程序設計與實現(xiàn)詞法分析程序的輸入與輸出源程序的輸入與預處理單詞的識別詞法分析程序與詞法分析程序的接口詞法分析器的設計與實現(xiàn)單詞是語言中具有獨立意義的最小語法單位.單詞的種類
1.關鍵字(保留字):while、class、for、do2.標識符:a、m_a3.常數(shù):無符號數(shù)、布爾常數(shù)、字符串常數(shù)等4.運算符:+、-、*5.界限符:逗號,分號,括號和引號種類的劃分是根據(jù)編譯的目標和方便設定的單詞常用的單詞內部形式:1、按單詞種類分類2、保留字和分界符采用一符一類3、標識符和常數(shù)的單詞屬性值為符號表入口指針(標識符、常數(shù)相關屬性很多)(單詞屬性,單詞值)屬性字:詞法分析程序的輸出形式-----單詞的內部形式單詞名稱標識符無符號常數(shù)(整)無符號浮點數(shù)布爾常數(shù)字符串常數(shù)保留字分界符類別編碼1234567單詞值符號表入口指針整數(shù)值數(shù)值0或1內部字符串保留字或內部編碼分界符或內部編碼1、按單詞種類分類2、保留字和分界符采用一符一類單詞名稱標識符無符號常數(shù)(整)無符號浮點數(shù)布爾常數(shù)字符串常數(shù)BEGINENDFORDO………:+*,(類別編碼123456789…….20212223…….單詞值符號表入口指針整數(shù)值數(shù)值0或1內部字符串----…..-----3.2.2源程序的輸入與預處理詞法分析器工作的第一步是接受輸入源程序。通常是把輸入的源程序引導至一個輸入緩沖區(qū),并對輸入串進行預處理,然后才交付掃描器進行處理。S.P.(字符串)詞法分析程序輸入緩沖區(qū)的處理?輸入緩沖區(qū)的處理?顯然,無論緩沖區(qū)設定為多大,都不能保證單詞不會被它的邊界打斷,若有標識符TEST123,可能在緩沖區(qū)中成為:………….TES在這種情況下,即使讀到緩沖區(qū)的最后一個字符,但仍不能找到該單詞的右邊界,這時,若從外存上再讀一部分源程序進入緩沖區(qū),則會將沒有處理過的字符(TES)沖掉。兩個半?yún)^(qū)互補使用為此,我們可將緩沖區(qū)分成相等的兩個區(qū)域:掃描緩沖區(qū)一分為二,互補使用。搜索指針從單詞起點開始搜索,如果遇到半?yún)^(qū)域的邊界,但尚未到達單詞的終點時,則可將后續(xù)的輸入字符裝入該緩沖區(qū)的另一半。單詞起點
搜索指針I(yè)fFatendoffirsthalf{reloadsecondhalf;F++;}ElseifFatendofsecondhalf{ reloadfirsthalf;moveFtobeginningoffirsthalf}ElseF++;輸入緩沖區(qū)兩個半?yún)^(qū)互補功能的實現(xiàn)算法源程序的預處理為了減輕詞法分析器實質性處理的負擔,因此源程序從輸入緩沖區(qū)進入詞法分析器之前,要先對源程序進行預處理,預處理子程序一般完成的主要功能是:過濾掉源程序中的注釋;剔除源程序中無用字符;進行宏替換;實現(xiàn)文件包含的嵌入和條件編譯的嵌入等。具有兩個緩沖區(qū)的詞法分析器結構源程序L輸入緩沖區(qū)X預處理子程序掃描緩沖區(qū)X1詞法分析器源程序L的屬性字流實現(xiàn)方案(編譯程序中實現(xiàn)方式):基本上有兩種1.詞法分析單獨作為一遍2.詞法分析程序作為單獨的子程序S.P.(字符串)詞法分析S.P.(符號串)語法分析第一遍第二遍單詞串優(yōu)點:結構清晰、各遍功能單一缺點:生成中間文件,效率低S.P.(字符串)詞法分析程序語法分析程序取單詞單詞★詞法分析程序的設計與實現(xiàn)詞法規(guī)則正規(guī)表達式狀態(tài)轉換圖(最小DFA)1.構造識別單詞的狀態(tài)轉換圖(1)對程序語言的單詞按種類分別構造對應的狀態(tài)轉換圖.(2)對各類轉換圖合并,構成一個能識別語言所有單詞的狀態(tài)轉換圖.2.編程實現(xiàn)狀態(tài)轉換圖1.詞法及其狀態(tài)轉換圖例1假定語言X的字母表∑={A-Z,a-z,0-9,;,=}單詞符號定義如下: 1、標識符:字母打頭的字母數(shù)字串 2、無符號整數(shù):無符號數(shù)字串 3、分界符:; 4、運算符:=標識符出口S1非字母數(shù)字字母字母、數(shù)字無符號整數(shù)出口S1非數(shù)字數(shù)字數(shù)字分界符出口S;運算符出口S=標識符無符號整數(shù)分界符S1非字母數(shù)字*字母字母、數(shù)字2非數(shù)字*數(shù)字數(shù)字;出口出錯其他讀字符返回S運算符==80;0134256eniL字母字母字母字母數(shù)字數(shù)字數(shù)字==;;0124563Line=80;1,‘Line’3,‘=’2,‘80’4,‘;’數(shù)字數(shù)字字母字母11==0003;;1輸入輸出2.狀態(tài)轉換圖的實現(xiàn)——構造詞法分析程序標識符無符號整數(shù)分界符運算符<1,標識符名字><2,整數(shù)值><3,“;”><4,“=”>例1假定語言X的字母表∑={A-Z,a-z,0-9,;,=}單詞符號定義如下: 1、標識符:字母打頭的字母數(shù)字串 2、無符號整數(shù):無符號數(shù)字串 3、分界符:; 4、運算符:=標識符S1非字母數(shù)字字母字母、數(shù)字無符號整數(shù)S1非數(shù)字數(shù)字數(shù)字分界符出口S;運算符S=出口出口出口標識符出口S1非字母數(shù)字字母字母、數(shù)字If(ISLETTER){WHILE(ISLETTERORISDIGIT)DO{
當前字符放入一臨時字符數(shù)組;
GETNEXTCHAR;//從緩沖區(qū)取下一字符};UNGETCH;//回退一字符OUTPUT(1,標識符名字);};=80;eniLLine=80;==;;無符號整數(shù)出口S1非數(shù)字數(shù)字數(shù)字If(ISDIGIT){WHILEISDIGITDO{
當前字符放入一臨時字符數(shù)組;
GETNEXTCHAR;//從緩沖區(qū)取下一字符};UNGETCH;//回退一字符OUTPUT(2,整數(shù));};=80;eniLLine=80;==;;分界符出口S;If(CH==‘;’)OUTPUT(3,“;”);If(CH==‘=’)OUTPUT(4,“=”);運算符S=出口標識符無符號整數(shù)分界符S1字母字母、數(shù)字2數(shù)字數(shù)字;出口出錯其他讀字符返回S運算符=例1程序語言的詞法分析程序GETNEXTCHAR();SWITCH(CHCODE);{CASE1:{WHILE(ISLETTERORISDIGIT)DO{SAVE();//當前字符放入一臨時字符數(shù)組;GETNEXTCHAR();//從緩沖區(qū)取下一字符};UNGETCH;//回退一字符OUTPUT(1,標識符名字);};BREAK;CASE2:{WHILEISDIGITDO{SAVE();//當前字符放入一臨時字符數(shù)組;GETNEXTCHAR;//從緩沖區(qū)取下一字符};UNGETCH;//回退一字符OUTPUT(2,整數(shù));};BREAK;CASE3:OUTPUT(3,“;”);BREAK;CASE4:OUTPUT(4,“=”);BREAK;DEFAULT:Error();};標識符無符號整數(shù)分界符S1字母字母、數(shù)字2數(shù)字數(shù)字;出口出錯其他讀字符返回S運算符=采用面向對象的方法設計詞法分析器標識符無符號整數(shù)分界符S1字母字母、數(shù)字2數(shù)字數(shù)字;出口出錯其他讀字符返回S運算符=詞法規(guī)則正規(guī)表達式狀態(tài)轉換圖(最小DFA)合并狀態(tài)轉換圖編程實現(xiàn)狀態(tài)轉換圖合并狀態(tài)轉換圖文法、正規(guī)表達式、有限自動機有限自動機(最小化?)3.3
詞法分析程序的自動生成器—LEX(LEXICALAnalyzerGenerator)LEX是1972年在貝爾實驗室的UNIX上首先實現(xiàn)FLEX是1984年GNU工程推出,是LEX的擴充,并兼容LEX原理:LEX源程序(lex.l)S.P.字符串LEX編譯器詞法分析程序L(lex.yy.c)S.P.單詞字符串C編譯器可執(zhí)行L詞法分析程序L(lex.yy.c)可執(zhí)行L1.LEX源程序的結構一個LEX源程序具有如下形式:聲明部分%%識別規(guī)則%%輔助函數(shù)各部分之間用%%隔開,同時%%在最左邊.一、聲明部分
D1R1
D2R2∶∶DnRn
其中:R1,R2,……,Rn為正則表達式。D1,D2,……,Dn為正則表達式名字
例:C++標識符letterA|B|¨¨¨|Z|_
digit0|1|¨¨¨|9
idletter(letter|digit)*二、識別規(guī)則:是一串如下形式的LEX語句:
模式{動作}P1{A1}P2{A2}∶∶Pm{Am}Pi:定義在Σ∪{D1,D2,¨¨Dn}上的正規(guī)表達式,也稱模式。{Ai}:Ai為語句序列,它指出,在識別出模式為Pi的單詞以后,詞法分析器所應作的動作。其基本動作是返回單詞的類別編碼和其屬性。三、輔助函數(shù)定義模式動作需要的函數(shù)在這三部分中一和三為可選項,但是二是必須的
一對特殊的符號%{和%}:出現(xiàn)在括號內的所有內容都被復制到文件中,它們不會被當作正則定義處理。下面是識別某語言單詞符號的LEX源程序:例:LEX源程序AUXILIARYDEFINITIONS/*聲明部分*/letter[A—z]digit[0—9]%%RECOGNIYIONRULES/*識別規(guī)則*/“BEGIN”“END”“FOR”{RETURN(1,─)}{RETURN(2,─)}{RETURN(3,─)}RETURN是LEX過程,該過程將單詞傳給語法分析程序RETURN(C,LEXVAL)其中C為單詞類別編碼LEXVAL:標識符:TOKEN(字符數(shù)組)整常數(shù):DTB(數(shù)值轉換函數(shù),將TOKEN中的數(shù)字串轉換二進制值)其他單詞:無定義?!癟HEN”“ELSE”{
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度新能源車輛技術研發(fā)與制造合同3篇
- 2024幼兒園教職工聘任與管理綜合服務合同范本3篇
- 2024年簡易鋼材配送合同
- 會計法規(guī)培訓模板
- 雙十一營銷策略分析模板
- 餐具廚具銷售員工作總結
- 航空航天會計工作總結
- 金融行業(yè)分析師培訓總結
- 湘中幼兒師范高等??茖W?!督逃?jīng)典名著選讀》2023-2024學年第一學期期末試卷
- 財務工作年終績效總結
- YYT 0698.1-2011 最終滅菌醫(yī)療器械包裝材料 第1部分 吸塑包裝共擠塑料膜 要求和試驗方法
- 入職申請登記表(模板)
- 高考物理動量守恒定律試題(有答案和解析)
- 兒童運動發(fā)育的早期干預和康復
- 《道路交通安全法》課件
- 工作優(yōu)化與效益提升
- 電機教學能力大賽獲獎之教學實施報告
- 新生兒家庭式護理
- 山東省泰安市新泰市2023-2024學年四年級上學期期末數(shù)學試卷
- DB21-T 3324-2020 螺桿擠壓式秸稈膨化機 技術條件
- 供水公司招聘考試題庫及答案
評論
0/150
提交評論