編譯原理實(shí)驗(yàn)詞法分析實(shí)驗(yàn)報(bào)告_第1頁
編譯原理實(shí)驗(yàn)詞法分析實(shí)驗(yàn)報(bào)告_第2頁
編譯原理實(shí)驗(yàn)詞法分析實(shí)驗(yàn)報(bào)告_第3頁
編譯原理實(shí)驗(yàn)詞法分析實(shí)驗(yàn)報(bào)告_第4頁
編譯原理實(shí)驗(yàn)詞法分析實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

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

文檔簡介

本文格式為Word版,下載可任意編輯——編譯原理實(shí)驗(yàn)詞法分析實(shí)驗(yàn)報(bào)告編譯技術(shù)試驗(yàn)報(bào)告

試驗(yàn)題目:

詞詞法分析

學(xué)學(xué)

院:

信息學(xué)院

專專

業(yè):

計(jì)算機(jī)科學(xué)與技術(shù)

學(xué)學(xué)

號(hào):

姓姓

名:

一、試驗(yàn)?zāi)康?/p>

(1)理解詞法分析的功能;

(2)理解詞法分析的實(shí)現(xiàn)方法;

二、試驗(yàn)內(nèi)容

PL0的文法如下

?為非終結(jié)符。

::=?該符號(hào)的左部由右部定義,可讀作"定義為'。

|?表示或?,為左部可由多個(gè)右部定義。

{}?表示花括號(hào)內(nèi)的語法成分可以重復(fù)。在不加上下界時(shí)可重復(fù)0到任意次數(shù),有上下界時(shí)可重復(fù)次數(shù)的限制。

[]?表示方括號(hào)內(nèi)的成分為任選項(xiàng)。

()?表示圓括號(hào)內(nèi)的成分優(yōu)先。

上述符號(hào)為"元符號(hào)',文法用上述符號(hào)作為文法符號(hào)時(shí)需要用引號(hào)?括起。

〈程序〉∷=〈分程序〉.

〈分程序〉∷=[〈變量說明部分〉][〈過程說明部分〉]〈語句〉

〈變量說明部分〉∷=VAR〈標(biāo)識(shí)符〉{,〈標(biāo)識(shí)符〉}:INTEGER;

〈無符號(hào)整數(shù)〉∷=〈數(shù)字〉{〈數(shù)字〉}

〈標(biāo)識(shí)符〉∷=〈字母〉{〈字母〉|〈數(shù)字〉}

〈過程說明部分〉∷=〈過程首部〉〈分程序〉{;〈過程說明部分〉};

〈過程首部〉∷=PROCEDURE〈標(biāo)識(shí)符〉;

〈語句〉∷=〈賦值語句〉|〈條件語句〉|〈過程調(diào)用語句〉|〈讀語句〉|〈寫語句〉|〈復(fù)合語句〉|〈空〉

〈賦值語句〉∷=〈標(biāo)識(shí)符〉∶=〈表達(dá)式〉

〈復(fù)合語句〉∷=BEGIN〈語句〉{;〈語句〉}END

〈條件〉∷=〈表達(dá)式〉〈關(guān)系運(yùn)算符〉〈表達(dá)式〉

〈表達(dá)式〉∷=〈項(xiàng)〉{〈加法運(yùn)算符〉〈項(xiàng)〉}

〈項(xiàng)〉∷=〈因子〉{〈乘法運(yùn)算符〉〈因子〉}

〈因子〉∷=〈標(biāo)識(shí)符〉|〈無符號(hào)整數(shù)〉|"("〈表達(dá)式〉")"

〈加法運(yùn)算符〉∷=+|-

〈乘法運(yùn)算符〉∷=*

〈關(guān)系運(yùn)算符〉∷=|=||=||=

〈條件語句〉∷=IF〈條件〉THEN〈語句〉

〈字母〉∷=a|b||X|Y|Z

〈數(shù)字〉∷=0|1|2||8|9

現(xiàn)實(shí)現(xiàn)PL0的的詞法分析

三、試驗(yàn)分析與設(shè)計(jì)

PL0詞法分析程序是一個(gè)獨(dú)立的過程,其功能是為語法語義分析提供單詞,把輸入的字符串形式的源程序分割成一個(gè)個(gè)單詞符號(hào)傳遞給語

法語義分析。

其主要方法步驟為從源程序掃描下一個(gè)字符,忽視空格、換行、TAB和解釋并識(shí)別單詞,再將不同類別的單詞歸類輸出。

四、試驗(yàn)的實(shí)現(xiàn)

#includestdio.h

#includestdlib.h

#includestring.h

#includectype.h

#includestdbool.h

#definenorw11

//norw-1個(gè)關(guān)鍵字

#defineal20

//最長的關(guān)鍵字的長度

#defineIDnorw

#defineINTnorw+1

#defineCOMMAnorw+2

#defineENDFnorw+3

#defineCOLONnorw+4

#defineSEMICnorw+5

#defineADDnorw+6

#defineMINUSnorw+7

#defineMULTInorw+8

#defineEVALUnorw+9

#defineLEnorw+10

#defineNEnorw+11

#defineLTnorw+12

#defineEQnorw+13

#defineGEnorw+14

#defineGTnorw+15

#defineFLOATnorw+16

charTOKEN[20];

//字符數(shù)組用來依次存放單詞詞文的各個(gè)字符

externintlookup(char*);

//以TOKEN字符串查保存字表

externvoidreport_error(char);

//報(bào)告程序中的詞法錯(cuò)誤

boolisalpha(char);

//判斷接收字符是否為字母

boolisalnum(char);

//判斷接收字符是否為字母或者數(shù)字

boolisdigit(char);

//判斷接收字符是否為數(shù)字

boolisannotation(char);

//判斷接收字符是否為解釋

externcharletter(charc);//用來將大寫字母轉(zhuǎn)化成小寫字母

FILE*fin;

FILE*fout;

voidscanner()

{//詞法分析的主體程序,對(duì)輸入的文本文件進(jìn)行詞法分析

charch;

inti,c;

interror=0;

//記錄文件中詞法錯(cuò)誤的個(gè)數(shù)

ch=fgetc(fin);

//從輸入文件中讀取一個(gè)字符

while(ch!=EOF)

{//當(dāng)從輸入文件接收的字符不是文件終止符時(shí),執(zhí)行循環(huán)

if(isalpha(ch))

{//假如從輸入文件接收的第一個(gè)字符是字母

ch=letter(ch);

TOKEN[0]=ch;

ch=fgetc(fin);i=1;

while(isalnum(ch))

{

ch=letter(ch);

TOKEN[i]=ch;i++;

ch=fgetc(fin);

}

TOKEN[i]="\0";

c=lookup(TOKEN);

//查保存字表

if(c==0){fprintf(fout,(%d,%s)\n,ID,TOKEN);}//輸出標(biāo)識(shí)符

elsefprintf(fout,(%d,%s)\n,c,TOKEN);

//輸出接收單詞為保存字

}

if(isdigit(ch))

//假如從輸入文件接收的第一個(gè)字符是數(shù)字

{

intcdot=0;

//統(tǒng)計(jì)小數(shù)點(diǎn)個(gè)數(shù)

TOKEN[0]=ch;

ch=fgetc(fin);i=1;

while(isdigit(ch)||ch==".")

{//從其次個(gè)接收字符開始,當(dāng)是數(shù)字或者是小數(shù)點(diǎn)時(shí),執(zhí)行循環(huán)

if(ch==".")

cdot++;

TOKEN[i]=ch;i++;

ch=fgetc(fin);//重復(fù)接收字符,直到接收到非數(shù)字

if(cdot=2)

{

error++;

TOKEN[i]="\0";

printf(%siserror\n,TOKEN);

break;

}

}

if(isalpha(ch))//假如其次個(gè)字符是字母

{

while(isalpha(ch))//接收完所有的字母,跳出循環(huán)

{

TOKEN[i]=ch;i++;

ch=fgetc(fin);

}

TOKEN[i]="\0";

error++;

printf(%siserror\n,TOKEN);

}

elseif(cdot==0)

//當(dāng)接收的字符為整型單詞時(shí)

{

fseek(fin,-1,1);

TOKEN[i]="\0";

inta,temp=0,c;

for(c=0;ci;c++)

{

a=TOKEN[c]-"0";

if(c!=0)

{

temp=temp*10;

temp=temp+a;

}

else

{

temp=a;

}

}

fprintf(fout,(%d,%d)\n,INT,temp);

//輸出接收單詞為整數(shù)

}

elseif(cdot==1)

{

fseek(fin,-1,1);

TOKEN[i]="\0";

inta,part1=0,jc,b=0;

//b用來確定小數(shù)點(diǎn)所在的位置

floatc=0.1,part2=0.0;

while(TOKEN[b]!=".")

{

b=b+1;

}

for(jc=0;jcb;jc++)

{

a=TOKEN[jc]-"0";

if(jc!=0)

{

part1=part1*10;

part1=part1+a;

}

else

{

part1=a;

}

}

for(jc=b+1;jci;jc++)

{

a=TOKEN[jc]-"0";

part2=a*c+part2;

c=c*0.1;

}

fprintf(fout,(%d,%f)\n,FLOAT,part1+part2);

//輸出接收單詞為小數(shù)

}elseif(cdot==2)

{

fseek(fin,-1,1);

}

}

else

//假如從輸入文件接收的第一個(gè)字符既不是字母又不是數(shù)字

switch(ch)

{//將所接收到的符號(hào)字符進(jìn)行分類,采取一符一類

case":":ch=fgetc(fin);

if(ch=="=")fprintf(fout,(%d,:=)\n,EVALU);

//輸出接收符號(hào)為賦值號(hào)

else

{ch=fgetc(fin);

fseek(fin,-1,1);

//文件接收字符回推一個(gè)字符

fprintf(fout,(%d,":")\n,COLON);

//輸出冒號(hào)

}

break;

case",":fprintf(fout,(%d,",")\n,COMMA);break;

//輸出逗號(hào)

case".":fprintf(fout,(%d,".")\n,ENDF);break;

//輸出句號(hào)

case";":fprintf(fout,(%d,".")\n,SEMIC);break;

//輸出分號(hào)

case"+":fprintf(fout,(%d,"+")\n,ADD);break;

//輸出加號(hào)

case"-":fprintf(fout,(%d,"-")\n,MINUS);break;

//輸出減號(hào)

case"*":fprintf(fout,(%d,"*")\n,MULTI);break;

//輸出乘號(hào)

case"":ch=fgetc(fin);

if(ch=="=")fprintf(fout,(%d,"=")\n,LE);

//輸出小于或等于號(hào)

elseif(ch=="")fprintf(fout,(%d,"")\n,NE);

//輸出不等于號(hào)

else

{

fseek(fin,-1,1);

fprintf(fout,(%d,"")\n,LT);;

//輸出小于號(hào)

}

break;

case"=":fprintf(fout,(%d,"=")\n,EQ);break;

//輸出等于號(hào)

case"":ch=fgetc(fin);

if(ch=="=")fprintf(fout,(%d,"=")\n,GE);

//輸出大于或等于號(hào)

else

{

fseek(fin,-1,1);

fprintf(fout,(%d,"")\n,GT);

//輸出大于號(hào)

}

break;

case"":break;

case"\n":break;

case"\t":break;

case"/":ch=fgetc(fin);//檢查是否為單行解釋

if(ch=="/"){

while(ch!="\n"){

ch=fgetc(fin);

}

}

else{

fseek(fin,-1,1);

printf(/iserror\n);

error++;

}

break;

case"{":

while(1){

ch=fgetc(fin);

if(ch=="}")break;

if(ch==EOF)

{

fseek(fin,-1,1);

printf({

iserror\n);

error++;

break;

}

}

break;

default:printf(%ciserror\n,ch);

//接收非上述字符程序報(bào)告詞法錯(cuò)誤

error++;break;

}

ch=fgetc(fin);

//繼續(xù)從文件中讀取下一個(gè)單詞,直到文件終止

}//while循環(huán)終止

printf(共發(fā)現(xiàn)%d個(gè)詞法錯(cuò)誤!,error);

return;

}

intlookup(char*token)

{

intj;

charword[norw][al];

strcpy((word[1][0]),begin);

strcpy((word[2][0]),end);

strcpy((word[3][0]),var);

strcpy((word[4][0]),integer);

strcpy((word[5][0]),while);

strcpy((word[6][0]),do);

strcpy((word[7][0]),if);

strcpy((word[8][0]),then);

strcpy((word[9][0]),procedure);

strcpy((word[10][0]),else);

for(j=1;j=norw-1;j++)if(strcmp(token,word[j])==0)returnj;

//以TOKEN字符串查保存字表,若查到返回保存字類別碼

return0;

//TOKEN不是保存字,返回0

}

boolisalpha(charc)

{//判斷接收字符是否為字母

if((c="a"c="z")||(c="A"c="Z"))return1;

elsereturn0;

}

boolisalnum(charc)

{//判斷接收字符是否為字母或者數(shù)字

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論