實驗一(詞法分析)_第1頁
實驗一(詞法分析)_第2頁
實驗一(詞法分析)_第3頁
實驗一(詞法分析)_第4頁
實驗一(詞法分析)_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上南京信息工程大學實驗(實習)報告 一 實驗目的1、 學會針對DFA轉(zhuǎn)換圖實現(xiàn)相應的高級語言源程序。2、 深刻領(lǐng)會狀態(tài)轉(zhuǎn)換圖的含義,逐步理解有限自動機。3、 掌握手工生成詞法分析器的方法,了解詞法分析器的內(nèi)部工作原理。二 實驗內(nèi)容計算機程序設計語言的編譯程序的詞法分析部分實現(xiàn)。給出算法的流程圖及有窮狀態(tài)自動機的模型(可以用矩陣或者狀態(tài)圖表示)從左到右掃描每行該語言源程序的符號,拼成單詞,換成統(tǒng)一的內(nèi)部表示(token)送給語法分析程序。為了簡化程序的編寫,有具體的要求如下:(1) 數(shù)僅僅是整數(shù)。(2) 空白符僅僅是空格、回車符、制表符。(3) 代碼是自由格式。(4) 注

2、釋應放在花括號之內(nèi),并且不允許嵌套三 實驗要求要求實現(xiàn)編譯器的以下功能:(1) 按規(guī)則拼單詞,并轉(zhuǎn)換成二元式形式(2) 刪除注釋行(3) 刪除空白符 (空格、回車符、制表符)(4) 列表打印源程序,按照源程序的行打印,在每行的前面加上行號,并且打印出每行包含的記號的二元形式(5) 發(fā)現(xiàn)并定位錯誤詞法分析進行具體的要求:(1) 記號的二元式形式中種類采用枚舉方法定義;其中保留字和特殊字符是每個都一個種類,標示符自己是一類,數(shù)字是一類;單詞的屬性就是表示的字符串值。(2) 詞法分析程序當識別一個單詞完畢,采用返回值的形式返回符號的種類,同時采用程序變量的形式提供當前識別出記號的屬性值。(3) 標示

3、符和保留字的詞法構(gòu)成相同,為了更好的實現(xiàn),把語言的保留字建立一個表格存儲,這樣可以把保留字的識別放在標示符之后,用識別出的標示符對比該表格,如果存在該表格中則是保留字,否則是一般標示符。(選做)四 實驗步驟(1)詞法分析器的設計方法有如下四個步驟: 1.寫出該語言的詞法規(guī)則。 2.把詞法規(guī)則轉(zhuǎn)換為相應的狀態(tài)轉(zhuǎn)換圖。 3.把各轉(zhuǎn)換圖的初態(tài)連在一起,構(gòu)成識別該語言的自動機。 4.設計掃描器;把掃描器作為語法分析的一個過程,當語法分析需要一個單詞時,就調(diào)用掃描器。掃描器從初態(tài)出發(fā),當識別一個單詞后便進入終態(tài),送出二元式。 詞法分析需要一個單詞時,掃描器取單詞的程序流程圖如下: (2)詞法分析器的輸出

4、形式 詞法分析器輸出的單詞符號常常表示為二元式:(單詞種別,單詞符號的屬性值) 單詞種別通常用整數(shù)編碼。 標識符一般統(tǒng)歸為一種。常數(shù)按類型(整、實、布爾等)分種。關(guān)鍵字可視其全體為一種,也可以一字一種。采用一字一種的分法實際處理起來較為方便。運算符可采用一符一種的方法。至于界符一般也采用一符一種的分法。 (3)核心代碼及其功能 #include "ctype.h"#include "string.h"#include "stdio.h" /*定義一個全局變量,一個全局指針*/FILE *fp; /*fp是一個指向FILE類型結(jié)構(gòu)的指針

5、變量,可以使fp指向某一個文件 的結(jié)構(gòu)變量,從而通過該結(jié)構(gòu)體變量中的文件信息訪問該文件*/int id; /*標志變量,用來標識各類型的ID*/*函數(shù)聲明*/int search(char searchchar,int wordtype); char alphaprocess(char buffer);char digitprocess(char buffer);char otherprocess(char buffer);void error();/*主函數(shù)*/void main() /*自定義函數(shù)的聲明*/char cbuffer;if (fp=fopen("example.cp

6、p","r")=NULL) /*以只讀方式打開文件"example.c",NULL在 stdio.h文件中已被定義為0*/printf("error");else cbuffer=fgetc(fp); /*文件不為空則從文件中取字符*/while (cbuffer!=EOF) /*EOF文件結(jié)束標志*/if(cbuffer=' '|cbuffer='n'|cbuffer='t') /*掠過空格和回車符*/cbuffer=fgetc(fp);/id=4;else if(isalp

7、ha(cbuffer) cbuffer=alphaprocess(cbuffer); /*檢查cbuffer是否為字母,是則調(diào)用alphaprocess()函數(shù)*/else if (isdigit(cbuffer)cbuffer=digitprocess(cbuffer); /*檢查cbuffer是否為數(shù)字09,是則調(diào)用digitprocess()函數(shù)*/else cbuffer=otherprocess(cbuffer); /*非上述兩者則調(diào)用otherprocess()函數(shù)*/*主函數(shù)結(jié)束*/*處理讀取字符為字母的情況*/char alphaprocess(char buffer) int

8、 atype;int i=-1;char alphatp20; /*字符數(shù)組存儲從文件中讀取的字符*/while(isalpha(buffer)|(isdigit(buffer)|buffer='_'|buffer='.') /*標識符的組成成分*/alphatp+i=buffer; /*將當前讀取的字符存如數(shù)組*/buffer=fgetc(fp); /*讀取下一個字符*/alphatpi+1='0' /*字符串以'0'作為結(jié)束標志*/atype=search(alphatp,1); /*調(diào)用函數(shù),判斷當前字符串是否為關(guān)鍵字*/

9、if(atype!=0) /*是關(guān)鍵字則輸出該關(guān)鍵字,編號為1,并輸出該關(guān)鍵字在關(guān)鍵字表中的位子*/printf("(%s, (1,%d)n",alphatp,atype); id=1; /*關(guān)鍵字的ID為1*/elseprintf("(%s ,2)n",alphatp); /*為標識符時,編號為2*/id=2; /*標識符的ID為2*/ return(buffer); /*判斷字符串是否為關(guān)鍵字*/int search(char searchchar,int wordtype)char *key32="auto","bre

10、ak","case","char","const","continue","default","do","double","else", "enum","extern","float","for","goto","if","int","long","regis

11、ter","return","short","signed","sizeof","static","struct","volatile","while","switch","typedef","union","unsigned","void"/*設置數(shù)組指針存儲c語言中的32個關(guān)鍵字*/int i;int p;switch (w

12、ordtype)case 1:for (i=0;i<=31;i+) if (strcmp(keyi,searchchar)=0) /*比較字符串,為關(guān)鍵字則定位該關(guān)鍵字的序號*/ p=i+1; break; else p=0; return(p);/*alphaprocess()函數(shù)結(jié)束*/*處理讀取字符為數(shù)字時的情況*/char digitprocess(char buffer)int i=-1;char digittp20;int flag=0;while (isdigit(buffer)|buffer='.'|buffer='e'|buffer=&#

13、39;E')/考慮數(shù)字為小數(shù)和指數(shù)時的情況 if(buffer='.'|buffer='e'|buffer='E')flag+;digittp+i=buffer;buffer=fgetc(fp); /*同上*/digittpi+1='0'if(flag>1) error();else printf("(%s ,3)n",digittp); /*輸出該數(shù)字,編號為3*/ id=3; /*設置ID為3*/return(buffer);/*digitprocess()函數(shù)結(jié)束*/*處理讀出字符為其他字符

14、的情況*/char otherprocess(char buffer) int n=0;char ch20;ch0=buffer;ch1='0'if(ch0='%'|ch0='') buffer=fgetc(fp);ch1=buffer;ch2='0'printf("(%s ,4)n",ch); /*識別運算符% */id=4;buffer=fgetc(fp); return(buffer);if(ch0='&') buffer=fgetc(fp);if(buffer!='&am

15、p;') printf("(%s ,4)n",ch); /*識別引用運算符&*/ id=4;return(buffer);if(buffer='&') ch1=buffer;ch2='0'printf("(%s ,4)n",ch); /*識別關(guān)系運算符&&*/id=4;buffer=fgetc(fp); return(buffer);if(ch0=','|ch0=''|ch0=''|ch0=''|ch0='(&#

16、39;|ch0=')') printf("(%s ,5)n",ch); /*分界符,;()的id標記為5*/buffer=fgetc(fp); id=5; return(buffer);if(ch0='*'|ch0='/') /*運算符 '*''/'的id標記為4*/ printf("(%s ,4)n",ch);buffer=fgetc(fp); id=4; return(buffer); if(ch0='='|ch0='!'|ch0='

17、;<'|ch0='>') buffer=fgetc(fp);if(buffer='=') /*防止'=','!=','<=','>='符號的分離*/ ch1=buffer;ch2='0'printf("(%s ,4)n",ch); /*'=','!=','<=','>='的標記為4 */else printf("(%s ,4)n",ch)

18、; /*'=','!','<','>'的標記為4*/id=4;return(buffer); buffer=fgetc(fp); id=4;return(buffer);if(ch0='+'|ch0='-') if(id=4) /*如果'+','-'前ID為4的字符則可能為正負數(shù)或'+','-',否則為加減號*/ for(int i=1;i<10;i+)buffer=fgetc(fp);if(buffer='+

19、')ch1='+'ch2='0'id=4;goto L;break; /*跳出for循環(huán)體*/if(buffer='-')ch1='-'ch2='0'id=4;goto L;break; /*跳出for循環(huán)體*/if(buffer=',')|(buffer='')|(buffer='+')|(buffer='-')|(buffer=')') break; /*防止將+12;+12,+12+,+12-,+12)作為整體輸出*/chi=buffer; chi+1='0'printf("(%s ,3)n",ch); /*識別特殊數(shù)字*/id=3; /buffer=fgetc(f

溫馨提示

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

評論

0/150

提交評論