詞法分析 編譯原理論文_第1頁
詞法分析 編譯原理論文_第2頁
詞法分析 編譯原理論文_第3頁
詞法分析 編譯原理論文_第4頁
詞法分析 編譯原理論文_第5頁
已閱讀5頁,還剩7頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、詞法分析*摘 要:詞法分析(lexical analysis)是計算機科學中將字符序列轉換為單詞(Token)序列的過程。進行詞法分析的程序或者函數叫作詞法分析器(Lexical analyzer,簡稱Lexer),也叫掃描器(Scanner)。詞法分析器一般以函數的形式存在,供語法分析器調用。關鍵詞:詞法分析  標識符計算機系統與人信息交換界面多數是應用高級語言來實現。一個高級語言程序的實現,必須依賴于相應的編譯系統。所謂編譯程序就是指能夠把某一種語言程序轉換成另一種與之等價的語言程序。它通常包括五個階段:詞法分析,語法分析,語義分析與中間代碼的產生、優化,目標代碼的生成

2、。完成計算機翻譯過程的關鍵階段,它為后面的語法分析、語義分析做好準備,打好基礎,以便快速地、高質量地生成目標語言程序。因此詞法分析是編譯的基礎。詞法分析器所處理的對象即詞法分析程序的輸入數據,實際上是源程序經過編譯預處理,去掉多余的符號后而形成的代碼,這樣給詞法分析帶來方便。詞法分析的過程是線性的從頭至尾掃描一遍,復雜度較低,易實現。一、實驗目的設計、編制并調試一個詞法分析程序,加深對詞法分析原理的理解。二、實驗要求2.1 待分析的簡單詞法(1).關鍵字:  begin   if   then   while &#

3、160; do   end  lishuman lishuman2015041886所有的關鍵字都是小寫。(2).運算符和界符 : = + - * / ( ) , : ; > < > = < = = = !(3).其他單詞是標識符(ID)和整型常數(SUM),通過以下正規式定義:ID = letter (letter | digit)* NUM = digit digit* (4).空格有空白、制表符和換行符組成

4、。空格一般用來分隔ID、SUM、運算符、界符和關鍵字,詞法分析階段通常被忽略。2.2 各種單詞符號對應的種別碼表2-2種別碼單詞符號種別碼單詞符號種別碼begin1(26if2)27then328while429do530end631lishuman7,32lishuman20150418868:33letter (letter | digit)* 10;34digit digit* 11>35=21<36+22> =37-23< =38*24= =39/25!402.3 詞法分析程序的功能輸入:所給文法的源程

5、序字符串。輸出:二元組(syn,token或sum)構成的序列。 其中:syn為單詞種別碼;token為存放的單詞自身字符串;sum為整型常數。 例如:對源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,經過詞法分析后輸出如下序列: (1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)2.4識別語言單詞的狀態轉換圖識別語言單詞的狀態轉換圖如下圖2-4所示:狀態0為初態,凡帶雙圈者為終態。 圖2-4識別語言單詞的狀態

6、轉換圖三、詞法分析程序的算法思想算法的基本任務是從字符串表示的源程序中識別出具有獨立意義的單詞符號,其基本思想是根據掃描到單詞符號的第一個字符的種類,拼出相應的單詞符號。3.1主程序示意圖:圖3-1主程序示意圖其中初始包括以下兩個方面:(1). 關鍵字表的初值。關鍵字作為特殊標識符處理,把它們預先安排在一張表格中(稱為關鍵字表),當掃描程序識別出標識符時,查關鍵字表。如能查到匹配的單詞,則該單詞為關鍵字,否則為一般標識符。關鍵字表為一個字符串數組,其描述如下:Char *nrwtab6= “begin”,“if',"then”,"whi

7、le”,“do","end",;(2).程序中需要用到的主要變量為syn,token和sum   3.2 掃描子程序的算法思想: 首先設置3個變量:token用來存放構成單詞符號的字符串;sum用來整型單詞;syn用來存放單詞符號的種別碼。圖3-2掃描子程序主要部分流程圖四、運行結果4.1.安裝Linux虛擬機(已經配置好虛擬機的可以跳過此步驟)1.安裝VMware-player2.解壓Ubuntu16.04_64-bit.rar3.在VMware-player中設置虛擬機:點擊“打開已經存在的虛擬機”,然后選擇“

8、Ubuntu16.04_64-bit.vmx”。4.啟動虛擬機,查看是否安裝成功。4.2.創建工作目錄在用戶家目錄下建立lishuman 文件夾,建立scaner.c文件編寫代碼,建立testin.txt輸入程序。4.3.詞法分析1.打開命令行。 cd lishuman/回車,進入lishuman目錄2.編譯程序。編譯scaner.c文件。圖4-3編譯scaner.c文件4.4. 編譯運行程序testin.txt是詞法分析器的輸入程序(即輸入的源程序,此程序由學生給出)。運行后,自動在lishuman目錄下生成result.txt文件。(testin.txt和result.txt文件都可由記事

9、本查看內容)圖4-4.1 testin.txt文件內容圖4-4.2 result.txt文件內容如果testin.txt中輸入有誤圖4-4.3 testin.txt錯誤文件內容則運行時顯示:圖4-4.4 result.txt錯誤文件內容五、源程序#include <stdio.h>#include <stdlib.h>#include <string.h>#define _KEY_WORD_END "waiting for your expanding"typedef struct int typenum; char * word; WO

10、RD;char input255;/輸入緩沖區 char token255=""/單詞緩沖區 int p_input;/輸入緩沖區指針 int p_token;/單詞緩沖區指針 char ch;/當前讀入字符 char* KEY_WORDS="begin","if","then","while","do","end","lishuman","lishuman2015041886",_KEY_WORD_END;/關鍵字

11、數組 WORD* scaner(WORD* word);/詞法掃描函數 int main(int argc,char * argv)int over=1;WORD* oneword= calloc(1,sizeof(WORD*);/printf("Enter Your words(end with $):");/scanf("%$s",input); FILE *fin;char buffer1000;if(fin=fopen("testin.txt","r")=NULL)printf("Cannot o

12、pen the file!n");exit(-1);while(fgets(buffer,100,fin)!=NULL)strcat(input,buffer); fclose(fin); FILE *fout;if(fout=fopen("result.txt","w")=NULL)printf("Cannot open the file!n");exit(-1); p_input=0;printf("Your words:n%sn",input);while(over<1000&&

13、;over!=-1)/對源程序進行分析 oneword=scaner(oneword);/獲得一個新單詞 if(oneword->typenum<1000) fprintf(fout,"(%d,%s)",oneword->typenum,oneword->word); /打印種別碼和單詞自身的值 over=oneword->typenum; fclose(fout);printf("npress done.");/從緩沖區讀取一個字符到ch中 char m_getch()ch=inputp_input;p_input=p_i

14、nput+1;return (ch);/去掉空白符號 void getbc()while(ch=' '|ch=10)ch=inputp_input;p_input=p_input+1;/拼接單詞 void concat()tokenp_token=ch;p_token=p_token+1;tokenp_token='0'/判斷是否字母 int letter()if(ch>='a'&&ch<='z'|ch>='A'&&ch<='Z')return

15、 1;else return 0;/判斷是否數字 int digit()if(ch>='0'&&ch<='9')return 1;else return 0;/檢索關鍵字表格 int reserve()int i=0;while(strcmp(KEY_WORDSi,_KEY_WORD_END) != 0)if(!strcmp(KEY_WORDSi,token)return i+1;i=i+1;return 10;/回退一個字符 void retract()p_input=p_input-1;/數字轉換成二進制 char* dtb()r

16、eturn NULL;/詞法掃描程序: WORD* scaner(WORD* word)WORD* myword=word;myword->typenum=10;myword->word=""p_token=0;m_getch();getbc();if(letter()while(letter()|digit()concat();m_getch();retract();myword->typenum=reserve();myword->word=token;return(myword);else if(digit()while(digit()conc

17、at();m_getch();/retract();if(letter()myword->typenum=-1;myword->word="ERROR"printf("In %s(), line=%d, invalid variable, error!n", _func_, _LINE_);exit(0);elseretract();myword->typenum=20;myword->word=token; else switch(ch)case '=': m_getch();if (ch='='

18、)myword->typenum=39;myword->word="="return(myword);retract();myword->typenum=21;myword->word="="return(myword);break;case '+':myword->typenum=22;myword->word="+"return(myword);break;case '-':myword->typenum=23;myword->word="-

19、"return(myword);break;case '*':myword->typenum=24;myword->word="*"return(myword);break;case '/':myword->typenum=25;myword->word="/"return(myword);break;case '(':myword->typenum=26;myword->word="("return(myword);break;case &

20、#39;)':myword->typenum=27;myword->word=")"return(myword);break;case '':myword->typenum=28;myword->word=""return(myword);break;case '':myword->typenum=29;myword->word=""return(myword);break;case '':myword->typenum=30;mywor

21、d->word=""return(myword);break;case '':myword->typenum=31;myword->word=""return(myword);break;case ',':myword->typenum=32;myword->word=","return(myword);break;case ':':myword->typenum=33;myword->word=":"return(mywor

22、d);break;case '':myword->typenum=34;myword->word=""return(myword);break;case '>': m_getch();if (ch='=')myword->typenum=37;myword->word=">="return(myword);retract();myword->typenum=35;myword->word=">"return(myword);break;case '<': m_getch();if (ch='=

溫馨提示

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

評論

0/150

提交評論