編譯原理詞法分析源代碼_第1頁(yè)
編譯原理詞法分析源代碼_第2頁(yè)
編譯原理詞法分析源代碼_第3頁(yè)
編譯原理詞法分析源代碼_第4頁(yè)
編譯原理詞法分析源代碼_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論