




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
實(shí)驗(yàn)1-3《編譯原理》S語言詞法分析程序設(shè)計(jì)方案一、實(shí)驗(yàn)?zāi)康牧私庠~法分析程序的兩種設(shè)計(jì)方法之一:根據(jù)狀態(tài)轉(zhuǎn)換圖直接編程的方式;二、實(shí)驗(yàn)內(nèi)容 1.根據(jù)狀態(tài)轉(zhuǎn)換圖直接編程編寫一個(gè)詞法分析程序,它從左到右逐個(gè)字符的對(duì)源程序進(jìn)行掃描,產(chǎn)生一個(gè)個(gè)的單詞的二元式,形成二元式(記號(hào))流文件輸出。在此,詞法分析程序作為單獨(dú)的一遍,如下圖所示。具體任務(wù)有:(1)組織源程序的輸入(2)拼出單詞并查找其類別編號(hào),形成二元式輸出,得到單詞流文件(3)刪除注釋、空格和無用符號(hào)(4)發(fā)現(xiàn)并定位詞法錯(cuò)誤,需要輸出錯(cuò)誤的位置在源程序中的第幾行。將錯(cuò)誤信息輸出到屏幕上。(5)對(duì)于普通標(biāo)識(shí)符和常量,分別建立標(biāo)識(shí)符表和常量表(使用線性表存儲(chǔ)),當(dāng)遇到一個(gè)標(biāo)識(shí)符或常量時(shí),查找標(biāo)識(shí)符表或常量表,若存在,則返回位置,否則返回0并且填寫符號(hào)表或常量表。標(biāo)識(shí)符表結(jié)構(gòu):變量名,類型(整型、實(shí)型、字符型),分配的數(shù)據(jù)區(qū)地址注:詞法分析階段只填寫變量名,其它部分在語法分析、語義分析、代碼生成等階段逐步填入。常量表結(jié)構(gòu):常量名,常量值三、實(shí)驗(yàn)要求1.能對(duì)任何S語言源程序進(jìn)行分析 在運(yùn)行詞法分析程序時(shí),應(yīng)該用問答形式輸入要被分析的S源語言程序的文件名,然后對(duì)該程序完成詞法分析任務(wù)。2.能檢查并處理某些詞法分析錯(cuò)誤詞法分析程序能給出的錯(cuò)誤信息包括:總的出錯(cuò)個(gè)數(shù),每個(gè)錯(cuò)誤所在的行號(hào),錯(cuò)誤的編號(hào)及錯(cuò)誤信息。 本實(shí)驗(yàn)要求處理以下兩種錯(cuò)誤(編號(hào)分別為1,2): 1:非法字符:單詞表中不存在的字符處理為非法字符,處理方式是刪除該字符,給出錯(cuò)誤信息,“某某字符非法”。 2:源程序文件結(jié)束而注釋未結(jié)束。注釋格式為:/*……*/四、保留字和特殊符號(hào)表單詞代碼123456789單詞intcharfloatvoidconstforifelsethen單詞助記符intcharfloatvoidconstforifelsethen內(nèi)碼值單詞代碼101112131415161718單詞whileswitchbreakbeginend標(biāo)識(shí)符數(shù)字(包括整數(shù)和實(shí)數(shù))單詞助記符whileswitchbreakbeginendidnum內(nèi)碼值在符號(hào)表中的位置在常數(shù)表中的位置單詞代碼192021222324252627單詞+-*/%()[]單詞助記符+-*/%()[]內(nèi)碼值單詞代碼28282930單詞!=<><=>===;{}單詞助記符rlop;{}內(nèi)碼值!=<><=>===--單詞代碼373839404142434445單詞/=+=-=*=%=||&&!=單詞助記符/=+=-=*=%=orandnot=內(nèi)碼值單詞的構(gòu)詞規(guī)則:字母=[A-Za-z]數(shù)字=[0-9]標(biāo)識(shí)符=(字母|_)(字母|數(shù)字)*數(shù)字=數(shù)字(數(shù)字)*(.數(shù)字+|)四、S語言表達(dá)式和語句說明 1.算術(shù)表達(dá)式:+、-、*、/、% 2.關(guān)系運(yùn)算符:>、>=、<、<=、==、!= 3.賦值運(yùn)算符:=,+=、-=、*=、/=、%= 4.變量說明:類型標(biāo)識(shí)符變量名表; 5.類型標(biāo)識(shí)符:intcharfloat 6.If語句:if表達(dá)式then語句[else語句] 7.For語句:for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句 8.While語句:while表達(dá)式do語句 9.S語言程序:由函數(shù)構(gòu)成,函數(shù)不能嵌套定義。函數(shù)格式為:返回值函數(shù)名(參數(shù)){數(shù)據(jù)說明Key_wordKey[MAXSIZE]={{"int","int","-"},{"char","char","-"},{"float","float","-"}, {"void","void","-"},{"const","const","-"},{"for","for","-"}, {"if","if","-"},{"else","else","-"},{"then","then","-"}, {"while","while","-"},{"switch","switch","-"},{"break","break","-"}, {"begin","begin","-"},{"end","end","-"},{"","",""}, {"","",""},{"","id",""},{"","num",""}, {"+","+","-"},{"-","-","-"},{"*","*","-"}, {"/","/","-"},{"%","%","-"},{"(","(","-"}, {")",")","-"},{"[","[","-"},{"]","]","-"}, {"","",""},{"<","rlop","<"},{">","rlop",">"}, {"<=","rlop","<="},{">=","rlop",">="},{"=","rlop","="}, {"!=","rlop","!="},{";",";","-"},{"","",""}, {"/=","/=","-"},{"+=","+=","-"},{"-=","-=","-"}, {"*=","*=","-"},{"%=","%=","-"},{"||","or","-"}, {"&&","and","-"},{"!","not","-"},{"=","=","-"}};//打開關(guān)閉文件intInitscanner(){ printf("請(qǐng)輸入要輸入的文件:\n"); scanf("%s",infile); if((in=fopen(infile,"r"))==NULL) { printf("cannotopeninfile!\n"); return0; } if((out=fopen("word.txt","a+"))==NULL) { printf("cannotopenoutfile!\n"); return0; } return0;}//寫入文件voidOutput(intn,intm){ fputs("(",out); fputs(Key[n].keySign,out); fputs(",",out); if(m==-1) fputs(Key[n].keyValue,out); else fputs(lownum[m],out);//下標(biāo) fputs(")",out);}//Isalpha函數(shù):識(shí)別保留字和標(biāo)識(shí)符intIsalpha(){ inti; for(i=0;i<16;i++)//關(guān)鍵字 { if(strcmp(token,Key[i].keyWord)==0) { Output(i,-1); return0; } } //標(biāo)識(shí)符Word[NUM][MAX] for(i=0;i<NUM;i++) { if((Word[i][0]!=NULL)&&strcmp(token,Word[i])==0) { Output(16,i); return0; } if(Word[i][0]==NULL) { strcpy(Word[i],token); Output(16,i); return0; } } return0;}intIsnumber()//Isnumber函數(shù):consts[NUM][MAX]{ inti; for(i=0;i<NUM;i++) { if((consts[i][0]!=NULL)&&strcmp(token,consts[i])==0) { Output(17,i); return0; } if(consts[i][0]==NULL) { strcpy(consts[i],token); Output(17,i); return0; } } return0;}voidremove()//掃描指針回退一個(gè)字符{fseek(in,-1,SEEK_CUR);}//Isanotation函數(shù):處理除號(hào)/和注釋voidIsanotation()//提示第一個(gè)字符已經(jīng)存為/了{(lán) charch,pre; ch=getc(in); if(ch=='=')//"/=" Output(36,-1); elseif(ch=='*')//"/*" { ch=getc(in); do{ if(feof(in)) { num++; printf("\n第(%d)行:注釋錯(cuò)誤:/*后面的字符全部當(dāng)做注釋,缺少結(jié)束注釋*/\n",n); break; } pre=ch; ch=getc(in); }while(pre!='*'||ch!='/'); } else//"/" { remove();//指針回退一個(gè)字符 Output(21,-1); }}//Isother函數(shù)識(shí)別其他特殊字符voidIsother(){ inti=1;intj=0; charch; if(token[0]=='<'||token[0]=='>'||token[0]=='!'||token[0]=='%'){ ch=getc(in); if(ch=='=') token[i++]=ch; elseremove(); }else if(token[0]=='|') { ch=getc(in); if(ch=='|') token[i++]=ch; else remove(); }else if(token[0]=='&') { ch=getc(in); if(ch=='&') token[i++]=ch; else remove(); } token[i]='\0'; for(i=18;i<45;i++) { if(strcmp(token,Key[i].keyWord)==0) { Output(i,-1); break; } } if(i==45) { num++; printf("\n第(%d)行:字符錯(cuò)誤:%s字符非法\n",n,token); }}voidScanner(){ charch; inti; ch=getc(in); while(!feof(in)) { while(ch==''||ch=='\t'||ch=='\n')//先統(tǒng)計(jì)行數(shù) { if(ch=='\n') ++n; ch=getc(in); } if(((ch>='a')&&(ch<='z'))||(ch=='_'))//標(biāo)識(shí)符isalpha(ch)單詞 { i=1; token[0]=ch; ch=getc(in); while(((ch>='a')&&(ch<='z'))||((ch>='0')&&(ch<='9')))//wordnumber { token[i++]=ch; ch=getc(in); } token[i]='\0'; Isalpha(); } elseif((ch>='0')&&(ch<='9'))//整數(shù) { i=1; token[0]=ch; ch=getc(in); while(isdigit(ch)) { token[i++]=ch; ch=getc(in); } token[i]='\0'; Isnumber(); } elseif(ch=='/')//區(qū)分"/","/=","/*" { token[0]=ch; Isanotation(); ch=getc(in); } else//特殊字符 { token[0]=ch;Isother(); ch=getc(in); } }}voidshow(){ inti; charch; printf("\n二元式:\n"); rewind(out); while(!feof(out)) { printf("%c",getc(out)); } printf("\n標(biāo)志符表\n"); for(i=0;i<NUM;i++) { if(Word[i][0]!=NULL) printf("%d,%s\n",i,Word[i]); } printf("\n常數(shù)表\n"); for(i=0;i<NUM;i++) { if(consts[i][0]!=NULL) printf("%d,%s\n",i,consts[i]); }}voidmain(){ Initscanner(); Scanner(); printf("\n共有%d個(gè)錯(cuò)誤\n",num); show(); fclose(in); fclose(out);}九、實(shí)驗(yàn)結(jié)果輸入文件voidaa()beginfloatrate,circle;rate=3;circle=3.
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 江西省于都實(shí)驗(yàn)中學(xué)2025屆高三下學(xué)期第二次聯(lián)考?xì)v史試題含解析
- 武漢科技職業(yè)學(xué)院《新能源材料與器件導(dǎo)論》2023-2024學(xué)年第二學(xué)期期末試卷
- 項(xiàng)目施工流程計(jì)劃
- 武夷學(xué)院《足球主項(xiàng)與實(shí)踐Ⅰ》2023-2024學(xué)年第二學(xué)期期末試卷
- 海南科技職業(yè)大學(xué)《A設(shè)計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 天津傳媒學(xué)院《運(yùn)動(dòng)生理學(xué)二》2023-2024學(xué)年第二學(xué)期期末試卷
- 包頭鐵道職業(yè)技術(shù)學(xué)院《新媒體展示設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 四川鐵道職業(yè)學(xué)院《草書2》2023-2024學(xué)年第二學(xué)期期末試卷
- 標(biāo)準(zhǔn)化基礎(chǔ)知識(shí)培訓(xùn)
- 預(yù)防交叉感染制度
- 2025年吉林電子信息職業(yè)技術(shù)學(xué)院單招職業(yè)技能測(cè)試題庫及答案一套
- 新版人教PEP版三年級(jí)下冊(cè)英語課件 Unit 6 Reading time
- 世界給予我的 課件-2024-2025學(xué)年高二下學(xué)期開學(xué)第一課主題班會(huì)
- 《孫權(quán)勸學(xué)》歷年中考文言文閱讀試題40篇(含答案與翻譯)(截至2024年)
- 市政道路路燈照明工程施工方案
- 演員王星受騙事件教育宣傳預(yù)防詐騙
- NCCN 腫瘤臨床實(shí)踐指南-(中文版)乳腺癌2020V4正式版
- 2025中國電信安徽公司縣分公司定向招聘60人(應(yīng)屆和非應(yīng)屆)高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2024年醫(yī)師定期考核臨床類考試題庫及答案(共500題)
- 《中國的科技成就》課件
- 《鐵路軌道維護(hù)》課件-墊板作業(yè)
評(píng)論
0/150
提交評(píng)論