版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 我國上市公司并購效應(yīng)的多維度剖析與深度洞察
- 我國上市公司反收購法律規(guī)制:問題剖析與完善路徑
- 電離輻射計(jì)量員崗前創(chuàng)新方法考核試卷含答案
- 搪瓷制品制造工安全宣教模擬考核試卷含答案
- 甲殼類養(yǎng)殖工風(fēng)險(xiǎn)識(shí)別測(cè)試考核試卷含答案
- 碘缺乏病護(hù)理評(píng)估技巧分享
- 膠印版材生產(chǎn)工安全宣貫考核試卷含答案
- 2025中國太平洋財(cái)產(chǎn)保險(xiǎn)股份有限公司定西中心支公司招聘備考題庫(甘肅)及一套答案詳解
- 2026年上半年黑龍江事業(yè)單位聯(lián)考雞西市招聘409人備考題庫及1套完整答案詳解
- 老年病科診療成本風(fēng)險(xiǎn)預(yù)警模型
- 物業(yè)與商戶裝修協(xié)議書
- 2025年五上課外閱讀題庫及答案
- 湖南鐵道職業(yè)技術(shù)學(xué)院2025年單招職業(yè)技能測(cè)試題
- GB/T 46318-2025塑料酚醛樹脂分類和試驗(yàn)方法
- 果農(nóng)水果出售合同范本
- 小學(xué)三年級(jí)數(shù)學(xué)選擇題專項(xiàng)測(cè)試100題帶答案
- 2025年尿液分析儀行業(yè)分析報(bào)告及未來發(fā)展趨勢(shì)預(yù)測(cè)
- 2026屆湖北省宜昌市秭歸縣物理八年級(jí)第一學(xué)期期末質(zhì)量跟蹤監(jiān)視試題含解析
- 2025年事業(yè)單位聯(lián)考A類職測(cè)真題及答案
- 無人機(jī)系統(tǒng)安全培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論