編譯原理實(shí)驗(yàn)詞法分析實(shí)驗(yàn)報(bào)告(共11頁)_第1頁
編譯原理實(shí)驗(yàn)詞法分析實(shí)驗(yàn)報(bào)告(共11頁)_第2頁
編譯原理實(shí)驗(yàn)詞法分析實(shí)驗(yàn)報(bào)告(共11頁)_第3頁
編譯原理實(shí)驗(yàn)詞法分析實(shí)驗(yàn)報(bào)告(共11頁)_第4頁
編譯原理實(shí)驗(yàn)詞法分析實(shí)驗(yàn)報(bào)告(共11頁)_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上編譯技術(shù)實(shí)驗(yàn)報(bào)告 實(shí)驗(yàn)題目: 詞法分析學(xué) 院: 信息學(xué)院專 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù)學(xué) 號(hào): 姓 名: 一、實(shí)驗(yàn)?zāi)康?1) 理解詞法分析的功能;(2) 理解詞法分析的實(shí)現(xiàn)方法;二、實(shí)驗(yàn)內(nèi)容PL0的文法如下< >為非終結(jié)符。 := 該符號(hào)的左部由右部定義,可讀作“定義為”。 | 表示或,為左部可由多個(gè)右部定義。 表示花括號(hào)內(nèi)的語法成分可以重復(fù)。在不加上下界時(shí)可重復(fù)0到任意次數(shù),有上下界時(shí)可重復(fù)次數(shù)的限制。 表示方括號(hào)內(nèi)的成分為任選項(xiàng)。 ( ) 表示圓括號(hào)內(nèi)的成分優(yōu)先。 上述符號(hào)為“元符號(hào)”, 文法用上述符號(hào)作為文法符號(hào)時(shí)需要用引號(hào)括起。程序=分程序分程序= 變

2、量說明部分過程說明部分語句變量說明部分=VAR標(biāo)識(shí)符,標(biāo)識(shí)符:INTEGER;無符號(hào)整數(shù)=數(shù)字?jǐn)?shù)字標(biāo)識(shí)符=字母字母|數(shù)字過程說明部分=過程首部分程序;過程說明部分;過程首部=PROCEDURE標(biāo)識(shí)符;語句=賦值語句|條件語句|過程調(diào)用語句|讀語句|寫語句|復(fù)合語句|空賦值語句=標(biāo)識(shí)符=表達(dá)式復(fù)合語句=BEGIN語句;語句END條件=表達(dá)式關(guān)系運(yùn)算符表達(dá)式表達(dá)式=項(xiàng)加法運(yùn)算符項(xiàng) 項(xiàng)=因子乘法運(yùn)算符因子因子=標(biāo)識(shí)符|無符號(hào)整數(shù)|'('表達(dá)式')'加法運(yùn)算符=+|-乘法運(yùn)算符=*關(guān)系運(yùn)算符=<>|=|<|<=|>|>=條件語句=IF

3、條件THEN語句字母=a|b|X|Y|Z數(shù)字=0|1|2|8|9實(shí)現(xiàn)PL0的詞法分析三、實(shí)驗(yàn)分析與設(shè)計(jì)PL0詞法分析程序是一個(gè)獨(dú)立的過程,其功能是為語法語義分析提供單詞,把輸入的字符串形式的源程序分割成一個(gè)個(gè)單詞符號(hào)傳遞給語法語義分析。其主要方法步驟為從源程序掃描下一個(gè)字符,忽略空格、換行、TAB和注釋并識(shí)別單詞,再將不同類別的單詞歸類輸出。四、實(shí)驗(yàn)的實(shí)現(xiàn)#include <stdio.h>#include<stdlib.h>#include<string.h>#include<ctype.h>#include<stdbool.h>#

4、definenorw 11 /norw-1個(gè)關(guān)鍵字#defineal 20 /最長的關(guān)鍵字的長度#define ID norw#define INT norw+1#define COMMA norw+2#define ENDF norw+3#define COLON norw+4#define SEMIC norw+5#define ADD norw+6#define MINUS norw+7#define MULTI norw+8#define EVALU norw+9#define LE norw+10#define NE norw+11#define LT norw+12#define

5、EQ norw+13#define GE norw+14#define GT norw+15#define FLOAT norw+16char TOKEN20; /字符數(shù)組用來依次存放單詞詞文的各個(gè)字符extern int lookup(char *); /以TOKEN字符串查保留字表extern void report_error(char); /報(bào)告程序中的詞法錯(cuò)誤bool isalpha(char); /判斷接收字符是否為字母bool isalnum(char); /判斷接收字符是否為字母或者數(shù)字bool isdigit(char); /判斷接收字符是否為數(shù)字bool isannotat

6、ion(char); /判斷接收字符是否為注釋extern char letter(char c); /用來將大寫字母轉(zhuǎn)化成小寫字母FILE* fin;FILE* fout;void scanner()/詞法分析的主體程序,對(duì)輸入的文本文件進(jìn)行詞法分析char ch;int i,c;int error=0; /記錄文件中詞法錯(cuò)誤的個(gè)數(shù)ch=fgetc(fin); /從輸入文件中讀取一個(gè)字符while(ch!=EOF)/當(dāng)從輸入文件接收的字符不是文件結(jié)束符時(shí),執(zhí)行循環(huán)if(isalpha(ch)/如果從輸入文件接收的第一個(gè)字符是字母 ch=letter(ch);TOKEN0=ch;ch=fget

7、c(fin);i=1;while(isalnum(ch) ch=letter(ch);TOKENi=ch;i+;ch=fgetc(fin);TOKENi='0'c=lookup(TOKEN); /查保留字表if(c=0) fprintf(fout,"(%d,%s)n", ID,TOKEN); /輸出標(biāo)識(shí)符else fprintf(fout,"(%d,%s)n", c,TOKEN); /輸出接收單詞為保留字if(isdigit(ch) /如果從輸入文件接收的第一個(gè)字符是數(shù)字 int cdot=0; /統(tǒng)計(jì)小數(shù)點(diǎn)個(gè)數(shù)TOKEN0=ch;ch=

8、fgetc(fin);i=1;while(isdigit(ch)|ch='.')/從第二個(gè)接收字符開始,當(dāng)是數(shù)字或者是小數(shù)點(diǎn)時(shí),執(zhí)行循環(huán)if(ch='.') cdot+;TOKENi=ch;i+;ch=fgetc(fin);/重復(fù)接收字符,直到接收到非數(shù)字if(cdot>=2) error+; TOKENi='0' printf("%s is errorn", TOKEN); break; if(isalpha(ch) /如果第二個(gè)字符是字母while(isalpha(ch) /接收完所有的字母,跳出循環(huán)TOKENi=c

9、h;i+;ch=fgetc(fin);TOKENi='0'error+;printf("%s is errorn", TOKEN);else if(cdot=0) /當(dāng)接收的字符為整型單詞時(shí)fseek(fin,-1,1); TOKENi='0' int a,temp=0,c; for(c=0;c<i;c+) a=TOKENc - '0' if(c!=0) temp=temp*10; temp=temp+a; else temp=a; fprintf(fout,"(%d,%d)n", INT, temp

10、); /輸出接收單詞為整數(shù)else if(cdot=1) fseek(fin,-1,1); TOKENi='0' int a,part1=0,jc,b=0; /b用來確定小數(shù)點(diǎn)所在的位置 float c=0.1,part2=0.0; while(TOKENb!='.') b=b+1; for(jc=0;jc<b;jc+) a=TOKENjc - '0' if(jc!=0) part1=part1*10; part1=part1+a; else part1=a; for(jc=b+1;jc<i;jc+) a=TOKENjc-'0

11、' part2=a*c+part2; c=c*0.1; fprintf(fout,"(%d,%f)n", FLOAT, part1+part2); /輸出接收單詞為小數(shù) else if(cdot=2) fseek(fin,-1,1); else /如果從輸入文件接收的第一個(gè)字符既不是字母又不是數(shù)字switch(ch)/將所接收到的符號(hào)字符進(jìn)行分類,采取一符一類case':':ch=fgetc(fin); if(ch='=') fprintf(fout,"(%d,:=)n", EVALU); /輸出接收符號(hào)為賦值號(hào)

12、elsech=fgetc(fin);fseek(fin,-1,1); /文件接收字符回推一個(gè)字符fprintf(fout,"(%d,':')n", COLON); /輸出冒號(hào)break;case',':fprintf(fout,"(%d,',')n", COMMA); break; /輸出逗號(hào)case'.':fprintf(fout,"(%d,'.')n", ENDF);break; /輸出句號(hào)case'':fprintf(fout,&qu

13、ot;(%d,'.')n", SEMIC);break; /輸出分號(hào)case'+':fprintf(fout,"(%d,'+')n", ADD);break; /輸出加號(hào)case'-':fprintf(fout,"(%d,'-')n", MINUS);break; /輸出減號(hào)case'*':fprintf(fout,"(%d,'*')n", MULTI);break; /輸出乘號(hào)case'<'

14、:ch=fgetc(fin);if(ch='=')fprintf(fout,"(%d,'<=')n", LE); /輸出小于或等于號(hào)else if(ch='>')fprintf(fout,"(%d,'<>')n", NE); /輸出不等于號(hào)elsefseek(fin,-1,1);fprintf(fout,"(%d,'<')n", LT); /輸出小于號(hào)break;case'=':fprintf(fout,&qu

15、ot;(%d,'=')n", EQ);break; /輸出等于號(hào)case'>':ch=fgetc(fin);if(ch='=')fprintf(fout,"(%d,'>=')n", GE); /輸出大于或等于號(hào)elsefseek(fin,-1,1);fprintf(fout,"(%d,'>')n", GT); /輸出大于號(hào)break;case' ':break;case'n':break;case't'

16、;:break;case'/':ch=fgetc(fin);/檢查是否為單行注釋if(ch='/')while(ch!='n') ch=fgetc(fin); else fseek(fin,-1,1); printf("/ is errorn"); error+; break; case'': while(1) ch=fgetc(fin); if(ch='') break; if(ch=EOF) fseek(fin,-1,1); printf(" is errorn"); e

17、rror+; break; break; default:printf("%c is errorn", ch); /接收非上述字符程序報(bào)告詞法錯(cuò)誤error+;break;ch=fgetc(fin); /繼續(xù)從文件中讀取下一個(gè)單詞,直到文件結(jié)束/while循環(huán)結(jié)束printf("共發(fā)現(xiàn)%d 個(gè)詞法錯(cuò)誤!",error);return;int lookup(char *token)int j; char wordnorwal;strcpy(&(word10), "begin" );strcpy(&(word20), &q

18、uot;end");strcpy(&(word30), "var");strcpy(&(word40), "integer");strcpy(&(word50), "while");strcpy(&(word60), "do");strcpy(&(word70), "if");strcpy(&(word80), "then");strcpy(&(word90), "procedure");s

19、trcpy(&(word100), "else");for(j=1;j<=norw-1;j+)if(strcmp(token,wordj)=0) return j; /以TOKEN字符串查保留字表,若查到返回保留字類別碼return 0; /TOKEN不是保留字,返回0bool isalpha(char c) /判斷接收字符是否為字母if(c>='a'&&c<='z')|(c>='A'&&c<='Z')return 1; else return 0;bool isalnum(char c)/判斷接收字符是否為字母或者數(shù)字if(c>='a'&&c<='z')|(c>='A'&&c<='Z')|(c>='0'&&c<='9&

溫馨提示

  • 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)論