版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 《編譯原理》</b></p><p> 實(shí)驗(yàn)報(bào)告 </p><p> 二○一八年 一 月 二 日</p><p><b> 目錄</b></p><p><b> 一、實(shí)驗(yàn)?zāi)康模?</b></p>&
2、lt;p><b> 二、實(shí)驗(yàn)要求:1</b></p><p> 三、詞法分析程序的算法思想:2</p><p><b> 四、程序代碼:3</b></p><p><b> 五、結(jié)果分析:7</b></p><p><b> 六、總結(jié):8&l
3、t;/b></p><p><b> 一、實(shí)驗(yàn)?zāi)康模?</b></p><p> 根據(jù)詞法分析器的基本原理,設(shè)計(jì)、編制并調(diào)試一個(gè)詞法分析程序,加深對(duì)詞法分析原理的理解。</p><p><b> 二、實(shí)驗(yàn)要求:</b></p><p> 2.1詞法分析器:逐個(gè)讀入源程序字符并按照構(gòu)詞規(guī)
4、則切分成一系列單詞。單詞是語言中具有獨(dú)立意義的最小單位,包括保留字、標(biāo)識(shí)符、運(yùn)算符、標(biāo)點(diǎn)符號(hào)和常量等。詞法分析是編譯過程中的一個(gè)階段,在語法分析前進(jìn)行 。也可以和語法分析結(jié)合在一起作為一遍,由語法分析程序調(diào)用詞法分析程序來獲得當(dāng)前單詞供語法分析使用。 要求:通過詞法分析器能夠?qū)崿F(xiàn)以下五種類型如單詞等的識(shí)別。 </p><p> (1)關(guān)鍵字"begin",&qu
5、ot;end","if","then","else","while","write","read"等, </p><p> "do", "call","const","char",&q
6、uot;until","procedure","repeat"等 </p><p> (2)運(yùn)算符:"+","-","*","/","="等 </p><p> (3)界符:"{","}&
7、quot;,"[","]",";",",",".","(",")",":"等 </p><p> (4)標(biāo)識(shí)符 (其他單詞是標(biāo)識(shí)符(ID)和整型常數(shù)(SUM),通過以下正規(guī)式定義:</p><p>
8、; ID = letter (letter | digit)*</p><p> NUM = digit digit*</p><p><b> (5)常量</b></p><p> 如果關(guān)鍵字、標(biāo)識(shí)符和常數(shù)之間沒有確定的算符或界符作間隔,則至少</p><p> 用一個(gè)空格作間隔??崭裼煽瞻?、制表符和換行符組
9、成。</p><p> 2.2 各種單詞符號(hào)對(duì)應(yīng)的種別碼:</p><p> 2.3 詞法分析程序的功能:</p><p> 輸入:所給文法的源程序字符串。</p><p> 輸出:二元組(syn,token或sum)構(gòu)成的序列。</p><p> 其中:syn為單詞種別碼;</p><p
10、> token為存放的單詞自身字符串;</p><p><b> sum為整型常數(shù)。</b></p><p> 例如:對(duì)源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,經(jīng)過詞法分析后輸出如下序列:</p><p> (1,begin)(10,x)(18,:=)(11,9)(2
11、6,;)(2,if)……</p><p> 三、詞法分析程序的算法思想:</p><p> 算法的基本任務(wù)是從字符串表示的源程序中識(shí)別出具有獨(dú)立意義的單詞符號(hào),其基本思想是根據(jù)掃描到單詞符號(hào)的第一個(gè)字符的種類,拼出相應(yīng)的單詞符號(hào)。</p><p> 3.1主程序示意圖:</p><p> 主程序示意圖如圖所示。其中初始包括以下兩個(gè)方面
12、:</p><p> ?、?關(guān)鍵字表的初值。</p><p> 關(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ù)組,其描述如下:</p><p> Char *rwtab[6] = {“begin”, “if”, “then”
13、, “while”, “do”, “end”,};</p><p> ?。?)程序中需要用到的主要變量為syn,token和sum</p><p> 3.2 掃描子程序的算法思想:</p><p> 首先設(shè)置3個(gè)變量:①token用來存放構(gòu)成單詞符號(hào)的字符串;②sum用來整型單詞;③syn用來存放單詞符號(hào)的種別碼。掃描子程序主要部分流程如圖所示</p>
14、;<p><b> 四、程序代碼:</b></p><p> #include <stdio.h></p><p> #include <string.h></p><p> #include<conio.h></p><p> #include <pro
15、cess.h></p><p> char prog[80],token[8],ch;</p><p> int syn,p,m,n,sum;</p><p> char *rwtab[6]={"begin","if","then","while","do"
16、;,"end"};</p><p><b> scaner();</b></p><p><b> main()</b></p><p><b> {p=0;</b></p><p> printf("\n please input a s
17、tring(end with '#'):/n");</p><p><b> do{</b></p><p> scanf("%c",&ch);</p><p> prog[p++]=ch;</p><p> }while(ch!='#');&
18、lt;/p><p><b> p=0;</b></p><p><b> do{</b></p><p><b> scaner();</b></p><p> switch(syn)</p><p> {case 11:printf("
19、( %-10d%5d )\n",sum,syn);</p><p><b> break;</b></p><p> case -1:printf("you have input a wrong string\n");</p><p><b> getch();</b></p>
20、;<p><b> exit(0);</b></p><p> default: printf("( %-10s%5d )\n",token,syn);</p><p><b> break;</b></p><p><b> }</b></p>
21、<p> }while(syn!=0);</p><p><b> getch();</b></p><p><b> }</b></p><p><b> scaner()</b></p><p><b> { sum=0;</b>
22、;</p><p> for(m=0;m<8;m++)token[m++]=NULL;</p><p> ch=prog[p++];</p><p><b> m=0;</b></p><p> while((ch==' ')||(ch=='\n'))ch=prog[p++]
23、;</p><p> if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))</p><p> { while(((ch<='z')&&(ch>='a'))||(
24、(ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))</p><p> {token[m++]=ch;</p><p> ch=prog[p++];</p><p><b> }</b&
25、gt;</p><p><b> p--;</b></p><p><b> syn=10;</b></p><p> for(n=0;n<6;n++)</p><p> if(strcmp(token,rwtab[n])==0)</p><p> { syn
26、=n+1;</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> else if((ch>='0')&&(ch<='9')
27、)</p><p> { while((ch>='0')&&(ch<='9'))</p><p> { sum=sum*10+ch-'0';</p><p> ch=prog[p++];</p><p><b> }</b></p&
28、gt;<p><b> p--;</b></p><p><b> syn=11;</b></p><p><b> }</b></p><p> else switch(ch)</p><p> { case '<':token[
29、m++]=ch;</p><p> ch=prog[p++];</p><p> if(ch=='=')</p><p> { syn=22;</p><p> token[m++]=ch;</p><p><b> }</b></p><p>
30、<b> else</b></p><p> { syn=20;</p><p><b> p--;</b></p><p><b> }</b></p><p><b> break;</b></p><p> ca
31、se '>':token[m++]=ch;</p><p> ch=prog[p++];</p><p> if(ch=='=')</p><p><b> { syn=24;</b></p><p> token[m++]=ch;</p><p>&
32、lt;b> }</b></p><p><b> else</b></p><p><b> { syn=23;</b></p><p><b> p--;</b></p><p><b> }</b></p>&
33、lt;p><b> break;</b></p><p> case '+': token[m++]=ch;</p><p> ch=prog[p++];</p><p> if(ch=='+')</p><p><b> { syn=17;</b>&
34、lt;/p><p> token[m++]=ch;</p><p><b> }</b></p><p><b> else</b></p><p><b> { syn=13;</b></p><p><b> p--;</b&g
35、t;</p><p><b> }</b></p><p><b> break;</b></p><p> case '-':token[m++]=ch;</p><p> ch=prog[p++];</p><p> if(ch=='-&
36、#39;)</p><p><b> { syn=29;</b></p><p> token[m++]=ch;</p><p><b> }</b></p><p><b> else</b></p><p><b> { syn=
37、14;</b></p><p><b> p--;</b></p><p><b> }</b></p><p><b> break;</b></p><p> case '!':ch=prog[p++];</p><p
38、> if(ch=='=')</p><p><b> { syn=21;</b></p><p> token[m++]=ch;</p><p><b> }</b></p><p><b> else</b></p><p&
39、gt;<b> { syn=31;</b></p><p><b> p--;</b></p><p><b> }</b></p><p><b> break;</b></p><p> case '=':token[m++]
40、=ch;</p><p> ch=prog[p++];</p><p> if(ch=='=')</p><p><b> { syn=25;</b></p><p> token[m++]=ch;</p><p><b> }</b></p&
41、gt;<p><b> else</b></p><p><b> { syn=18;</b></p><p><b> p--;</b></p><p><b> }</b></p><p><b> break;<
42、;/b></p><p> case '*': syn=15;</p><p> token[m++]=ch;</p><p><b> break;</b></p><p> case '/': syn=16;</p><p> token[m++
43、]=ch;</p><p><b> break;</b></p><p> case '(': syn=27;</p><p> token[m++]=ch;</p><p><b> break;</b></p><p> case ')
44、': syn=28;</p><p> token[m++]=ch;</p><p><b> break;</b></p><p> case '{': syn=5;</p><p> token[m++]=ch;</p><p><b> break
45、;</b></p><p> case '}': syn=6;</p><p> token[m++]=ch;</p><p><b> break;</b></p><p> case ';': syn=26;</p><p> token[
46、m++]=ch;</p><p><b> break;</b></p><p> case '\"': syn=30;</p><p> token[m++]=ch;</p><p><b> break;</b></p><p> ca
47、se '#': syn=0;</p><p> token[m++]=ch;</p><p><b> break;</b></p><p> case ':':syn=17;</p><p> token[m++]=ch;</p><p><b>
48、; break;</b></p><p> default: syn=-1;</p><p><b> break;</b></p><p><b> }</b></p><p> token[m++]='\0';</p><p><
49、;b> }</b></p><p><b> 五、結(jié)果分析:</b></p><p> 輸入begin y:=8: if x>=8 then x:=2*(1+1/3); end # </p><p> 經(jīng)詞法分析輸出如下序列:(begin 1)(y 10)(:17)(= 18)(8 11)(;26)(if
溫馨提示
- 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. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 編譯原理課程設(shè)計(jì)--詞法分析
- 編譯原理課程設(shè)計(jì)--- 詞法分析程序
- 課程設(shè)計(jì)----編譯原理詞法分析器
- 編譯原理課程設(shè)計(jì)報(bào)告詞法分析器
- 編譯原理課程設(shè)計(jì)詞法分析器文檔
- 編譯原理課程設(shè)計(jì)報(bào)告之詞法分析器
- 編譯原理課程設(shè)計(jì)--詞法自動(dòng)機(jī)
- 編譯原理詞法分析器語法分析課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)-詞法語法分析器
- c-minus詞法分析和語法分析設(shè)計(jì)編譯器編譯原理課程設(shè)計(jì)
- 編譯原理-詞法分析
- 編譯原理課程設(shè)計(jì)--c-編譯器詞法分析與語法分析的實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)--pascal語言詞法、語法分析器設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)--編譯器
- 編譯原理課程設(shè)計(jì)報(bào)告
- 編譯原理課程設(shè)計(jì) (2)
- 編譯原理課程設(shè)計(jì)報(bào)告
- 編譯原理-詞法分析實(shí)驗(yàn)報(bào)告
評(píng)論
0/150
提交評(píng)論