詞法分析器設(shè)計_第1頁
詞法分析器設(shè)計_第2頁
詞法分析器設(shè)計_第3頁
詞法分析器設(shè)計_第4頁
詞法分析器設(shè)計_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、學(xué) 號 編譯原理實驗1:詞法分析器設(shè)計學(xué)生姓名專業(yè)、班級指導(dǎo)教師成績計算機(jī)與信息工程學(xué)院2018 年 11 月 20 日一、實驗?zāi)康?. 理解詞法分析程序的功能。2. 熟悉詞法分析程序的設(shè)計原理和構(gòu)造方法。3. 理解詞法分析程序輸出單詞的形式。4. 設(shè)計實現(xiàn)針對簡單語言的一個詞法分析程序。二、實驗要求1. 根據(jù)書P199給出的簡單語言的詞法和各單詞符號種別碼表,編寫C或C+語言源程序,實現(xiàn)針對該簡單語言的詞法分析器;2. 獨(dú)立做實驗,輸入、調(diào)試所編程序;3. 實驗結(jié)束后,根據(jù)實驗報告模板編寫實驗報告。三、實驗內(nèi)容和步驟用 Visual C+作為實驗開發(fā)環(huán)境,創(chuàng)建一個Win32 Console

2、Application工程,工程名為你的學(xué)號,添加三個文件:(1)存儲結(jié)構(gòu)定義:以LexerDef.h為文件名; (2)基本操作和算法:以LexerAlgo.h為文件名; (3)調(diào)用基本操作的主程序:以LexerMain.cpp為文件名。編寫程序:(1)文件LexerDef.h定義單詞符號的二元組結(jié)構(gòu)、全局變量、關(guān)鍵字表的結(jié)束標(biāo)志等。(2)文件LexerAlgo.h實現(xiàn)詞法掃描算法scanner及其所需的各種基本操作算法。(3)文件LexerMain.cpp調(diào)用scanner算法,實現(xiàn)詞法分析器的功能。源程序代碼:=LexerDef.h=#define _KEY_WORD_END "

3、waiting for your expanding"typedef structint typenum;char * word;WORD;=LexerAlgo.h=#include"LexerDef.h"char input50=""char token255=""int p_input;int p_token; char ch;char * rwtab="begin","if","then","while","do",&q

4、uot;end",_KEY_WORD_END;/從輸入緩沖區(qū)讀取一個字符到ch中char m_getch()ch=inputp_input;p_input=p_input+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'

5、&&ch<='z'|ch>='A'&&ch<='Z')return 1;elsereturn 0;/判斷是否為數(shù)字int digit()if(ch>='0'&&ch<='9')return 1;else return 0;/檢索關(guān)鍵字表格int reserve()int i=0;while(strcmp(rwtabi,_KEY_WORD_END)if(!strcmp(rwtabi,token)return i+1;i+;return 10

6、;void retract()p_input=p_input-1;char * dtb()return NULL;WORD * scaner()WORD * myword=new 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)

7、;else if(digit()while(digit()concat();m_getch();retract();myword->typenum=20;myword->word=token;return(myword);else switch(ch)case '=':m_getch();if(ch='=')myword->typenum=39;myword->word="="return(myword);retract();myword->typenum=21;myword->word="=&q

8、uot;return(myword);break;case '+':myword->typenum=22;myword->word="+"return(myword);break;case '-':myword->typenum=23;myword->word="-"return(myword);break;case '*':myword->typenum=24;myword->word="*"return(myword);break;case 

9、9;/':myword->typenum=25;myword->word="/"return(myword);break;case '(':myword->typenum=26;myword->word="("return(myword);break;case ')':myword->typenum=27;myword->word=")"return(myword);break;case '':myword->typenum=28;myw

10、ord->word=""return(myword);break;case '':myword->typenum=29;myword->word=""return(myword);break;case '':myword->typenum=30;myword->word=""return(myword);break;case '':myword->typenum=31;myword->word=""return(myword)

11、;break;case ',':myword->typenum=32;myword->word=","return(myword);break;case ':':m_getch();if(ch='=')myword->typenum=18;myword->word=":="return(myword);retract();myword->typenum=33;myword->word=":"return(myword);break;case '

12、':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 '<':

13、m_getch();if(ch='=')myword->typenum=38;myword->word="<="return(myword);retract();myword->typenum=36;myword->word="<"return(myword);break;case '!':m_getch();if(ch='=')myword->typenum=40;myword->word="!="return(myword);retra

14、ct();myword->typenum=-1;myword->word="ERROR"return(myword);break;case '0':myword->typenum=100;myword->word="OVER"exit(0);return(myword);break;default:myword->typenum=-1;myword->word="ERROR"return(myword);=LexerMain.cpp=#include<stdio.h>#i

15、nclude<stdlib.h>#include<string.h>#include"LexerAlgo.h"WORD * scaner();void main(void)int over=1;WORD* oneword=new WORD;printf("Enter Your words(end with #):");scanf("%#s",input);p_input=0;printf("Your words:n%sn",input);while(over<1000&&

16、;over!=-1)oneword=scaner();if(oneword->typenum<1000)printf("(%d,%s)",oneword->typenum,oneword->word);over=oneword->typenum;printf("npress # to exit:");scanf("%#s",input);四、解答下列問題(1)簡述詞法分析器的算法思想算法的基本任務(wù)是從字符串表示的源程序中識別出具有獨(dú)立意義的單詞符號,其基本思想是根據(jù)掃描到單詞符號的第一個字符的種類,拼出相

17、應(yīng)的單詞符號。1.主程序示意圖關(guān)鍵字表的初值。關(guān)鍵字作為特殊標(biāo)識符處理,把它們預(yù)先安排在一張表格中(稱為關(guān)鍵字表),當(dāng)掃描程序識別出標(biāo)識符時,查關(guān)鍵字表。如能查到匹配的單詞,則該單詞為關(guān)鍵字,否則為一般標(biāo)識符。關(guān)鍵字表為一個字符串?dāng)?shù)組,其描述如下:Char *rwtab6 = “begin”, “if”, “then”, “while”, “do”, “end”;置初值調(diào)用掃描子程序輸出單詞二元組輸入串結(jié)束 否 是結(jié)束 程序需要用到的主要變量為syn,token和sum。2. 掃描子程序的算法思想 首先設(shè)置3個變量:(1)token用來存放構(gòu)成單詞符號的字符串;(2)sum用來存放整型單詞(3

18、)syn用來存放單詞符號的種別碼。(2)畫出詞法掃描算法scanner識別簡單語言的狀態(tài)轉(zhuǎn)換圖DFA(可手畫再插入圖片)(3)解釋子程序reverse的每句代碼含義 reserve函數(shù)的作用是遍歷關(guān)鍵字表格,判斷當(dāng)前存入token的字符串是否是關(guān)鍵字首先先設(shè)定一個初值為0的變量i(存在于while外部,會因為循環(huán)內(nèi)部的操作而進(jìn)行改變)while條件內(nèi)部完整代碼應(yīng)為:while(strcmp(rwtabi,_KEY_WORD_END)!=0),strcmp函數(shù)的作用是判斷兩個字符串是否相等:設(shè)兩個字符串str1,str2,若str1=str2,則返回零;若str1<str2,則返回負(fù)數(shù);若str1>str2,則返回正數(shù)。已知關(guān)鍵字表格中最后一個元素為_KEY_WORD_END,所以這行代碼的意思就是,從關(guān)鍵字表格中第一個字符串開始遍歷(循環(huán)一次后i+),遍歷到最后一個通過strcmp函數(shù)運(yùn)算等于零不滿足循環(huán)條件所以跳出循環(huán)。循環(huán)體內(nèi)部if當(dāng)前字符串和遍歷到的關(guān)鍵字進(jìn)行比較,兩者相等時滿足條件(!0!=0),相等時返還i+1。最后返還10(關(guān)鍵字的種別碼)(4)針對文件LexerMain.cpp中main

溫馨提示

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

最新文檔

評論

0/150

提交評論