編譯原理實驗 查填符號表(含源代碼和運行結(jié)果)_第1頁
編譯原理實驗 查填符號表(含源代碼和運行結(jié)果)_第2頁
編譯原理實驗 查填符號表(含源代碼和運行結(jié)果)_第3頁
編譯原理實驗 查填符號表(含源代碼和運行結(jié)果)_第4頁
編譯原理實驗 查填符號表(含源代碼和運行結(jié)果)_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、編譯原理實驗報告實驗1 查填符號表姓名 學(xué)號 班級 計科1001班時間: 2012/3/22 地點:文波同 組 人:無指導(dǎo)教師:朱少林實驗?zāi)康?1、運用所學(xué)知識,選擇語言、選擇算法(數(shù)據(jù)結(jié)構(gòu)),編程實現(xiàn)符號表管理程序。 2、熟悉編譯過程,訓(xùn)練編寫程序的能力,為后續(xù)實驗積累經(jīng)驗。實驗內(nèi)容 1、運用所學(xué)知識,編程實現(xiàn)符號表管理程序。讀出源程序中與C語言詞法規(guī)定相一致的標(biāo)識符,并在符號表中進(jìn)行查找,若存在則輸出該標(biāo)識符及其編號和位置;否則將其填入符號表,并分配編號,確定位置,輸出該標(biāo)識符。2、輸出標(biāo)識符表。 實驗環(huán)境 軟件:VC+6.0 實驗前準(zhǔn)備1、 方案設(shè)計: 準(zhǔn)備模擬數(shù)據(jù):由于是識別符合c語言

2、規(guī)定的標(biāo)識符,故本實驗中使用 “測試文件.c” 寫出c語言標(biāo)識符的正規(guī)式定義:letter_A|B|C|Z|a|b|z|_digit0|1|9 idletter_(letter_|digit)* 畫出不確定的有限自動機不確定的有限自動機如下: 進(jìn)行化簡:A=1B=2,3,4,5,9C=3,4,5,6,8,9D=3,4,5,7,8,9狀態(tài)轉(zhuǎn)換表如下:狀態(tài)letter_digitABBCDCCDDCD進(jìn)行化簡:A B,C,D化簡后的確定有限自動機如下: 程序思想:該實驗重點是構(gòu)造識別標(biāo)識符的函數(shù)。程序中,使用的數(shù)據(jù)結(jié)構(gòu)如下:struct recordchar name20;typedef stru

3、ct record RECORD;record是用來記錄標(biāo)識符的名字,并且規(guī)定標(biāo)識符的長度最大為20struct infor/記錄符號表的相關(guān)信息struct record *head;int length; /記錄符號表的長度;typedef struct infor INFOR;infor是用來指向record結(jié)構(gòu)體的指針和符號表的長度,這個結(jié)構(gòu)體主要是用于比較標(biāo)識符并將識別到的標(biāo)識符寫入分析結(jié)果文件中即本實驗中的“search_table”函數(shù),該函數(shù)并沒有直接把標(biāo)識符寫到文件,而是在該函數(shù)之外,新建一個文件用來放符號表,然在后來打印符號表的同時把打印的結(jié)果寫該文件中去。該程序中的“se

4、arch_table”函數(shù)判斷是否為新的標(biāo)識符的方法就是把識別的一個標(biāo)識符與已經(jīng)識別的一一比較看是否相同,如不相同則表長度加1,并將該標(biāo)識符填入表中while( j<i&&strcmp(teststring,)j+;/與已有的標(biāo)識符一一比較if(j=i)/說明是新的標(biāo)識符 strcpy(,teststring); /pointj.line=j; p->length+;2、 程序設(shè)計#include "stdio.h"#include "stdlib.h"#include "

5、string.h"struct recordchar name20;typedef struct record RECORD;struct infor/記錄符號表的相關(guān)信息struct record *head;int length; /記錄符號表的長度;typedef struct infor INFOR;void search_table(char *teststring, INFOR *p, FILE *f)/查填符號表函數(shù),p為指向結(jié)構(gòu)體的指針int i=p->length;int j=0;RECORD *point;point=p->head;while( j&

6、lt;i&&strcmp(teststring,)j+;/與已有的標(biāo)識符一一比較if(j=i)/說明是新的標(biāo)識符 strcpy(,teststring); /pointj.line=j; p->length+;printf("標(biāo)識符%s在符號表的第%d行n",teststring,j+1); fprintf(f,"%st%5dn",teststring,j+1);/將新的標(biāo)識符寫入文件分析結(jié)果文件f中return; void main()char readchar;/從文件中讀到的字符ch

7、ar teststr20;/存放標(biāo)識符char linkstr2=0;/用于把字符readchar連接到teststrFILE *fp;fp=fopen("測試文件.c","r");if (fp=NULL)printf("打開文件失??!");exit(0);/打開測試文件fpFILE *result;result=fopen("結(jié)果.txt","w+");/新建打開一個存放分析結(jié)果的文件result /fclose(result);這個命令使下面調(diào)用的search_table函數(shù)不能將分析結(jié)果寫

8、入“結(jié)果.txt” /,因為search_table函數(shù)函數(shù)中沒有打開“結(jié)果.txt”命令I(lǐng)NFOR information;/用于指向符號表RECORD mark300;/定義符號表最多可以有300個符號information.head=mark;information.length=0; readchar=fgetc(fp);/char history=readchar;利用這個記錄讀取的上一個字符,判斷是否是數(shù)字 while(readchar!=EOF) teststr0=0; if(readchar<='z'&& readchar>='

9、;a'|readchar>='A'&& readchar<='Z'|readchar='_')/字母數(shù)字下劃線開頭,如果這個滿足則下面的也一定滿足 while(readchar<='z'&& readchar>='a'|readchar>='A'&& readchar<='Z'|readchar='_'|readchar>='0'&& re

10、adchar<='9') linkstr0=readchar; strcat(teststr,linkstr);/會自動添加0 /if(history>'9'&&history<'0') readchar=fgetc(fp); if(strlen(teststr)!=0 ) search_table(teststr, &information, result);/將結(jié)果寫入"結(jié)果.txt" /這個循環(huán)結(jié)束后就讀入一個標(biāo)識符readchar=fgetc(fp); fclose(fp);

11、fclose(result); FILE *table=fopen("符號表.txt","w+");/新建"符號表.txt"文件 if(table=NULL) printf("文件打開失敗!");exit (0); int i=0; /printf("行數(shù)t"); /printf("標(biāo)識符n"); printf("*n"); printf("以下是符號表的內(nèi)容n"); printf("行數(shù)ttt標(biāo)識符n"); whi

12、le(i<information.length) printf("%3dttt%sn",i+1, ); fwrite(&information.headi, strlen(),1,table); fprintf(table,"%4dn",i+1);/向符號表中寫入數(shù)據(jù) i+; fclose(table); 實驗步驟 1、建立簡單的符號表,可以只包含標(biāo)識符和編號;2、編寫單詞解析子程序,從源程序中分離出單詞;3、編寫查找標(biāo)識符的子程序(應(yīng)考慮查找算法),插入新的標(biāo)識符;4、程序調(diào)試,輸出標(biāo)識符表。實驗結(jié)

13、果及其分析:分析后輸出的分析文件是“結(jié)果.txt”內(nèi)容如下:include 1stdio 2h 3int 4_qq 5int 4temp 6char 7temp_s 8int 4search 9char 7str 10char 7c 11void 12main 13char 7str 10c 11int 4m 14i 15printf 16please 17input 18a 19string 20gets 21str 10puts 22please 17input 18the 23char 7you 24search 9c 11getchar 25m 14search 9str 10c 11

14、if 26m 14printf 16can 27not 28find 29else 30printf 16the 23c 11you 24search 9is 31d 32n 33m 14int 4search 9char 7str 10char 7c 11int 4i 15for 34i 15str 10i 15i 15if 26str 10i 15c 11return 35i 15return 35存放符號表的文件“符號表.txt”內(nèi)容如下:include 1stdio 2h 3int 4_qq 5temp 6char 7temp_s 8search 9str 10c 11void 12m

15、ain 13m 14i 15printf 16please 17input 18a 19string 20gets 21puts 22the 23you 24getchar 25if 26can 27not 28find 29else 30is 31d 32n 33for 34return 35使用的模擬數(shù)據(jù)“測試文件.c”如下:#include<stdio.h>int _qq; int 3temp;char temp_s;int search(char str80, char c);void main()char str80,c; int m,i;printf("ple

16、ase input a string:");gets(str);puts("please input the char you search");c=getchar();m=search(str,c);if(m=-1)printf("can not find");else printf("the c you search is %dn",m);int search(char str80,char c)int i;for(i=0;stri!='0'i+)if(stri=c)return(i);return -1;分析:實驗過程中最大的難題是文件的操作,因為之前關(guān)于文件的操作課程沒有講,再加上很久沒寫代碼的原因,就先學(xué)了下文件操作,實驗過程中最開始 “結(jié)果.txt”總是空,后來知道原來是我在創(chuàng)建了該文件后就關(guān)閉了,在沒有打開的情況下不能進(jìn)行寫入結(jié)果的操作;還有就是剛開始的“符號表.txt”每個符號后面都有不同數(shù)目的“燙”,經(jīng)分析知道這種情況下每個標(biāo)識符都是強制的長度一致,都是20(定義的標(biāo)識符最大長度是20),這是因為向文件中寫入數(shù)據(jù)時:

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論