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

下載本文檔

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

文檔簡介

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

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

3、個字符,并把它放入變量C中,且向前掃描指針pointer指向下一個字符void ignoreSpace();/每次調(diào)用時,檢查C 中的字符是否為空字符,若是,則反復調(diào)用該過程,直到 C 進入一個非空字符為止void link();/把 C 中的字符與 token 中的字符串連接起來bool alphabet();/布爾函數(shù),判斷 C 中的字符是否為字母,若是則返回true ,否則返回 falsebool digit();/布爾函數(shù),判斷 C 中的字符是否為數(shù)字,若是則返回true ,否則返回 falseint searchForKeywords();/查關(guān)鍵字表,若此函數(shù)的返回值為0,則表示

4、token 中的字符串是標識符,否則為關(guān)鍵字int searchForToken();/查符號表,若此函數(shù)的返回值為0,則表示 token 中的字符串是新出現(xiàn)的,否則為已出現(xiàn)過的標識符int searchForNum(); / 查常數(shù)表,若此函數(shù)的返回值為0,則表示 token 中的數(shù)字是新出現(xiàn)的,否則為已出現(xiàn)的常數(shù)void insertTokenList();/將標識符插入符號表void insertNumList();/將數(shù)字插入常數(shù)表void fillBuffer(int a);/填充 buff 的半?yún)^(qū)函數(shù).2程序源代碼#include<stdio.h>#include<

5、;stdlib.h>#include<string.h>#include<math.h>int pointer=0; /int i=0, j =0, c=0, appear , d=0, num_location; /int row_num=0, letter_num=0, word_num=0;int z=1;char C =' ' /char token 30; /char buff 4095; /char token_list 200 30; /char number 200 10; /char next_charac, charac , f

6、ile_name 20;charkeywords 32 10= "auto", "break", "case" , "char", "const", "continue", "default", "do" , "double" , "else", "enum" , "extern", "float", "for", &

7、quot;goto", "if", "int", "long", "register", "return", "short", "signed", "sizeo", "fstatic", "struct", "switch", "typedef", "union", "unsigned" , "vo

8、id", "volatile", "while"double num ;FILE * file_pointer;void fillBuffer( int a) /i=0;while(!feof ( file_pointer)&& i <2048 ) /buff a+i = charac ;if(charac != ' ') /if(charac ='n')row_num+; /elseletter_num+;charac=fgetc( file_pointer);i+;.if(feof (

9、file_pointer)buff a+i = '0'void readChar() /C=buff pointer;if(pointer=1023) /fillBuffer( 1024); /pointer+; /elseif(pointer=2047) /fillBuffer( 0); /pointer=0; /elsepointer+;void ignoreSpace() /if(C=' '| C='n'| C='t')C=buff pointer;if(pointer=1023) /fillBuffer( 1024); /

10、pointer+; /elseif(pointer=2047) /fillBuffer( 0); /pointer=0; /elsepointer+;ignoreSpace();void link() /token j += C;bool alphabet() /.if(C>=97 && C <=122)|(C>=65 && C<=90)returntrue;elsereturnfalse;bool digit() /if(C>=48 && C <=57)returntrue;elsereturnfalse;i

11、nt searchForKeywords() /for(int x=0; x<32; x+)if(strcmp ( token , keywords x )= 0)return0;/return1 ;int searchForToken() /int i=0;while(i <=c - 1)if(strcmp ( token , token_list i )= 0)appear=i ;return0 ; /i +;word_num+;return1 ;int searchForNum() /int i=0;while(i <=d- 1)if(strcmp ( token ,

12、number i )= 0)num_location=i ;.return0 ; /i +;word_num+;return1 ;void insertTokenList() /strcpy( token_list c+, token );void insertNumList() /strcpy( number d+, token );main ()printf( " 輸入源文件的路徑:n");scanf( "%s", file_name);file_pointer=fopen ( file_name, "r" );if(file_p

13、ointer=NULL) printf( " 無法查找到文件,發(fā)生錯誤!n" ); /charac=fgetc( file_pointer);fillBuffer( 0); /while(C!= '0')readChar();/ignoreSpace();/switch(C)/case 65 :case 66 :case 67 :case 68 :case 69 :case 70 :case 71 :case 72 :case 73 :case 74 :case 75 :case 76 :case 77 :case 78 :case 79 :case 80

14、:case 81 :case82: case 83 : case 84 : case 85 : case 86 : case 87 : case 88 : case 89 : case 90 : case 97 : case 98: case 99: case 100 : case 101 : case 102: case 103 : case 104: case 105 : case 106 : case 107 : case 108 : case 109 : case 110 : case 111 : case 112 : case 113 : case 114 : case115: ca

15、se 116 : case 117 : case 118 : case 119 : case 120 : case 121 : case 122 : case'_' : / ?while(alphabet()|digit()|C='_') /link();/readChar(); /.token j = '0' /j=0; /pointer-;/if(searchForKeywords()= 1) /if(searchForToken ()= 1) /insertTokenList();/printf( "< ID, %d >

16、;n", c- 1);elseprintf( "< ID, %d >n", appear ); /elseprintf( "< %s,?>n", token ); /break;case 48 :case 49 :case 50 :case 51 :case 52 :case 53 :case 54 :case 55 :case 56 :case 57 :num=( C- 48);link();readChar();while(digit()link();num=num* 10+( C- 48); /readChar()

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

18、eak;case '+':readChar();if(C='=' )printf( "< +=,賦值運算符>n");elseif(C='+')printf( "< +,自加 >n" );elsepointer-;printf( "< +,加號 >n");break;case '-':readChar();if(C='-')printf( "< -,自減 >" );elseif(C='

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

20、#39;)readChar();next_charac=buff pointer;readChar();printf( "< /*,多行注釋>n");elseif(C='/').readChar();while(C!= 'n')readChar();printf( "< /,單行注釋 >n");elsepointer-;printf("< /,除號 >n");break;case '%':printf("<%,取模 >n"

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

22、reak;case'':printf("< ,右大括號 >n");break;case':':printf("< :,冒號 >n");break;case'':printf("< ;,分號 >n");break;case',':printf("< ,逗號 >n");break;case'.':printf("< .,句號 >n");break;case &#

23、39;?':printf("< ?,問號 >n");break;case'"':printf( "< "",引號 >n" );break;case '#':printf("< #,井號 >n");break;case '>':readChar();if(C='=')printf( "< >=,大于等于 >n");.elsepointer-;printf( "< >,大于 >n");break;case '<':readChar();if(C='=' )printf( "< <=,小于等于>n");elsepoint

溫馨提示

  • 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

提交評論