![實驗1源程序的預處理及詞法分析程序設計_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/25/39541a99-4928-4da6-a5d3-b4010b983524/39541a99-4928-4da6-a5d3-b4010b9835241.gif)
![實驗1源程序的預處理及詞法分析程序設計_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/25/39541a99-4928-4da6-a5d3-b4010b983524/39541a99-4928-4da6-a5d3-b4010b9835242.gif)
![實驗1源程序的預處理及詞法分析程序設計_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/25/39541a99-4928-4da6-a5d3-b4010b983524/39541a99-4928-4da6-a5d3-b4010b9835243.gif)
![實驗1源程序的預處理及詞法分析程序設計_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/25/39541a99-4928-4da6-a5d3-b4010b983524/39541a99-4928-4da6-a5d3-b4010b9835244.gif)
![實驗1源程序的預處理及詞法分析程序設計_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/25/39541a99-4928-4da6-a5d3-b4010b983524/39541a99-4928-4da6-a5d3-b4010b9835245.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、實驗一 源程序的預處理及詞法分析程序設計(6學時)一、 實驗目的設計并實現(xiàn)一個包含預處理功能的詞法分析程序,加深對編譯中詞法分析過程的理解。二、 實驗要求1、實現(xiàn)預處理功能源程序中可能包含有對程序執(zhí)行無意義的符號,要求將其剔除。首先編制一個源程序的輸入過程,從鍵盤、文件或文本框輸入若干行語句,依次存入輸入緩沖區(qū)(字符型數據);然后編制一個預處理子程序,去掉輸入串中的回車符、換行符和跳格符等編輯性文字;把多個空白符合并為一個;去掉注釋。 2、實現(xiàn)詞法分析功能輸入:所給文法的源程序字符串。輸出:二元組(syn,token或sum)構成的序列。其中, syn為單詞種別碼。 Token為存放的單詞自身
2、字符串。 Sum為整型常量。具體實現(xiàn)時,可以將單詞的二元組用結構進行處理。3、待分析的C語言子集的詞法1)關鍵字main if then while do static int double struct break else long switch case typedef char return const float short continue for void default sizeof do 所有的關鍵字都是小寫。2)運算符和界符 + - * / : := < <> <= > >= = ; ( ) #3)其他標記ID和NUM通過以下正規(guī)式定義其
3、他標記:IDletter(letter|digit)*NUMdigit digit*lettera|z|A|Zdigit0|94)空格由空白、制表符和換行符組成空格一般用來分隔ID、NUM、專用符號和關鍵字,詞法分析階段通常被忽略。4、各種單詞符號對應的種別碼表1 各種單詞符號的種別碼單詞符號 種別碼 單詞符號 種別碼 main 1 ; 41 if 2 ( 42 then 3 ) 43 while 4 int 7 do 5 double 8 static 6 struct 9 ID 25 break 10 NUM 26 else 11 + 27 long 12 - 28 switch 13 *
4、 29 case 14 / 30 typedef 15: 31 char 16:= 32 return 17< 33 const 18<> 34 float 19<= 35 short 20> 36 continue 21>= 37 for 22= 38 void 23 default 39 sizeof 24do 40 # 0 5、 詞法分析程序的主要算法思想算法的基本任務是從字符串表示的源程序中識別出具有獨立意義的單詞符號,其基本思想是根據掃描到的單詞符號的第一個字符的種類,拼出相應的單詞符號。1. 主程序示意圖 主程序示意圖如圖1所示。 置初值調用掃描
5、子程序輸出單詞二元組輸入串結束結束否是圖1 詞法分析主程序示意圖其中初值包括如下兩方面:(1) 關鍵字表初值關鍵字作為特殊標識符處理,把它們預先安排在一張表格中(稱為關鍵字表),當掃描程序識別出標識符時,查關鍵字表。如能查到匹配的單詞,則該單詞為關鍵字,否則為一般標識符。關鍵字表為一個字符串數組,其描述如下:char *rwtab27=“main”,”if”,”then”,”while”,”do”,” static”,”int”,” double”,”struct”,”break”,”else”,”long”,”switch”,”case”,”typedef”,”char”,”return”,
6、”const”,”float”,”short”,”continue”,”for”,”void”,”default”,”sizeof”,”do”; (2) 程序中需要用到的主要變量:syn,token和sum。2. 掃描子程序的算法思想首先設置三個變量:token用來存放構成單詞符號的字符串;sum用來存放整型單詞;syn用來存放單詞符號的種別編碼。掃描子程序主要部分流程如圖2所示。變量初始化 忽略空格是是否文件結束 返回否其他符號運算符,界符等符號字母數字否對不同符號給出相應的syn值是否關鍵字是Syn為對應關鍵字的單詞種別碼返回報錯拼數拼字符串Syn=25Syn=26圖2 詞法分析程序流程三
7、、實驗報告要求1.寫出編程思路、源代碼(或流程圖);2.寫出上機調試時發(fā)現(xiàn)的問題,以及解決的過程;3.寫出你所使用的測試數據及結果;4.談談你的體會。5.上機6小時,完成實驗報告2小時。程序代碼:/詞法分析#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>using namespace std;void chu_li_1(FILE *p,FILE *q) /處理空格 char ch; if(p=fopen("輸出文件.txt","r
8、+")=NULL) /shili3.txt為中轉文件 cout<<"輸出文件打開錯誤"<<endl; if(q=fopen("中轉文件.txt","w+")=NULL) /保存處理后程序的文件 cout<<"中轉文件打開錯誤"<<endl; while(!feof(p) ch=fgetc(p); if(ch!=32) fputc(ch,q); /保留一個空格 else if(ch=32) /將多個空格刪除 fputc(ch,q); while(1&&
9、amp;(ch!=EOF) ch=fgetc(p); if(ch!=32) /空格結束 fputc(ch,q); break; fclose(p); fclose(q); void chu_li_2(FILE *p,FILE *q) /處理換行 char ch; if(p=fopen("中轉文件.txt","r+")=NULL) cout<<"中轉文件打開錯誤"<<endl; if(q=fopen("輸出文件.txt","w+")=NULL) cout<<&q
10、uot;輸出文件打開錯誤"<<endl; while(ch=fgetc(p)!=EOF) if(ch!='n') /忽略換行符 fputc(ch,q); fclose(p); fclose(q); void chu_li_3(FILE *p,FILE *q) /處理注釋 char ch; if(p=fopen("輸入文件.txt","r+")=NULL) /程序輸入文件 if(p=fopen("輸入文件.txt","w+")=NULL) /程序輸入文件 cout<<
11、"輸入文件打開錯誤"<<endl; if(q=fopen("中轉文件.txt","w+")=NULL) cout<<"中轉文件打開錯誤"<<endl; while(ch=fgetc(p)!=EOF) if(ch=47) /程序中發(fā)現(xiàn)字符'/' ch=fgetc(p); if(ch=42) /判斷字符后'/'是否有字符'*' while(1) ch=fgetc(p); /忽略注釋內容 if(ch=42) /直到有'*'
12、出現(xiàn) ch=fgetc(p); if(ch=47) /判斷結束 break; else if(ch=47) /判斷以"/"開頭形式的注釋 while(ch!='n')&&(ch=fgetc(p)!=EOF) ch=fgetc(p); else fputc('/',q); /將不屬于注釋標示符的字符'/'寫入文件 fputc(ch,q); / else fputc(ch,q); fclose(p); fclose(q); void Y_C_L(FILE *p,FILE *q) /預處理函數 chu_li_3(p,
13、q); /處理注釋 chu_li_2(p,q); / 處理換行 chu_li_1(p,q); /處理空格 void Fen_xi() FILE *p,*q; char ch; int m,n=0; char letter20000="0" char *rwtab44="#","main","if","then","while","do","static", "int"," double",&quo
14、t;struct","break","else","long","switch", "case","typedef","char","return","const","float","short", "continue","for","void","sizeof","ID&quo
15、t;,"NUM","+","-","*","/", ":",":=","<","<>","<=",">",">=","=","default","include","","(", ")" if(p=fop
16、en("中轉文件.txt","r+")=NULL) cout<<"中轉文件打開錯誤"<<endl; if(q=fopen("輸出文件.txt","w+")=NULL) cout<<"輸出文件打開錯誤"<<endl; fputs("Token",q); fputs("tt",q); fputs("Syn",q); fputc('n',q); ch=fget
17、c(p); while(ch!=EOF) m=1; letter0=ch;if(letter0<=57&&letter0>=48)/開頭是數字 while(1&&ch!=EOF)/直到不是數字時為止 ch=fgetc(p); if(ch>=48&&ch<=57) letterm+=ch; else break; cout<<letter<<'t'<<'t'<<"26"<<endl;/輸出讀入的數字 fputs(l
18、etter,q); fputs("tt",q); fputs("26",q); fputc('n',q); for(int j=0;j<20000;j+)/將緩存數組清零 letterj='0' letter0=ch; else if(letter0<='z'&&letter0>='a')|(letter0<='Z'&&letter0>='A')/開頭是字母 int H=0; while(1&
19、;&!ch!=EOF)/直到不是字母或數字時為止 ch=fgetc(p); if(ch>='a'&&ch<='z')|(ch>='A'&&ch<='Z')|(ch>='0'&&ch<='9') letterm+=ch; else break; for(n=0;n<44;n+)/對初始表進行比較查看是否是關鍵字 if(strcmp(letter,rwtabn)=0) cout<<letter&
20、lt;<'t'<<'t'<<n<<endl; fputs(letter,q); fputs("tt",q); fprintf(q,"%d",n); fputc('n',q); H=1; if(H=0)/如果比較完時沒有,該字符量就是一般字符串 cout<<letter<<'t'<<"25"<<endl; fputs(letter,q); fputs("tt",q)
21、; fputs("25",q); fputc('n',q); for(int j=0;j<20000;j+)/將緩存數組清零 letterj='0' letter0=ch;else if(letter0>=' '&&letter0<='/')|(letter0>=':'&&letter0<='?') int H=0; if(letter0=' '|letter0='!'|letter0=
22、'"'|letter0='$'|letter0='%' |letter0='&'|letter0='''|letter0=','|letter0='.'|letter0='?') ch=fgetc(p); else while(ch!=EOF) ch=fgetc(p); if(ch>' '&&ch<='/')|(ch>=':'&&ch<
23、39;?')&&(ch!=' ' |ch!='!'|ch!='"'|ch!='$' |ch!='%'|ch!='&'|ch!=''' |ch!=','|ch!='.'|ch!='?') letterm+=ch; else break; for(n=0;n<44;n+)/對初始表進行比較查看是否是關鍵字 if(strcmp(letter,rwtabn)=0) cout<<letter<<'t'<<n<<endl; fputs(letter,q); fputs("tt",q); fprintf(q,"%d",n); fputc('n
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- idc租賃服務合同范例
- 存貨質押合同范本
- 企業(yè)員工招聘合同范本
- 農村安裝路燈合同范例
- 兼職配音協(xié)議合同范本
- 照明燈具采購合同范本
- 工業(yè)固體廢物處置合同范本
- 冰箱保養(yǎng)合同范本
- 天籟侗歌苗寨傳
- 2025年度國際知識產權轉讓合同范本(含專利保護)
- 施工周報表(標準模版)
- 4.5MWp分布式光伏項目主要設備材料清單(建筑工程安裝工程)
- von frey絲K值表完整版
- 云南省普通初中學生成長記錄模板-好ok
- SB/T 10415-2007雞粉調味料
- 考古繪圖基礎
- GB/T 32574-2016抽水蓄能電站檢修導則
- 《社會主義市場經濟理論(第三版)》第十三章社會主義市場經濟標準論
- 變更索賠案例分析
- 過敏性休克的急救及處理流程教材課件(28張)
- 《花婆婆》兒童繪本故事
評論
0/150
提交評論