版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年親子園所特許經(jīng)營協(xié)議
- 二零二五版環(huán)保管家技術(shù)服務(wù)合同樣本:企業(yè)環(huán)保審計服務(wù)3篇
- 2025年度臨床試驗知識產(chǎn)權(quán)合同主體權(quán)益保護措施4篇
- 二零二五年度退休人員勞動解除合同及退休金領(lǐng)取及后續(xù)保障合同
- 2025年度臨時工崗位臨時性加班合同
- 2025年度電影演員演出合同書:科幻災(zāi)難片主演合約
- 2025年度門窗安裝與智能化系統(tǒng)集成合同4篇
- 2025年度城市綜合體門頭租賃管理服務(wù)協(xié)議
- 二零二五年度C型鋼智能化生產(chǎn)系統(tǒng)建設(shè)合同3篇
- 二零二五年度鋰電池回收利用項目投資合作協(xié)議
- 二年級數(shù)學(xué)上冊100道口算題大全 (每日一套共26套)
- 物流無人機垂直起降場選址與建設(shè)規(guī)范
- 肺炎臨床路徑
- 外科手術(shù)鋪巾順序
- 創(chuàng)新者的窘境讀書課件
- 如何克服高中生的社交恐懼癥
- 聚焦任務(wù)的學(xué)習(xí)設(shè)計作業(yè)改革新視角
- 移動商務(wù)內(nèi)容運營(吳洪貴)任務(wù)三 APP的品牌建立與價值提供
- 電子競技范文10篇
- 食堂服務(wù)質(zhì)量控制方案與保障措施
- VI設(shè)計輔助圖形設(shè)計(2022版)
評論
0/150
提交評論