一、 實驗目的
(1) 理解詞法分析在編譯程序中的作用。
(2) 加深對有窮自動機模型的理解。
(3) 掌握詞法分析程序的實現方法。
(4) 用C語言對一個簡單語言的子集編制一個一遍掃錨的編譯理解,掌握編譯程序的實現方法和技術。
二、 實驗內容和要求
1,待分析的簡單語言的詞法
2,各種單詞符號對應的種別碼。
3,詞法分析程序的功能(輸入,輸出)。
三、 實驗方法、步驟及結果測試
1. 源程序名:壓縮包文件(rar或zip)中源程序名:CIFENXI.c
可執行程序名:CIFAFEN.exe
2.原理分析及流程圖
主要程序段及其解釋:
1 # include<stdio.h> 2 # include<stdlib.h> 3 # include<string.h> 4 5 int panduan(char tmp[]) 6 { 7 char b[6][10] = {"begin", "if", "then", "while", "do", "end", }; 8 int k = 0; 9 10 while(k < 6) // 臨時變量tmp 與 字符串b[k] 進行比較 11 { 12 if(strcmp(tmp, b[k]) == 0) 13 { 14 printf("<%s, %d>\n", tmp, k+1); 15 return 0; 16 } 17 k++; 18 } 19 printf("<%s, 10>\n", tmp); 20 21 return 0; 22 } 23 24 void cifafenxi(char a[]) 25 { 26 int i = 0, j = 0; 27 char tmp[10]; 28 int flag = 0; 29 30 while(a[i] != '\0') 31 { 32 if(a[i] >= 'a' && a[i] <= 'z') // 判斷標識符 33 { 34 tmp[j] = a[i]; 35 j++; 36 while((a[i+1] >= 'a' && a[i+1] <= 'z') || (a[i+1] >= '0' && a[i+1] <= '9')) 37 { 38 i++; 39 tmp[j] = a[i]; 40 j++; 41 } 42 tmp[j] = '\0'; 43 j = panduan(tmp); 44 } 45 46 if(a[i] >= '0' && a[i] <= '9') // 判斷數字 47 { 48 tmp[j] = a[i]; 49 j++; 50 while(a[i+1] >= '0' && a[i+1] <= '9') 51 { 52 i++; 53 tmp[j] = a[i]; 54 j++; 55 } 56 tmp[j] = '\0'; 57 printf("<%s, 11>\n", tmp); 58 j = 0; 59 } 60 61 switch(a[i]) // 判斷符號 62 { 63 case '+':printf("<+, 13>\n");break; 64 case '-':printf("<-, 14>\n");break; 65 case '*':printf("<*, 15>\n");break; 66 case '/':printf("</, 16>\n");break; 67 case ':': 68 { 69 if(a[i+1] == '=') 70 printf("<:=, 18>\n"); 71 else 72 printf("<:, 17>\n"); 73 }break; 74 case '<': 75 { 76 if(a[i+1] == '=') 77 printf("<<=, 21>\n"); 78 else if(a[i+1] == '>') 79 printf("<<>, 22>\n"); 80 else 81 printf("<<, 20>\n"); 82 }break; 83 case '>': 84 { 85 if(a[i+1] == '=') 86 printf("<>=, 24>\n"); 87 else 88 printf("<>, 23>\n"); 89 }break; 90 case '=':printf("<=, 25>\n");break; 91 case ';':printf("<;, 26>\n");break; 92 case '(':printf("<(, 27>\n");break; 93 case ')':printf("<), 28>\n");break; 94 case '#':printf("<#, 0>\n");break; 95 } 96 97 i++; 98 } 99 } 100 101 int main(void) 102 { 103 char a[300]; 104 105 printf("input : "); 106 gets(a); 107 cifafenxi(a); 108 109 return 0; 110 }
- 4. 運行結果及分析
一般必須配運行結果截圖,結果是否符合預期及其分析。
四、實驗總結
這次實驗很有難度,一開始剛看到題目,毫無頭緒,完全不知道是要干什么的,之后不斷的上網查,問同學,開始理解題目,開始知道目的,在隊友的幫助下,也開始知道怎么編寫。在本次實驗中我認識到程序不經常編譯,水平只會降低。好多關於之前的知識也會逐漸忘掉。所以以后我會經常寫程序,理解程序的內涵。經過多次檢測,多次修改,多嘗試各種方法,最終編寫出來,雖然題目是做出來了,但是仍然存在很多漏洞,以后我會繼續努力,學會從多角度思考!