北郵編譯原理詞法分析器實驗_第1頁
北郵編譯原理詞法分析器實驗_第2頁
北郵編譯原理詞法分析器實驗_第3頁
北郵編譯原理詞法分析器實驗_第4頁
北郵編譯原理詞法分析器實驗_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、詞法分析程序設(shè)計一.問題描述1可以識另IJ出用C語言編寫的源程序中的每個單詞符號,并以記號的形式輸出每個單詞符號。2可以并識別讀取源程序中的注釋。3可以統(tǒng)計源程序中的語句行數(shù)、單詞個數(shù)和字符數(shù),其中標點和空格不計為單詞,并輸出統(tǒng)計結(jié)果。4檢察源程序中存在的錯誤,并可以報告錯誤所在行列的位置。5發(fā)現(xiàn)原程序中存在的錯誤,進展適當(dāng)修復(fù),使詞法分析可以繼續(xù)進展,通過一次詞法分析處理,可以檢查并報告源程序中存在的所有錯誤。二.算法思想編寫一個詞法分析程序,它從左到右逐個字符的對源程序進展掃描,產(chǎn)生一個個的單詞形成記號流文件輸出。其中,具體子問題有:1源程序文件讀入緩沖區(qū)中注意要刪除空格和無用符號2確定讀

2、入的為關(guān)鍵字還是運算符還是變量名,對于普通標識符和常量,分別建立標識符表和常量表當(dāng)遇到一個標識符或常量時,查找標識符表或常量表,假設(shè)存在,那么返回位置,否那么進入符號表或常量表中并返回表的入口地址。3對于各類運算符、標點符號、以及注釋符號等,準確識別出來并打印輸出結(jié)果4對于源文件中出現(xiàn)的數(shù)字常量,不但能按要求參加常量表中,還進展了字符型到float型數(shù)值的轉(zhuǎn)換,便于后續(xù)程序操作處理。4盡量精簡整合各種情況,使算法復(fù)雜度降低,精簡易讀。三、實驗程序設(shè)計說明1主要函數(shù)說明voidreadChar();/讀字符過程,每調(diào)用一次,從輸入緩沖區(qū)讀一個字符,并把它放入變量C中,且向前掃描指針pointer

3、指向下一個字符voidignoreSpace();/每次調(diào)用時,檢查C中的字符是否為空字符,假設(shè)是,那么反復(fù)調(diào)用該過程,直到C進入一個非空字符為止voidlink();/把C中的字符與token中的字符串連接起來boolalphabet。;/布爾函數(shù),判斷C中的字符是否為字母,假設(shè)是那么返回true,否那么返回falsebooldigit();/布爾函數(shù),判斷C中的字符是否為數(shù)字,假設(shè)是那么返回true,否那么返回falseintsearchForKeywords();/查關(guān)鍵字表,假設(shè)此函數(shù)的返回值為0,那么表示token中的字符串是標識符,否那么為關(guān)鍵字intsearchForToken(

4、);/查符號表,假設(shè)此函數(shù)的返回值為0,那么表示token中的字符串是新出現(xiàn)的,否那么為已出現(xiàn)過的標識符intsearchForNum();/查常數(shù)表,假設(shè)此函數(shù)的返回值為0,那么表示token中的數(shù)字是新出現(xiàn)的,否那么為已出現(xiàn)的常數(shù)voidinsertTokenList();/將標識符插入符號表voidinsertNumList();/將數(shù)字插入常數(shù)表voidfillBuffer(inta);/填充buff的半?yún)^(qū)函數(shù)2 .程序源代碼#include<stdio.h>#include<stdlib.h>#include<string.h>#include&l

5、t;math.h>intpointer=0;/inti=0,j=0,c=0,appear,d=0,num_location;/introw_num=0,letter_num=0,word_num=0;intz=1;charC=''/chartoken30;/charbuff4095;/chartoken_list20030;/charnumber20010;/charnext_characcharacfile_name20;charkeywords3210="auto","break","case","

6、char","const”continue”default","do"double","else","enum"extern","float","for","goto","if","int","long”register”return","short","signed","sizeo","fstat

7、ic”struct","switch","typedef","union"unsigned","void"volatile","while"doublenum;FILE*file_pointer;voidf川Buffer(inta)/i=0;while(!feof(file_pointer)&&i<2048)/buffa+i=charaqif(charac!='')/if(charac='n')row_num+;

8、/elseletter_num+;charac=fgetc(file_pointer);i+;if(feof(file_pointer)buffa+i='0';voidreadChar()/C=buffpointer;if(pointer=1023)/f川Buffer(1024);/pointer+;/elseif(pointer=2047)/fillBuffer(0);/pointer=0;/elsepointer+;voidignoreSpace()/if(C=''|C='n'|C='t')C=buffpointer;if(p

9、ointer=1023)/f川Buffer(1024);/pointer+;/elseif(pointer=2047)/fillBuffer(0);/pointer=0;/elsepointer+;ignoreSpace();voidlink()/tokenj+=C;boolalphabet()/if(C>=97&&C<=122)|(C>=65&&C<=90)returntrue;elsereturnfalse;;booldigit()/if(C>=48&&C<=57)returntrue;elsereturn

10、false;intsearchForKeywords()/for(intx=0;x<32;x+)if(strcmp(token,keywordsx)=0)return0;/return1;intsearchForToken()/inti=0;while(i<=c-1)if(strcmp(token,token_listi)=0)appear=i;return0;/i+;word_num+;return1;intsearchForNum()/inti=0;while(i<=d-1)if(strcmp(token,numberi)=0)num_location=i;return0

11、;/i+;word_num+;return1;;voidinsertTokenList()/strcpy(token_listc+,token);;voidinsertNumList()/strcpy(numberd+,token);main()printf("輸入源文件的路徑:n");scanf"%s",file_name);file_pointer=fopen(file_name,"r");if(file_pointer=NULL)printf("無法查找到文件,發(fā)生錯誤!n");/charac=fgetc(f

12、ile_pointer);fillBuffer(0);/while(C!=''0')readChar();/ignoreSpace();/switch(C)/case65:case66:case67:case68:case69:case70:case71:case72:case73:case74:case75:case76:case77:case78:case79:case80:case81:case82:case83:case84:case85:case86:case87:case88:case89:case90:case97:case98:case99:case10

13、0:case101:case102:case103:case104:case105:case106:case107:case108:case109:case110:case111:case112:case113:case114:case115:case116:case117:case118:case119:case120:case121:case122case'_':/?while(alphabet()|digit()|C='_')/link();/readChar();/tokenj='0'/j=0;/pointer-;/if(searchFo

14、rKeywords(尸1)/if(searchForToken(尸1)/insertTokenList();/printf("<ID,%d>n",c-1);elseprintf("<ID,%d>n",appea)/elseprintf("<%s,?>n",token);/break;case48:case49:case50:case51:case52:case53:case54:case55:case56:case57:num=(C-48);link();readChar();while(digit

15、()link();num=num*10+(C-48);/readChar();if(C='.')link();readChar();while(digit()link();num=num+(C-48)*pow(0.1,z+);/readChaR);tokenj='0'/j=0;/pointer-;if(searchForNum()=1)/insertNumList();/printf("<%f,%d>n",num,d-1);elseprintf("<%f,%d>n",num,num_location

16、);/break;case'+':readChar();if(C='=')printf("<+=,賦值運算符>n");elseif(C='+')printf("<+,自力口>n");elsepointer-;printf("<+,加號>n");break;case'-':readChar();if(C='-')printf("<-,自減”);elseif(C='=')printf(&quo

17、t;<-=,賦值運算符>n");elsepointer-;printf("<-,減號>n");break;case'*':printf("<*,乘號>n");break;case'/':readChar();if(C='*')readChar();next_charac=buffpointer;while(C!='*'&&next_charac!='/')readChar();next_charac=buffpoi

18、nter;readChar();printf("</*,多行注釋>n");elseif(C='/')readChar();while(C!='n').word.zl-printf("</,單行注釋>n");elsepointer-;printf("</,除號>n");break;case'%':printf("<%,取南莫>n");break;case'(':printf("<(,左小括號

19、>n");break;case')':printf("<),右小括號>n");break;case'':printf("<,左中括號>n");break;case'':printf("<,右中括號>n");break;case'':printf("<,-左大括號>n");break;case'':printf("<,右大括號>n");brea

20、k;case':':printf("<:,冒號>n");break;case'':printf("<,分號>n");break;case',':printf("<,逗號>n");break;case'.':printf("<.,句號>n");break;case'?':printf("<?,問號>n");break;case'"':

21、printf("<"",引號>n");break;case'#':printf("<#,井號>n");break;case'>':readChar();if(C='=')printf("<>=,大于等于>n");elsepointer-;.word.zl-printf("<>,大于>n");break;case'<':readChar();if(C='=

22、')printf("<<=,小于等于>n");elsepointer-;printf("<<,小于>n");break;case'=':readChar();if(C='=')printf("<=,判等>n");elsepointer-;printf("<=,賦值等>n");break;case'&':readChar();if(C='&')printf("<&&,且>n");elsepointer-;printf("<&,取地址符>n");break;case'l':readChar();if(C=T)printf("<|,或>n");elsepointer-;printf("<|,運算符>n");break;case&

溫馨提示

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

評論

0/150

提交評論