版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上一. 實(shí)驗(yàn)?zāi)康? 深入理解有限自動(dòng)機(jī)及其應(yīng)用2 掌握根據(jù)語(yǔ)言的詞法規(guī)則構(gòu)造識(shí)別其單詞的有限自動(dòng)機(jī)的方法3基本掌握詞法分析程序的開(kāi)發(fā)。二. 實(shí)驗(yàn)內(nèi)容及要求1、 詞法分析器的功能和輸出格式詞法分析器的功能是輸入源程序,輸出單詞符號(hào)。詞法分析器的單詞符號(hào)常常表示成以下的二元式(單詞種別碼,單詞符號(hào)的屬性值)。本實(shí)驗(yàn)中,采用的是一類(lèi)符號(hào)一種別碼的方式。2、 單詞的BNF表示<標(biāo)識(shí)符>-> <字母><字母數(shù)字串><字母數(shù)字串>-><字母><字母數(shù)字串>|<數(shù)字><字母數(shù)字串&g
2、t;|<下劃線><字母數(shù)字串>|<無(wú)符號(hào)整數(shù)>-> <數(shù)字><數(shù)字串><數(shù)字串>-> <數(shù)字><數(shù)字串> |<加法運(yùn)算符>-> +<減法運(yùn)算符>-> -<大于關(guān)系運(yùn)算符>-> ><大于等于關(guān)系運(yùn)算符>-> >=3、“超前搜索”方法詞法分析時(shí),常常會(huì)用到超前搜索方法。如當(dāng)前待分析字符串為“a>+”,當(dāng)前字符為>,此時(shí),分析器倒底是將其分析為大于關(guān)系運(yùn)算符還是大于等于關(guān)系運(yùn)算符呢?顯然,只有知道下
3、一個(gè)字符是什么才能下結(jié)論。于是分析器讀入下一個(gè)字符+,這時(shí)可知應(yīng)將>解釋為大于運(yùn)算符。但此時(shí),超前讀了一個(gè)字符+,所以要回退一個(gè)字符,詞法分析器才能正常運(yùn)行。在分析標(biāo)識(shí)符,無(wú)符號(hào)整數(shù)等時(shí)也有類(lèi)似情況。4、模塊結(jié)構(gòu)緩沖區(qū)掃描一個(gè)字符主函數(shù)main()N輸入文件名,判斷能否打開(kāi)文件Y緩沖區(qū)中是否還有字符Y結(jié)束取單詞掃描一個(gè)字符調(diào)用返回輸出N5.程序思路 這里以開(kāi)始定義的C語(yǔ)言子集的源程序作為詞法分析程序的輸入數(shù)據(jù)。在詞法分析中,自文件頭開(kāi)始掃描源程序字符,一旦發(fā)現(xiàn)符合“單詞”定義的源程序字符串時(shí),將它翻譯成固定長(zhǎng)度的單詞內(nèi)部表示,并查填適當(dāng)?shù)男畔⒈?。?jīng)過(guò)詞法分析后,源程序字符串(源程序的外部
4、表示)被翻譯成具有等長(zhǎng)信息的單詞串(源程序的內(nèi)部表示),并產(chǎn)生兩個(gè)表格:常數(shù)表和標(biāo)識(shí)符表,它們分別包含了源程序中的所有常數(shù)和所有標(biāo)識(shí)符。0.定義部分:定義常量、變量、數(shù)據(jù)結(jié)構(gòu)。1.初始化:從文件將源程序全部輸入到字符緩沖區(qū)中。2.取單詞前:去掉多余空白。3.取單詞后:去掉多余空白(可選,看著辦)。4.取單詞:利用實(shí)驗(yàn)一的成果讀出單詞的每一個(gè)字符,組成單詞,分析類(lèi)型。(關(guān)鍵是如何判斷取單詞結(jié)束?取到的單詞是什么類(lèi)型的單詞?)5.顯示結(jié)果。6.實(shí)驗(yàn)程序的源代碼如下:#include <stdio.h>#include <ctype.h>#include <malloc
5、.h>#include <stdlib.h>#include <string.h>#define NULL 0FILE *fp;char cbuffer;char *key8="if","else","for","while","do","return","break","continue"char *border6=",","","","
6、;","(",")"char *arithmetic4="+","-","*","/"char *relation6="<","<=","=",">",">=","<>"char *consts20="0","1","2","3",&
7、quot;4","5","6","7","8","9"char *label20;int constnum=0,labelnum=0;int search(char searchchar,int wordtype) int i=0; switch (wordtype) case 1:for (i=0;i<=7;i+) if (strcmp(keyi,searchchar)=0) return(i+1); break; case 2:for (i=0;i<=5;i+) if
8、(strcmp(borderi,searchchar)=0) return(i+1); return(0); break; case 3:for (i=0;i<=3;i+) if (strcmp(arithmetici,searchchar)=0) return(i+1); return(0); break; case 4:for (i=0;i<=5;i+) if (strcmp(relationi,searchchar)=0) return(i+1); return(0); break; case 5: for (i=0;i<=constnum;i+) if (strcmp
9、(constsi,searchchar)=0) return(i+1); break; case 6:for (i=0;i<=labelnum;i+) if (strcmp(labeli,searchchar)=0) return(i+1); labeli-1=(char *)malloc(sizeof(searchchar); strcpy(labeli-1,searchchar); labelnum+; return(i); break; char alphaprocess(char buffer) int atype; int i=-1; char alphatp20; while
10、 (isalpha(buffer)|(isdigit(buffer) alphatp+i=buffer; buffer=fgetc(fp); alphatpi+1='0' if (atype=search(alphatp,1) printf("%s t(1,%d)n",alphatp,atype-1);/結(jié)束 else atype=search(alphatp,6); printf("%s t(6,%d)n",alphatp,atype-1); return(buffer);char digitprocess(char buffer) i
11、nt i=-1; char digittp20; int dtype; while (isdigit(buffer) digittp+i=buffer; buffer=fgetc(fp); digittpi+1='0' dtype=search(digittp,5); printf("%s t(5,%d)n",digittp,dtype-1); return(buffer);char otherprocess(char buffer) int i=-1; char othertp20; int otype,otypetp; othertp0=buffer;
12、othertp1='0' if (otype=search(othertp,3) printf("%s t(3,%d)n",othertp,otype-1); buffer=fgetc(fp); goto out; if (otype=search(othertp,4) buffer=fgetc(fp); othertp1=buffer; othertp2='0' if (otypetp=search(othertp,4) printf("%s t(4,%d)n",othertp,otypetp-1); goto out;
13、 else othertp1='0' printf("%s t(4,%d)n",othertp,otype-1); goto out; if (buffer=':') buffer=fgetc(fp); if (buffer='=') printf(":= (2,2)n"); buffer=fgetc(fp); goto out; else if (otype=search(othertp,2) printf("%s t(2,%d)n",othertp,otype-1); buffer=
14、fgetc(fp); goto out; if (buffer!='n')&&(buffer!=' ') printf("%c error,not a wordn",buffer); buffer=fgetc(fp);out: return(buffer);void main() int i; for (i=0;i<=20;i+) labeli=NULL; ; if (fp=fopen("example.txt","r")=NULL) printf("error"); elsecbuffer = fgetc(fp);while (cbuffer!=EOF) if (isalpha(cbuffer) cbuffer=alphaprocess(cbuffer); else if (isdigit(cbuffer) cbuffer=digitprocess(cbuffer); else cbuffer=otherprocess
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度地鐵項(xiàng)目合同終止協(xié)議
- 二零二五年度學(xué)校食堂承包與食品安全教育合同
- 二零二五年度展覽館裝修合同終止及展覽內(nèi)容調(diào)整協(xié)議
- 三方月嫂保姆家政服務(wù)合同(2024版)
- 二零二五版木材加工設(shè)備租賃合同范本8篇
- 2024網(wǎng)絡(luò)安全技術(shù)保障服務(wù)合同
- 2025版高端美縫施工合同書(shū)4篇
- 個(gè)人經(jīng)營(yíng)性用房租賃合同:2024版樣本版B版
- 二零二五版路燈廣告合作項(xiàng)目實(shí)施及維護(hù)管理協(xié)議4篇
- 2025年環(huán)保建筑材料代理銷(xiāo)售合同范本3篇
- 2024年高考八省聯(lián)考地理適應(yīng)性試卷附答案解析
- 足浴技師與店內(nèi)禁止黃賭毒協(xié)議書(shū)范文
- 中國(guó)高血壓防治指南(2024年修訂版)要點(diǎn)解讀
- 2024-2030年中國(guó)光電干擾一體設(shè)備行業(yè)發(fā)展現(xiàn)狀與前景預(yù)測(cè)分析研究報(bào)告
- 湖南省岳陽(yáng)市岳陽(yáng)樓區(qū)2023-2024學(xué)年七年級(jí)下學(xué)期期末數(shù)學(xué)試題(解析版)
- 農(nóng)村自建房安全合同協(xié)議書(shū)
- 杜仲葉藥理作用及臨床應(yīng)用研究進(jìn)展
- 4S店售后服務(wù)6S管理新規(guī)制度
- 高性能建筑鋼材的研發(fā)與應(yīng)用
- 無(wú)線廣播行業(yè)現(xiàn)狀分析
- 漢語(yǔ)言溝通發(fā)展量表(長(zhǎng)表)-詞匯及手勢(shì)(8-16月齡)
評(píng)論
0/150
提交評(píng)論