一、 实验目的
(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. 运行结果及分析
一般必须配运行结果截图,结果是否符合预期及其分析。
四、实验总结
这次实验很有难度,一开始刚看到题目,毫无头绪,完全不知道是要干什么的,之后不断的上网查,问同学,开始理解题目,开始知道目的,在队友的帮助下,也开始知道怎么编写。在本次实验中我认识到程序不经常编译,水平只会降低。好多关于之前的知识也会逐渐忘掉。所以以后我会经常写程序,理解程序的内涵。经过多次检测,多次修改,多尝试各种方法,最终编写出来,虽然题目是做出来了,但是仍然存在很多漏洞,以后我会继续努力,学会从多角度思考!