編譯原理詞法分析實驗報告_第1頁
編譯原理詞法分析實驗報告_第2頁
編譯原理詞法分析實驗報告_第3頁
編譯原理詞法分析實驗報告_第4頁
編譯原理詞法分析實驗報告_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

課程實驗報告課程名稱:編譯原理(詞法分析)專業(yè)班級:信息安全1001班學號:U14608姓名:指導教師:匯報日期:/11/8計算機科學與技術學院1、試驗目標設計并編制一個詞法分析程序,加深對詞法分析原理了解;鞏固對代碼生成及報錯處理等理論認識;培養(yǎng)對完整系統(tǒng)獨立分析和設計能力;培養(yǎng)學生獨立編程能力;

2、試驗要求2.1待分析簡單語言詞法關鍵字beginifthenwhiledoend其中,全部關鍵字均為小寫。運算符和界符:=+-*/<<=<>>>==;()#其余單詞是標識符(ID)和整形常數(shù)(NUM),經過以下正規(guī)式定義:ID=letter(NUM=digitdigit空格由空白、制表符和換行符組成,空格通慣用來分隔ID、NUM、運算符、界符和關鍵字,詞法分析階段通常被忽略2.2各種單詞符號對應種別碼,如表所表示表1單詞符號種別碼單詞符號種別碼begin1:17if2:=18then3<19while4<>21do5<=22end6>23letter(10>=24digitdigit11=25+12;26-13(27*14)28/15#02.3詞法分析程序功效輸入:所給文法源程序字符串輸出:二元組組成序列比如:對源程序輸入beginx:=9;ifx>0thenx:=2*x+1/3;end#源程序,經過詞法分析程序分析后輸出為:(1,begin)(10,’x’)(18,:=)(11,9)(26,;)……3、詞法分析程序算法思想算法基本任務是從字符串中表示源程序中識別出具備獨立意義單詞符號,其基本思想是依照掃描到單詞符號第一個字符種類,拼出對應單詞符號。全局變量設置在此程序中,需要設置兩個全局變量:關鍵字表retab[6]、和結束標志flag=1;其中retab中元素為“begin”“if”“then”“while”“do”“end”,在程序會掃描出標識符時,首先查關鍵字表。假如能找到匹配單詞,則該單詞為關鍵字,不然為通常標識符。結束標志flag初始化為1,當掃描程序碰到#時,將其置為0,在主程序中檢測flag==0時,會結束掃描。主程序main算法流程圖開始開始讀取讀取字符串到inputStringinti=0;輸入字符串長度inputLengthi<inputLength結束flag==0Scanner();i++i<inputLength結束flag==0Scanner();i++NYNY掃描子程序scanner()算法流程圖調用調用ch=當前第一個字符ch=當前第一個字符字母當前字符串數(shù)字運算符/界符當前字符串不一樣符號輸出不一樣符號及種別號當前數(shù)字輸出字符及編號是否關鍵字不一樣符號輸出不一樣符號及種別號當前數(shù)字輸出字符及編號是否關鍵字 其余符號錯誤 N錯誤輸出11輸出11及數(shù)字返回Y返回4、試驗結果輸入:beginx:=9;ifx>0thenx:=2*x+1/3;end#,如圖所表示5、試驗感想及總結此次試驗因為書上框架已經給出,算法已經用類C語言寫出,所以試驗比較簡單,唯一需要考慮是空格及可能下標溢出。自己寫詞法分析程序時未按照書中所寫具備眾多全局變量,采取是直接利用函數(shù)傳遞參數(shù),所以在傳遞參數(shù)時候也出了不少問題,但最終都順利處理了。6、源代碼#include<stdio.h>//頭文件#include<string.h>#include<ctype.h>#include<stdlib.h>charGetChar(char*input,int*index,intlength);//獲取當前字符intreserve(char*s);//查看是否為關鍵字char*retab[6]={"begin","if","then","while","do","end"};//關鍵字intflag=1;//結束標志//判斷是否是字母intmyIsAlpha(charch){ if(islower(ch)==2||isupper(ch)==1) { return1; } else { return0; }}//掃描函數(shù)voidscaner(char*input,intinputLength,int*index){ chars[256]="";//保留當前字符 charch=GetChar(input,index,inputLength); intnowPosition=0; if(myIsAlpha(ch)==1)//假如是字母 { while(((ch>='0'&&ch<='9')||(myIsAlpha(ch)==1))&&*index<=inputLength) { s[nowPosition]=ch;//添加到當前字符串中 nowPosition++; ch=GetChar(input,index,inputLength); } if((ch<'0'||ch>'9')&&(myIsAlpha(ch)==0))//進行回退操作,并輸出結果 { s[nowPosition]='\0';//添加結束標志 if(reserve(s)==0) { printf("(10,%s)",s); } (*index)--; return; } else//超出范圍 { s[nowPosition++]=ch; s[nowPosition]='\0';//添加結束標志 if(reserve(s)==0) { printf("(10,%s)",s); } printf("\n謝謝使用,按任何鍵退出!\n"); getchar(); exit(0); return; } } else if(ch>='0'&&ch<='9')//假如是數(shù)字 { while(ch>='0'&&ch<='9'&&*index<=inputLength) { s[nowPosition]=ch;//添加到當前字符串中 nowPosition++; ch=GetChar(input,index,inputLength); } if(ch<'0'||ch>'9')//進行回退操作 { printf("(11,%d)",atoi(s)); (*index)--; return; } else//超出范圍時 { s[nowPosition]=ch; printf("(11,%d)",atoi(s)); printf("\n謝謝使用,按任何鍵退出!\n"); getchar(); exit(0); } } else { switch(ch) { case'+': { printf("(13,+)"); return; } case'-': { printf("(14,-)"); return; } case'*': { printf("(15,*)"); return; } case'/': { printf("(16,/)"); return; } case'<': { ch=GetChar(input,index,inputLength); if(ch=='=') { printf("(22,<=)"); return; } else if(ch=='>') { printf("(21,<>)"); return; } else { printf("(20,<)"); if(*index>inputLength) { printf("\n謝謝使用,按任何鍵退出!\n"); getchar(); exit(0); return; } else { (*index)--; return; } } } case'>': { ch=GetChar(input,index,inputLength); if(ch=='=') { printf("(24,>=)"); return; } else { printf("(23,>)"); if(*index>inputLength) { printf("\n謝謝使用,按任何鍵退出!\n"); getchar(); exit(0); return; } else { (*index)--; return; } } } case':': { ch=GetChar(input,index,inputLength); if(ch=='=') { printf("(18,:=)"); return; } else { printf("(17,:)"); if(*index>inputLength) { printf("\n謝謝使用,按任何鍵退出!\n"); getchar(); exit(0); return; } else { (*index)--; return; } } } case'=': { printf("(25,=)"); return; } case';': { printf("(26,;)"); return; } case'(': { printf("(27,()"); return; } case')': { printf("(28,))"); return; } case'#': { printf("(0,;#)"); flag=0; return; } case'': { return; } default: { printf("(非法符號)"); } } }}//檢驗是否為關鍵字intreserve(char*s){ if(strcmp(s,retab[0])==0) { printf("(1,%s)",retab[0]); return1; } else if(strcmp(s,retab[1])==0) { printf("(2,%s)",retab[1]); return1; } else if(strcmp(s,retab[2])==0) { printf("(3,%s)",retab[2]); return1; } else if(strcmp(s,retab[3])==0) { printf("(4,%s)",retab[3]); return1; } else if(strcmp(s,retab[4])==0) { printf("(5,%s)",retab[4]); return1; } else if(strcmp(s,retab[5])==0)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論