




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、編譯原理 實驗2詞法分析器一、實驗目的1.通過設計編制調試一個具體的詞法分析程序,加深對詞法分析原理的理解。2.掌握在對程序設計語言源程序進行掃描過程中將其分解為各類單詞的詞法分析方法。3.編制一個讀單詞的程序,從輸入的源程序中,識別出各個具有獨立意義的單詞,即基本保留字、標識符、常數、運算符和分隔符五大類。并依次輸出各個單詞的內部編碼及單詞符號自身值。(遇到錯誤時可顯示“Error”,然后跳過錯誤部分繼續顯示)二、詞法分析的基礎知識1.詞法分析器的功能和輸出格式詞法分析器的功能是輸入源程序,輸出單詞符號。詞法分析器的單詞符號常常表示成以下的二元式(單詞種別碼,單詞符號的屬性值)。在本實驗中,
2、采用的是一類符號一種別碼的方式。標識符的BNF表示:<標識符>-> <字母><字母數字串><字母數字串>-><字母><字母數字串>|<數字><字母數字串>|無符號整數的BNF表示:<無符號整數>-> <數字><數字串><數字串>-> <數字><數字串> |運算符的BNF表示:<加法運算符>-> +<減法運算符>-> -<大于關系運算符>-> >&
3、lt;大于等于關系運算符>-> >=2.超前搜索詞法分析時,常常會用到超前搜索方法。如當前待分析字符串為“a > i”,當前字符為“>”,此時,分析器到底是將其分析為大于關系運算符還是大于等于關系運算符呢?顯然,只有知道下一個字符是什么才能下結論。于是分析器讀入下一個字符“+”,這時可知應將“>”解釋為大于運算符。但此時,超前讀了一個字符“i”,所以要回退一個字符,詞法分析器才能正常運行。在分析標識符,無符號整數等時也有類似情況。三、程序要求1.程序輸入示例:如源程序為C語言,輸入如下一段:main()int a, b;a = 10; b = a+20;2.
4、程序輸出示例:(2,“main”)(5,“(”)(5,“)”)(5,“”)(1,“int”)(2,“a”)(5,“,”)(2,“b”)(5,“;”)(2,“a”)(4,“=”)(3,“10”)(5,“;”)(2,“b”)(4,“=”)(2,“a”)(4,“+”)(3,“20”)(5,“;”)(5,“)3.具體要求如下:(1)識別保留字:if、int、for、while、do、return、break、continue等。(2)運算符包括:+、-、*、/、=、>、<、>=、<=、!=(3)分隔符包括:,、;、(、)(4)常數為無符號整形數;(5)其它的都識別為標識符;4.
5、程序思路:(1)定義部分:定義常量、變量、數據結構。(2)初始化:從文件將源程序全部輸入到字符緩沖區中。(3)取單詞前:去掉多余空白。(4)取單詞:讀出單詞的每一個字符,組成單詞,分析類型,其中,關鍵是如何判斷取單詞結束,取到的單詞是什么類型的單詞。(5)顯示結果。四、實驗結果#include <stdio.h>#include "stdlib.h"#include <string.h>#define N 100/定義要分析的標識符或常數的最大個數#define M 20/標識符的長度char *sourceFile="D:AnalyzeF
6、ile.txt"/ 定義進行詞法分析的源文件char *key8="if","else","for","while","do","return","break","continue"/ 關鍵字char *border6=",","","","","(",")"/ 界符定義char *arithmetic4=&
7、quot;+","-","*","/"/ 算術運算符定義char *relation6="<","<=","=",">",">=","<>"/ 關系運算符定義char *constsN;/ 常數定義char *labelN;/ 標識符int constnum=0,labelnum=0;/ constnum-常數個數;labelnum-標識符個數/ 判斷一個字符是不是字母i
8、nt Isletter(char ch)if(ch>='a' && ch<='z'|ch>='A' && ch<='Z')return 1;return 0;/ 判斷一個字符是不是數字int IsDigit(char ch)if(ch>='0' && ch<='9')return 1;return 0;/ 判斷單詞符號類型int search(char searchchar,int wordtype)int i=0;
9、switch (wordtype)case 1:for (i=0;i<=7;i+)if(strcmp(keyi,searchchar)=0)/ 返回具體的關鍵字return(i+1);case 2:for (i=0;i<=5;i+)if(strcmp(borderi,searchchar)=0)/ 返回具體的界符return(i+1); return(0);case 3:for(i=0;i<=3;i+)if(strcmp(arithmetici,searchchar)=0)/ 返回具體的算術運算符return(i+1);return(0);case 4:for(i=0;i&l
10、t;=5;i+)if(strcmp(relationi,searchchar)=0)/ 返回具體的關系運算符return(i+1);return(0);case 5:for(i=0;i<constnum;i+)if(strcmp(constsi,searchchar)=0)/ 返回具體的整型常數return(i+1);constsi=(char *)malloc(sizeof(searchchar);strcpy(constsi,searchchar);constnum+;return(i);case 6:for(i=0;i<labelnum;i+)if(labeli!=NULL)
11、if(strcmp(labeli,searchchar)=0)/ 返回標識符return(i+1);labeli-1=(char *)malloc(sizeof(searchchar);strcpy(labeli-1,searchchar);labelnum+;return(i);return -1;/ 常數處理char digitprocess(char buffer,FILE* fp)int i=-1;char digittpM;int dtype;while (IsDigit(buffer)digittp+i=buffer;buffer=fgetc(fp);digittpi+1='
12、;0'dtype=search(digittp,5);/ 輸出整型常數printf("%s (5,%d)n",digittp,dtype-1);return(buffer);/ 標識符或關鍵字char alphaprocess(char buffer,FILE* fp)int atype;int i=-1;char alphatpM;while (Isletter(buffer)|(IsDigit(buffer)alphatp+i=buffer;buffer=fgetc(fp);alphatpi+1='0'if (atype=search(alpha
13、tp,1)/ 輸出關鍵字printf("%s (1,%d)n",alphatp,atype-1);elseatype=search(alphatp,6);/ 輸出標識符printf("%s (6,%d)n",alphatp,atype-1);return(buffer);/ 其它處理(運算符,界符等)char otherprocess(char buffer,FILE* fp)int i=-1;char othertpM;int otype,otypetp;othertp0=buffer;othertp1='0'if(otype=sear
14、ch(othertp,3)printf("%s (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 (4,%d)n",othertp,otypetp-1);goto out;elseothertp1='0'printf("%s (4,%d)n&q
15、uot;,othertp,otype-1);goto out;if(buffer=':')buffer=fgetc(fp);if (buffer='=')printf(":= (2,2)n");buffer=fgetc(fp);goto out;elseif(otype=search(othertp,2)printf("%s (2,%d)n",othertp,otype-1);buffer=fgetc(fp);goto out;if(buffer!='n')&&(buffer!='
16、')printf("%c error,not a wordn",buffer);buffer=fgetc(fp);out: return(buffer);int main(int argc, char* argv)int i;FILE *fp;/ 文件指針,指向要分析的源程序char cbuffer;/ 保存最新讀入的字符for (i=0; i<=N; i+)labeli=NULL;/ 初始化標識符constsi=NULL;/ 初始化常數if(fp=fopen(sourceFile,"rb")=NULL)/ 判斷源文件是否存在printf("文件%s不存在",sourceFile);elsecbuffer = fge
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工程制圖基礎 05第三章學習資料
- 江蘇省常州市新北區重點名校2025屆初三中考模擬沖刺卷(提優卷)(一)生物試題含解析
- 山東經貿職業學院《管理學經典閱讀》2023-2024學年第二學期期末試卷
- 唐山師范學院《工程估價與實務》2023-2024學年第二學期期末試卷
- 卓越學術之路
- 二零二五版車輛質押借款合同書范例
- 天津家庭裝修合同書
- 轉診合作協議書模板
- 私人借款延期補充協議書
- 引領家居設計創新
- 陜西氣象部門招聘筆試真題2024
- 針灸推拿治療失眠的禁忌
- 學校中層干部選拔任用實施方案
- 電氣工程及其自動化畢業論文-基于PLC的高空作業車電控系統設計
- 河南省駐馬店市部分學校2024-2025學年高三下學期3月月考地理試題(含答案)
- 云南省昭通市2024-2025學年七年級上學期期末地理試題(含答案)
- 2025年湖南省新華書店有限責任公司招聘筆試參考題庫含答案解析
- 2025至2030年中國聲音感應控制電筒數據監測研究報告
- 福格行為模型(中文版)
- DB50T 1041-2020 城鎮地質安全監測規范
- 2025-2030年中國冰激凌市場需求分析與投資發展趨勢預測報告
評論
0/150
提交評論