一、        实验目的

(1)    理解词法分析在编译程序中的作用。

(2)    加深对有穷自动机模型的理解。

(3)    掌握词法分析程序的实现方法。

(4)    用C语言对一个简单语言的子集编制一个一遍扫锚的编译理解,掌握编译程序的实现方法和技术。

二、        实验内容和要求

1,待分析的简单语言的词法

2,各种单词符号对应的种别码。

3,词法分析程序的功能(输入,输出)。

三、        实验方法、步骤及结果测试

1.      源程序名:压缩包文件(rarzip)中源程序名: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 }
  1. 4.      运行结果及分析

一般必须配运行结果截图,结果是否符合预期及其分析。

  

四、实验总结

这次实验很有难度,一开始刚看到题目,毫无头绪,完全不知道是要干什么的,之后不断的上网查,问同学,开始理解题目,开始知道目的,在队友的帮助下,也开始知道怎么编写。在本次实验中我认识到程序不经常编译,水平只会降低。好多关于之前的知识也会逐渐忘掉。所以以后我会经常写程序,理解程序的内涵。经过多次检测,多次修改,多尝试各种方法,最终编写出来,虽然题目是做出来了,但是仍然存在很多漏洞,以后我会继续努力,学会从多角度思考!

 

posted on 2016-10-14 17:38  115叶霆毅  阅读(2033)  评论(4编辑  收藏  举报