詞符號(hào)種別識(shí)別程序設(shè)計(jì)_第1頁
詞符號(hào)種別識(shí)別程序設(shè)計(jì)_第2頁
詞符號(hào)種別識(shí)別程序設(shè)計(jì)_第3頁
詞符號(hào)種別識(shí)別程序設(shè)計(jì)_第4頁
詞符號(hào)種別識(shí)別程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、.班級(jí): 學(xué)號(hào): 姓名:實(shí)驗(yàn)二 單詞符號(hào)種別識(shí)別程序設(shè)計(jì)一、實(shí)驗(yàn)?zāi)康耐ㄟ^C語言詞法分析程序的實(shí)現(xiàn)理解編譯程序過程中詞法分析對(duì)單詞的種別識(shí)別過程。二、實(shí)驗(yàn)重難點(diǎn)單詞識(shí)別三、實(shí)驗(yàn)內(nèi)容與要求1. 閱讀教材P2-P3詞法分析部分內(nèi)容,明確詞法分析的任務(wù)。2. 閱讀實(shí)驗(yàn)案例,明確實(shí)驗(yàn)要求、模塊流程圖和程序?qū)崿F(xiàn)方案;3. 參考實(shí)驗(yàn)案例,完成簡(jiǎn)單的詞法分析程序設(shè)計(jì)。四、實(shí)驗(yàn)學(xué)時(shí)4課時(shí)五、實(shí)驗(yàn)設(shè)備與環(huán)境C語言編譯環(huán)境六、實(shí)驗(yàn)案例1. 待分析的簡(jiǎn)單的詞法(1) 關(guān)鍵字:begin if then while do end所有的關(guān)鍵字都是小寫。(2) 運(yùn)算符和界符: = + - * / < <= &l

2、t;> > >= = ; ( ) #(3) 其他單詞是標(biāo)識(shí)符(ID)和整型常數(shù)(SUM),通過以下正規(guī)式定義:ID = letter (letter | digit)*NUM = digit digit*(4) 空格由空白、制表符和換行符組成。空格一般用來分隔ID、SUM、運(yùn)算符、界符和關(guān)鍵字,詞法分析階段通常被忽略。2. 各種單詞符號(hào)對(duì)應(yīng)的種別碼見表6.1:表6.1 各種單詞符號(hào)對(duì)應(yīng)的種別碼單詞符號(hào)種別碼 單詞符號(hào)種別碼begin1:17if2=18then3<20while4!=21do5<=22end6>237>=248=25+9;26lette

3、t(letter|digit)*10(27dight dight*11)28+13-29-1430*15!31/16#03. 詞法分析程序的功能:輸入:所給文法的源程序字符串。輸出:二元組(syn,token或sum)構(gòu)成的序列。其中:syn為單詞種別碼; token為存放的單詞自身字符串; sum為整型常數(shù)。例如:對(duì)源程序begin x:=9; if x>9 then x:=2*x+1/3; end #的源文件,經(jīng)過詞法分析后輸出如下序列:(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)4. 詞法分析程序的算法思想:算法的基本任務(wù)是從字符串表示的源程序中

4、識(shí)別出具有獨(dú)立意義的單詞符號(hào),其基本思想是根據(jù)掃描到單詞符號(hào)的第一個(gè)字符的種類,拼出相應(yīng)的單詞符號(hào)。(1) 主程序示意圖:主程序示意圖如圖6-1所示。其中初值包括以下兩個(gè)方面:Ø 關(guān)鍵字表的初值:關(guān)鍵字作為特殊標(biāo)識(shí)符處理,把它們預(yù)先安排在一張表格中(稱為關(guān)鍵字表),當(dāng)掃描程序識(shí)別出標(biāo)識(shí)符時(shí),查關(guān)鍵字表。如能查到匹配的單詞,則該單詞為關(guān)鍵字,否則為一般標(biāo)識(shí)符。關(guān)鍵字表為一個(gè)字符串?dāng)?shù)組,其描述如下:Char *rwtab6 = “begin”, “if”, “then”, “while”, “do”, “end”,;置初值調(diào)用掃描子程序輸出單詞二元組輸入串結(jié)束 否 是結(jié)束 圖6-1 主程

5、序流程圖Ø 程序中需要用到的主要變量為syn,token和sum(2) 掃描子程序的算法思想:首先設(shè)置3個(gè)變量:token用來存放構(gòu)成單詞符號(hào)的字符串;sum用來存放整型單詞;syn用來存放單詞符號(hào)的種別碼。掃描子程序主要部分流程如圖6-2所示。變量初始化忽略空格是否文件結(jié)束? 返回 是否字母拼字符串 數(shù)字 其他運(yùn)算符、 符號(hào)界符等符號(hào)是否關(guān)鍵字?返回拼數(shù) 否對(duì)不同符號(hào)給出相應(yīng)的syn值報(bào)錯(cuò)syn=10 是syn=1111syn為對(duì)應(yīng)關(guān)鍵字的單詞種別碼圖 6-2 掃描子程序算法流程圖5. 詞法分析程序的C語言程序源代碼:#include <stdio.h>#include

6、 <stdlib.h>#include <string.h>#include <ctype.h>#include <malloc.h>#include <conio.h>char prog80, ch;int p,m,n;char token8;int syn,sum;char *rwtab6="begin","if","then","while","do","end" /關(guān)鍵字表初始化scaner(); /聲明一個(gè)

7、函數(shù)名為scanser()的子函數(shù)main()p=0; printf("n please input a string(end with '#'):n"); do scanf("%c",&ch);/用%c控制輸入則空格等表示有效輸入,用%S控制,空格等表示輸入結(jié)束 progp+=ch; while(ch!='#');/遇到“#”,輸入結(jié)束 p=0; do scaner(); switch(syn) case 11:printf("( %-10d%5d )n",sum,syn);/*種別為數(shù)字時(shí);

8、%-10d:表示輸出共占10位,%5d共占5位,右對(duì)齊左端補(bǔ)空格*/ break; case -1:printf("you have input a wrong stringn"); getch(); exit(0); default: printf("( %-10s%5d )n",token,syn); break; while(syn!=0); /“#”,syn=0 getch(); scaner() sum=0; for(m=0;m<8;m+) tokenm=NULL; / token8賦初值為空,token存放待識(shí)別的單詞 ch=progp

9、+; m=0; while(ch=' ')|(ch='n') ch=progp+;/空格或回車,不用判斷,直接進(jìn)入下一個(gè)單詞 /*如果這是一個(gè)字符串,拼字符串,判斷種別碼*/if(ch<='z')&&(ch>='a')|(ch<='Z')&&(ch>='A') /如果首字母為字母,拼出完整字符串 /*lettet(letter|digit)判斷后續(xù)字符是不是數(shù)字或字母,如果是就往下拼;如果不是,結(jié)束拼字符串*/while(ch<='

10、;z')&&(ch>='a')|(ch<='Z')&&(ch>='A')|(ch>='0')&&(ch<='9') tokenm+=ch; ch=progp+; p-; /使得progp為下一個(gè)帶處理的字符 syn=10; /*查關(guān)鍵字表,進(jìn)一步判斷這個(gè)字符串是標(biāo)識(shí)符還是關(guān)鍵字*/ for(n=0;n<6;n+) if(strcmp(token,rwtabn)=0) syn=n+1; break; /*如果這是一個(gè)數(shù)串,拼數(shù)

11、,判斷種別碼*/ else if(ch>='0')&&(ch<='9') while(ch>='0')&&(ch<='9') sum=sum*10+ch-'0' ch=progp+; p-; syn=11; /*如果這是一個(gè)界符、運(yùn)算符,判斷種別碼*/ else switch(ch)/*如果是<打頭,判斷是 < 還是 <= */case '<':tokenm+=ch; ch=progp+; if(ch='=

12、9;) syn=22; tokenm+=ch; else syn=20; p-; break;/*如果是>打頭,判斷是 < 還是 >= */ case '>':tokenm+=ch; ch=progp+; if(ch='=') syn=24; tokenm+=ch; else syn=23; p-; break;/*如果是+打頭,判斷是 + 還是 + */ case '+': tokenm+=ch; ch=progp+; if(ch='+') syn=9; tokenm+=ch; else syn=13;

13、p-; break;/*如果是-打頭,判斷是 - 還是 - */ case '-':tokenm+=ch; ch=progp+; if(ch='-') syn=29; tokenm+=ch; else syn=14; p-; break;/*如果是!打頭,判斷是 != 還是 ! */ case '!':ch=progp+; if(ch='=') syn=21; tokenm+=ch; else syn=31; p-; break;/*如果是=打頭,判斷是 = 還是 = */ case '=':tokenm+=ch;

14、 ch=progp+; if(ch='=') syn=25; tokenm+=ch; else syn=18; p-; break; case '*': syn=15; tokenm+=ch; break; case '/': syn=16; tokenm+=ch; break; case '(': syn=27; tokenm+=ch; break; case ')': syn=28; tokenm+=ch; break; case '': syn=7; tokenm+=ch; break; ca

15、se '': syn=8; tokenm+=ch; break; case '': syn=26; tokenm+=ch; break; case '"': syn=30; tokenm+=ch; break; case '#': syn=0; tokenm+=ch; break; case ':':syn=17; tokenm+=ch; break; default: syn=-1; break; tokenm+='0'/給字符串加上字符串結(jié)束標(biāo)志 6. 結(jié)果分析:輸入begin x:=

16、9; if x>9 then x:=2*x+1/3; end # 后經(jīng)詞法分析輸出如下序列:(begin 1)(x 10)(:17)(= 18)(9 11)(;26)(if 2) 如圖6-3所示: 圖6-3七、簡(jiǎn)單的詞法分析程序的設(shè)計(jì)1. The definition of P of a provided context-free grammar is as below:P=<標(biāo)識(shí)符> <字母><字母數(shù)字串><字母數(shù)字串> <字母><字母數(shù)字串>|<數(shù)字><字母數(shù)字串>|<下劃線>

17、<字母數(shù)字串>|<無符號(hào)整數(shù)>- <數(shù)字><數(shù)字串><數(shù)字串> <數(shù)字><數(shù)字串> |<加法運(yùn)算符> +<減法運(yùn)算符> -<大于關(guān)系運(yùn)算符> ><大于等于關(guān)系運(yùn)算符> >=2. The classes of token:關(guān)鍵字:if、int、for、while、do、return、break、continue;單詞種別碼為1。標(biāo)識(shí)符:?jiǎn)卧~種別碼為2。常數(shù)(無符號(hào)整數(shù)):?jiǎn)卧~種別碼為3。運(yùn)算符+、*、/、=、>、<、>=、<=、!

18、=:?jiǎn)卧~種別碼為4。界符包括:,、;、(、); 單詞種別碼為5。3. sample input: main()int a,b;a = 10; b = a + 20;4. sample output:(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,“)5. 詞法分析程序(c語言版):#include <stdio.h>#include <stdl

19、ib.h>#include <string.h>#include <ctype.h>#include <malloc.h>#include <conio.h>char prog80, ch;int p,m,n;char token8;int syn,sum;char *rwtab8="if","int","for","return","break","continue","while","do

20、" /關(guān)鍵字表初始化scaner(); /聲明一個(gè)函數(shù)名為scanser()的子函數(shù)main()p=0; printf("n please input a string(end with '#'):n"); do scanf("%c",&ch);/用%c控制輸入則空格等表示有效輸入,用%S控制,空格等表示輸入結(jié)束 progp+=ch; while(ch!='#');/遇到"#",輸入結(jié)束 p=0; do scaner(); switch(syn) case 3:printf("

21、;("%d"t "%d"t)n",syn,sum);/*種別為數(shù)字時(shí);%-10d:表示輸出共占10位,%5d共占5位,右對(duì)齊左端補(bǔ)空格*/ break; case -1:printf("you have input a wrong stringn"); getch(); exit(0); default: printf("("%d"t "%s"t)n",syn,token); break; while(syn!=0); /"#",syn=0 ge

22、tch(); scaner() sum=0; for(m=0;m<8;m+) tokenm=NULL; / token8賦初值為空,token存放待識(shí)別的單詞 ch=progp+; m=0; while(ch=' ')|(ch='n') ch=progp+;/空格或回車,不用判斷,直接進(jìn)入下一個(gè)單詞 /*如果這是一個(gè)字符串,拼字符串,判斷種別碼*/if(ch<='z')&&(ch>='a')|(ch<='Z')&&(ch>='A') /如

23、果首字母為字母,拼出完整字符串 /*lettet(letter|digit)判斷后續(xù)字符是不是數(shù)字或字母,如果是就往下拼;如果不是,結(jié)束拼字符串*/while(ch<='z')&&(ch>='a')|(ch<='Z')&&(ch>='A')|(ch>='0')&&(ch<='9') tokenm+=ch; ch=progp+; p-; /使得progp為下一個(gè)帶處理的字符 syn=2;/ /*查關(guān)鍵字表,進(jìn)一步判斷這

24、個(gè)字符串是標(biāo)識(shí)符還是關(guān)鍵字*/ for(n=0;n<6;n+) if(strcmp(token,rwtabn)=0) syn=1; break; /*如果這是一個(gè)數(shù)串,拼數(shù),判斷種別碼*/ else if(ch>='0')&&(ch<='9') while(ch>='0')&&(ch<='9') sum=sum*10+ch-'0' ch=progp+; p-; syn=3; /*如果這是一個(gè)界符、運(yùn)算符,判斷種別碼*/ else switch(ch)/*

25、如果是<打頭,判斷是 < 還是 <= */case '<':tokenm+=ch; ch=progp+; if(ch='=') syn=4; tokenm+=ch; else syn=4; p-; break;/*如果是>打頭,判斷是 < 還是 >= */ case '>':tokenm+=ch; ch=progp+; if(ch='=') syn=4; tokenm+=ch; else syn=4; p-; break;/*如果是+打頭,判斷是 + 還是 + */ case 

26、9;+': tokenm+=ch; ch=progp+; if(ch='+') syn=4; tokenm+=ch; else syn=4; p-; break;/*如果是-打頭,判斷是 - 還是 - */ case '-':tokenm+=ch; ch=progp+; if(ch='-') syn=4; tokenm+=ch; else syn=4; p-; break;/*如果是!打頭,判斷是 != 還是 ! */ case '!':ch=progp+; if(ch='=') syn=4; tokenm+=ch; else syn=4; p-; break;/*如果是=打頭,判斷是 = 還是 = */ case '=':tokenm+

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論