• 实验一词法分析实验报告


    一、        实验目的

    (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.      运行结果及分析

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

      

    四、实验总结

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

     

  • 相关阅读:
    HDU1542矩形面积并
    HDU5869树状数组+gcd预处理
    HDU5845 Best Division
    整体二分
    Lattice 的 Framebuffer IP核使用调试笔记之datasheet笔记
    DDR3详解(以Micron MT41J128M8 1Gb DDR3 SDRAM为例)
    ISD1700系列多段语音录放系列
    Lattice Diamond 学习之编译、检查和设置约束
    欧拉函数的几个性质及证明
    CF776B Sherlock and his girlfriend
  • 原文地址:https://www.cnblogs.com/darkhate/p/5961396.html
Copyright © 2020-2023  润新知