實驗一 PL O語言的詞法分析程序GETSYM_第1頁
實驗一 PL O語言的詞法分析程序GETSYM_第2頁
實驗一 PL O語言的詞法分析程序GETSYM_第3頁
實驗一 PL O語言的詞法分析程序GETSYM_第4頁
實驗一 PL O語言的詞法分析程序GETSYM_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、實驗一 PL O語言的詞法分析程序GETSYM一、實驗目的加深和鞏固對于詞法分析的了解和掌握;初步認識PL/0語言的基礎和簡單的程序編寫;通過本實驗能夠初步的了解和掌握程序詞法分析的整個過程;提高自己上機和編程過程中處理具體問題的能力。二、實驗要求實驗前先閱讀完總體的預備知識以及實驗相關的基礎知識;要求自己獨立完成實驗,不得抄襲別人的結果;編寫和調試過程中出現(xiàn)的問題做好記錄;實驗程序調試完成后,用給定的PL0測試程序(test.pl0)進行測試,由老師檢查測試結果,并給予相應的成績;實驗完成后,要上交實驗報告。三、實驗原理PL/O語言的編譯程序,是用高級語言PASCAL語言書寫的。整個編譯過程

2、是由一些嵌套及并列的過程或函數完成。詞法分析程序是獨立的過程GETSYM完成,供語法分析讀單詞時使用。語法分析是由過程BLOCK完成。采用自頂向下的遞歸子程序法。所產生的目標程序為假象棧式計算機的匯編語言。對目標程序的執(zhí)行是由PASCAL語言書寫的解釋程序進行的。因此PL/O語言可以在配備PASCAL語言的任何機器上實現(xiàn)。由于PL/O語言編譯程序是適合教學用的實例,它的數據類型只有整形數,數據運算只有四則運算。語句有復制語句、條件語句、While型循環(huán)語句、輸入、輸出語句和不帶參數允許遞歸調用過程語句及復合語句。詞法分析程序GETSYM的功能包括:1、濾空格,空格在詞法分析時是一種不可缺少的界

3、符,而在語法分析時是無用的,所以必須濾掉。2、識別保留子:設有一張保留字表。對每個字母打頭的字母、數字字符串要查此表。若查著則為保留字,對應的類別放在SYM中。如IF對應值為THENSYM。3、識別標識符:對用戶定義的標識符將IDENT放在SYM中,標識符本身的值放在ID中。4、拼數:當所取單詞是數字時,將樹的類別NUMBER放在SYM中,數值本身的值放在NUM中。5、拼復合詞:對兩個字符組成的算符如:=、:=、=等單詞,識別后將類別送SYM中。6、打印源程序:為邊讀入字符邊打印。打印每個單詞的識別類別(如果是標識符或數字應該給出其值即id和num中的值。圖2所示即為給定PL0源程序的一個可能

4、輸出)。四、實驗環(huán)境操作系統(tǒng)為Windows 2000或Dos6.2以上;應用軟件為Pascal或C語言。GETCH所用單元說明:CH:存放當前讀取的字符,初值為空,LINE:為一維數組,其數組元素是字符;界對為1:80。用于讀入一行字符的緩沖區(qū);LL,CC:為計數器,初值為0;GETSYM流程圖的工作單元說明:A:一維數組,數組元素為字符,界對1:10;ID:同A;WORD:保留字,一維數組,數組元素為以字符為元素的一維數組。界對為1:13。查表方式采用二分法。五、實驗內容閱讀所給出的詞法分析程序(pl0_lexical.c),搞懂程序中每一個變量的含義,以及每一個過程的作用,并在該過程中進

5、行中文注釋;閱讀完程序后,畫出各過程的流程圖;給出的程序包含兩處輸入錯誤,利用所給的pl/0源程序(test.pl0)對程序進行調試,使其能正確對所給文件進行分析并能夠解釋運行;在閱讀懂所給出的詞法分析程序后,將你對詞法分析的理解寫在實驗報告上。下面簡要分析一下詞法分析程序的運行流程:主函數main():打開要分析的C源程序,若不能正確打開,則報錯。先從源程序中讀入一個字符ch,然后進行如下處理:1、ch是字符:轉入關鍵字和標識符處理子函數;2、ch是數字:轉入數字處理函數;3、ch是其他字符:轉入其他字符處理子函數;結束。關鍵字和標識符處理子函數alphaprocess(char buffe

6、r);1、將buffer送入臨時數組alphatp0,再讀入一個字符至buffer;2、判斷buffer是否為字符或數字,若是,則alphatp1=buffer;3、重復1,2,直到2判斷為假;在alphatp末尾添加'message';4、調用search()子函數,在關鍵字表中匹配alphatp,若匹配成功,則返回序號;5、調用search,在標識符表中匹配alphatp,若匹配成功,則返回序號;6、在標識符表中添加alphatp,并返回序號;源代碼:分析程序skh.c程序#include stdio.h main()printf("my name is 0806

7、1118 yuchaofeng");主程序:#include stdio.h#include ctype.h#include alloc.h#include stdlib.h#include string.h#define NULL 0FILE*fp;char cbuffer;char*key8="DO","BEGIN","ELSE","END","IF","THEN","VAR","WHILE";char*border6=&

8、quot;,",";",":=",".","(",")";char*arithmetic4="+","-","*","/";char*relation6="","=","=","","=","";char*consts20;char*label20;int constnum=0,label

9、num=0;int search(char searchchar,int wordtype)int i=0;switch(wordtype)case 1:for(i=0;i=7;i+)if(strcmp(keyi,searchchar)=0)return(i+1);case 2:for(i=0;i=5;i+)if(strcmp(borderi,searchchar)=0)return(i+1);return(0);case 3:for(i=0;i=3;i+)if(strcmp(arithmetici,searchchar)=0)return(i+1);return(0);case 4:for(

10、i=0;i=5;i+)if(strcmp(relationi,searchchar)=0)return(i+1);return(0);case 5:for(i=0;i=constnum;i+)if(strcmp(constsi,searchchar)=0)return(i+1);constsi-1=(char*)malloc(sizeof(searchchar);strcpy(constsi-1,searchchar);constnum+;return(i);case 6:for(i=0;i=labelnum;i+)if(strcmp(labeli,searchchar)=0)return(i

11、+1);labeli-1=(char*)malloc(sizeof(searchchar);strcpy(labeli-1,searchchar);labelnum+;return(i);char alphaprocess(char buffer)int atype;int i=-1;char alphatp20;while(isalpha(buffer)|(isdigit(buffer)alphatp+i=buffer;buffer=fgetc(fp);alphatpi+1='message';if(atype=search(alphatp,1)printf("%s

12、(1,%d)n",alphatp,atype-1);elseatype=search(alphatp,6);printf("%s(6,%d)n",alphatp,atype-1);return(buffer);char digitprocess(char buffer)int i=-1;char digittp20;int dtype;while(isdigit(buffer)digittp+i=buffer;buffer=fgetc(fp);digittpi+1='message';dtype=search(digittp,5);printf(&

13、quot;%s(5,%d)n",digittp,dtype-1);return(buffer);char otherprocess(char buffer)int i=-1;char othertp20;int otype,otypetp;othertp0=buffer;othertp1='message';if(otype=search(othertp,3)printf("%s(3,%d)n",othertp,otype-1);buffer=fgetc(fp);goto out;if(otype=search(othertp,4)buffer=f

14、getc(fp);othertp1=buffer;othertp2='message';if(otypetp=search(othertp,4)printf("%s(4,%d)n",othertp,otypetp-1);goto out;else othertp1='message';printf("%s(4,%d)n",othertp,otype-1);goto out;if(buffer=':')buffer=fgetc(fp);if(buffer='=')printf(":=

15、(2,2)n");buffer=fgetc(fp);goto out;elseif(otype=search(othertp,2)printf("%s(2,%d)n",othertp,otype-1);buffer=fgetc(fp);goto out;if(buffer!='n')&&(buffer!='')printf("%c error,not awordn",buffer);buffer=fgetc(fp);out:return(buffer);void main()int i;for(i=0;i=20;i+)labeli=NULL;constsi=NULL;if(fp=fopen("skh.c","r")=NULL)printf("error");elsecbuffer=fgetc(fp);while(cbuffer!=EOF)if(isalpha(cbuffer)cbuffer=alphaprocess(cbuffer);else if(isdigit(cbuffer)cb

溫馨提示

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

評論

0/150

提交評論