




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、編譯技術實驗報告 實驗題目: 詞法分析學 院: 信息學院專 業: 計算機科學與技術學 號: 姓 名: 一、實驗目的(1) 理解詞法分析的功能;(2) 理解詞法分析的實現方法;二、實驗內容PL0的文法如下< >為非終結符。 := 該符號的左部由右部定義,可讀作“定義為”。 | 表示或,為左部可由多個右部定義。 表示花括號內的語法成分可以重復。在不加上下界時可重復0到任意次數,有上下界時可重復次數的限制。 表示方括號內的成分為任選項。 ( ) 表示圓括號內的成分優先。 上述符號為“元符號”, 文法用上述符號作為文法符號時需要用引號括起。程序=分程序分程序= 變量說明部分過程說明部分語句
2、變量說明部分=VAR標識符,標識符:INTEGER;無符號整數=數字數字標識符=字母字母|數字過程說明部分=過程首部分程序;過程說明部分;過程首部=PROCEDURE標識符;語句=賦值語句|條件語句|過程調用語句|讀語句|寫語句|復合語句|空賦值語句=標識符=表達式復合語句=BEGIN語句;語句END條件=表達式關系運算符表達式表達式=項加法運算符項 項=因子乘法運算符因子因子=標識符|無符號整數|'('表達式')'加法運算符=+|-乘法運算符=*關系運算符=<>|=|<|<=|>|>=條件語句=IF條件THEN語句字母=a|
3、b|X|Y|Z數字=0|1|2|8|9實現PL0的詞法分析三、實驗分析與設計PL0詞法分析程序是一個獨立的過程,其功能是為語法語義分析提供單詞,把輸入的字符串形式的源程序分割成一個個單詞符號傳遞給語法語義分析。其主要方法步驟為從源程序掃描下一個字符,忽略空格、換行、TAB和注釋并識別單詞,再將不同類別的單詞歸類輸出。四、實驗的實現#include <stdio.h>#include<stdlib.h>#include<string.h>#include<ctype.h>#include<stdbool.h>#definenorw 11
4、 /norw-1個關鍵字#defineal 20 /最長的關鍵字的長度#define ID norw#define INT norw+1#define COMMA norw+2#define ENDF norw+3#define COLON norw+4#define SEMIC norw+5#define ADD norw+6#define MINUS norw+7#define MULTI norw+8#define EVALU norw+9#define LE norw+10#define NE norw+11#define LT norw+12#define EQ norw+13#de
5、fine GE norw+14#define GT norw+15#define FLOAT norw+16char TOKEN20; /字符數組用來依次存放單詞詞文的各個字符extern int lookup(char *); /以TOKEN字符串查保留字表extern void report_error(char); /報告程序中的詞法錯誤bool isalpha(char); /判斷接收字符是否為字母bool isalnum(char); /判斷接收字符是否為字母或者數字bool isdigit(char); /判斷接收字符是否為數字bool isannotation(char); /判
6、斷接收字符是否為注釋extern char letter(char c); /用來將大寫字母轉化成小寫字母FILE* fin;FILE* fout;void scanner()/詞法分析的主體程序,對輸入的文本文件進行詞法分析char ch;int i,c;int error=0; /記錄文件中詞法錯誤的個數ch=fgetc(fin); /從輸入文件中讀取一個字符while(ch!=EOF)/當從輸入文件接收的字符不是文件結束符時,執行循環if(isalpha(ch)/如果從輸入文件接收的第一個字符是字母 ch=letter(ch);TOKEN0=ch;ch=fgetc(fin);i=1;wh
7、ile(isalnum(ch) ch=letter(ch);TOKENi=ch;i+;ch=fgetc(fin);TOKENi='0'c=lookup(TOKEN); /查保留字表if(c=0) fprintf(fout,"(%d,%s)n", ID,TOKEN); /輸出標識符else fprintf(fout,"(%d,%s)n", c,TOKEN); /輸出接收單詞為保留字if(isdigit(ch) /如果從輸入文件接收的第一個字符是數字 int cdot=0; /統計小數點個數TOKEN0=ch;ch=fgetc(fin);i=
8、1;while(isdigit(ch)|ch='.')/從第二個接收字符開始,當是數字或者是小數點時,執行循環if(ch='.') cdot+;TOKENi=ch;i+;ch=fgetc(fin);/重復接收字符,直到接收到非數字if(cdot>=2) error+; TOKENi='0' printf("%s is errorn", TOKEN); break; if(isalpha(ch) /如果第二個字符是字母while(isalpha(ch) /接收完所有的字母,跳出循環TOKENi=ch;i+;ch=fgetc
9、(fin);TOKENi='0'error+;printf("%s is errorn", TOKEN);else if(cdot=0) /當接收的字符為整型單詞時fseek(fin,-1,1); TOKENi='0' int a,temp=0,c; for(c=0;c<i;c+) a=TOKENc - '0' if(c!=0) temp=temp*10; temp=temp+a; else temp=a; fprintf(fout,"(%d,%d)n", INT, temp); /輸出接收單詞為整數
10、else if(cdot=1) fseek(fin,-1,1); TOKENi='0' int a,part1=0,jc,b=0; /b用來確定小數點所在的位置 float c=0.1,part2=0.0; while(TOKENb!='.') b=b+1; for(jc=0;jc<b;jc+) a=TOKENjc - '0' if(jc!=0) part1=part1*10; part1=part1+a; else part1=a; for(jc=b+1;jc<i;jc+) a=TOKENjc-'0' part2=a
11、*c+part2; c=c*0.1; fprintf(fout,"(%d,%f)n", FLOAT, part1+part2); /輸出接收單詞為小數 else if(cdot=2) fseek(fin,-1,1); else /如果從輸入文件接收的第一個字符既不是字母又不是數字switch(ch)/將所接收到的符號字符進行分類,采取一符一類case':':ch=fgetc(fin); if(ch='=') fprintf(fout,"(%d,:=)n", EVALU); /輸出接收符號為賦值號 elsech=fgetc(
12、fin);fseek(fin,-1,1); /文件接收字符回推一個字符fprintf(fout,"(%d,':')n", COLON); /輸出冒號break;case',':fprintf(fout,"(%d,',')n", COMMA); break; /輸出逗號case'.':fprintf(fout,"(%d,'.')n", ENDF);break; /輸出句號case'':fprintf(fout,"(%d,'.
13、')n", SEMIC);break; /輸出分號case'+':fprintf(fout,"(%d,'+')n", ADD);break; /輸出加號case'-':fprintf(fout,"(%d,'-')n", MINUS);break; /輸出減號case'*':fprintf(fout,"(%d,'*')n", MULTI);break; /輸出乘號case'<':ch=fgetc(fin
14、);if(ch='=')fprintf(fout,"(%d,'<=')n", LE); /輸出小于或等于號else if(ch='>')fprintf(fout,"(%d,'<>')n", NE); /輸出不等于號elsefseek(fin,-1,1);fprintf(fout,"(%d,'<')n", LT); /輸出小于號break;case'=':fprintf(fout,"(%d,'=
15、')n", EQ);break; /輸出等于號case'>':ch=fgetc(fin);if(ch='=')fprintf(fout,"(%d,'>=')n", GE); /輸出大于或等于號elsefseek(fin,-1,1);fprintf(fout,"(%d,'>')n", GT); /輸出大于號break;case' ':break;case'n':break;case't':break;case&
16、#39;/':ch=fgetc(fin);/檢查是否為單行注釋if(ch='/')while(ch!='n') ch=fgetc(fin); else fseek(fin,-1,1); printf("/ is errorn"); error+; break; case'': while(1) ch=fgetc(fin); if(ch='') break; if(ch=EOF) fseek(fin,-1,1); printf(" is errorn"); error+; break;
17、 break; default:printf("%c is errorn", ch); /接收非上述字符程序報告詞法錯誤error+;break;ch=fgetc(fin); /繼續從文件中讀取下一個單詞,直到文件結束/while循環結束printf("共發現%d 個詞法錯誤!",error);return;int lookup(char *token)int j; char wordnorwal;strcpy(&(word10), "begin" );strcpy(&(word20), "end"
18、);strcpy(&(word30), "var");strcpy(&(word40), "integer");strcpy(&(word50), "while");strcpy(&(word60), "do");strcpy(&(word70), "if");strcpy(&(word80), "then");strcpy(&(word90), "procedure");strcpy(&(w
19、ord100), "else");for(j=1;j<=norw-1;j+)if(strcmp(token,wordj)=0) return j; /以TOKEN字符串查保留字表,若查到返回保留字類別碼return 0; /TOKEN不是保留字,返回0bool isalpha(char c) /判斷接收字符是否為字母if(c>='a'&&c<='z')|(c>='A'&&c<='Z')return 1; else return 0;bool isalnum(char c)/判斷接收字符是否為字母或者數字if(c>='a'&&c<='z')|(c>='A'&&c<='Z')|(c>='0&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 內蒙古交通職業技術學院《中國孔府菜》2023-2024學年第一學期期末試卷
- 2024年山東省德州市名校數學七年級第一學期期末復習檢測模擬試題含解析
- 重慶化工職業學院《基礎口語1》2023-2024學年第一學期期末試卷
- 2024年山西省大同市第一中學數學七年級第一學期期末考試試題含解析
- 陜西省西安市碑林區西北工業大附屬中學2024-2025學年數學七年級第一學期期末質量檢測模擬試題含解析
- 河套學院《心理健康教學設計》2023-2024學年第一學期期末試卷
- 新業主見面會活動方案
- 教育機器人的技術進步與行業應用展望
- 明信片派送活動方案
- 日本公司團建活動方案
- 2025年4月自考03346項目管理試題
- 艾梅乙反歧視培訓課件
- 浙江省杭州市2024-2025學年高二下學期6月期末教學質量檢測英語試題(含答案)
- 2025年河南省中考地理試題(含答案)
- 2025安全生產月一把手講安全公開課三十二(91P)
- DB64-266-2018 建筑工程資料管理規程
- 人教鄂教版六年級下冊科學期末專題訓練:實驗題、綜合題(含答案)
- 基于項目式學習的小學勞動教育課程教學設計
- 2025屆湖北省武漢市武昌區南湖中學英語七年級第二學期期末達標檢測試題含答案
- 等離子體泡跨尺度耦合-洞察及研究
- 2025課件:紅色基因作風建設七一黨課
評論
0/150
提交評論