zoukankan      html  css  js  c++  java
  • 实验报告一 词法分析程序

    实验一、词法分析程序实验

    专业:商业软件工程   姓名:卓润峰  学号:201506110202

    一、        实验目的

    编制一个词法分析程序。

    二、        实验内容和要求

    1.输入:源程序字符串。

    2.输出:二元组(种别,单词本身)

    3.待分析语言的词法规则

    主要是从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用于语法分析

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

    1.     源程序名:压缩包文件(rarzip)中源程序名 cifafenxi.c

    可执行程序名:cifafenxi.exe

    2.     原理分析及流程图

     

    3.     主要程序段及其解释:

      1 #include<stdio.h>
      2 
      3 #include<string.h>
      4 
      5 char one[9][10]={"begin","if","then","while","do","end","main","int","char"};
      6 
      7 int number;
      8 
      9  
     10 
     11 int fenxi(char a[],int p)
     12 
     13 {
     14 
     15     char b[10];
     16 
     17     int i=0,j=1,q;
     18 
     19     b[0]=a[0];
     20 
     21     printf("
    ");
     22 
     23     if((b[0]>='a'&&b[0]<='z')||(b[0]>='A'&&b[0]<='Z'))
     24 
     25     {
     26 
     27         for(j=1;j<10;j++)
     28 
     29             {
     30 
     31                 b[j]=a[j];
     32 
     33                 if(b[j]==' ')
     34 
     35                 {
     36 
     37                     b[j]='';
     38 
     39                     p=j;
     40 
     41                     break;
     42 
     43                 }
     44 
     45             }
     46 
     47             for(j=0;j<9;j++)
     48 
     49                 if(strcmp(b,one[j])==0)
     50 
     51                 {
     52 
     53                     printf("(%d,%s)",j+1,b);
     54 
     55                     q=0;
     56 
     57                     return p;
     58 
     59                 }
     60 
     61                 else
     62 
     63                     q=1;
     64 
     65             if(q==1)
     66 
     67             {
     68 
     69                 printf("(10,%s)",b);
     70 
     71                 return p;
     72 
     73             }
     74 
     75  
     76 
     77         }
     78 
     79         if((b[0]>=48)&&(b[0]<=57))
     80 
     81         {
     82 
     83             for(j=1;j<10;j++)
     84 
     85             {
     86 
     87                 b[j]=a[j];
     88 
     89                 if(b[j]==' ')
     90 
     91                 {
     92 
     93                     b[j]='';
     94 
     95                     p=j;
     96 
     97                     printf("(11,%s)",b);
     98 
     99                     return p;
    100 
    101                 }
    102 
    103             }
    104 
    105         }
    106 
    107         if((b[0]=='+')||(b[0]=='-')||(b[0]=='*')||(b[0]=='/')||(b[0]=='=')||(b[0]=='(')||(b[0]==')')||(b[0]=='#'))
    108 
    109         {
    110 
    111             b[1]=a[1];
    112 
    113             if(b[1]==' ')
    114 
    115             {
    116 
    117                  p=1;
    118 
    119                  b[1]='';
    120 
    121             }
    122 
    123             switch(b[0])
    124 
    125             {
    126 
    127             case '+':j=13;break;
    128 
    129             case '-':j=14;break;
    130 
    131             case '*':j=15;break;
    132 
    133             case '/':j=16;break;
    134 
    135             case '=':j=25;break;
    136 
    137             case ';':j=26;break;
    138 
    139             case '(':j=27;break;
    140 
    141             case ')':j=28;break;
    142 
    143             case '#':j=0;break;
    144 
    145             }
    146 
    147             printf("(%d,%s)",j,b);
    148 
    149             return p;
    150 
    151         }
    152 
    153         if((b[0]==':')||(b[0]=='>')||(b[0]=='<'))
    154 
    155         {
    156 
    157             b[1]=a[1];
    158 
    159             if((b[1]!='=')&&(b[1]!='>')&&(b[1]!='<')&&(b[1]==' '))
    160 
    161             {
    162 
    163  
    164 
    165                 p=1;
    166 
    167                 b[1]='';
    168 
    169                 switch(b[0])
    170 
    171                 {
    172 
    173                 case ':':j=17;break;
    174 
    175                 case '<':j=20;break;
    176 
    177                 case '>':j=23;break;
    178 
    179                 }
    180 
    181                 printf("(%d,%s)",j,b);
    182 
    183                 return p;
    184 
    185             }
    186 
    187             else
    188 
    189             {
    190 
    191                 b[1]=a[1];
    192 
    193                 b[2]='';
    194 
    195                 p=2;
    196 
    197                 if((b[0]==':')&&(b[1]=='='))j=18;
    198 
    199                 else if((b[0]=='<')&&(b[1]=='='))j=21;
    200 
    201                 else if((b[0]=='>')&&(b[1]=='='))j=24;
    202 
    203                 else if((b[0]=='<')&&(b[1]=='>'))j=22;
    204 
    205                 printf("(%d,%s)",j,b);
    206 
    207                 return p;
    208 
    209             }
    210 
    211         }
    212 
    213  
    214 
    215 }
    216 
    217  
    218 
    219 void maopao(char a[],int p)
    220 
    221 {
    222 
    223     int i;
    224 
    225     for(i=0;a[i]!='';i++)
    226 
    227         a[i]=a[p+i+1];
    228 
    229 }
    230 
    231  
    232 
    233 main()
    234 
    235 {
    236 
    237     char a[100];
    238 
    239     int p;
    240 
    241     printf("请输入一段程序(空格后回车结尾):");
    242 
    243  
    244 
    245     gets(a);
    246 
    247     do
    248 
    249     {
    250 
    251         p=fenxi(a,p);
    252 
    253         maopao(a,p);
    254 
    255     }while(a[0]!='');
    256 
    257 }

    4.     运行结果及分析

    四、        实验总结

    这是编译原理这门课的开始程序,讲真看这门课真的跟天书一样,很多东西都是很难理解的,很抽象,像这个词法编译器,是老师讲了很久才懂得原理,很多功能还不是很完善,有许多要改进的地方,也有很多的BUG,想了很久也很难解决问题,不过最后还是完成了这个程序,学到了很多知识,也复习了大一所学的c语言许多语法。

    实验问题:

           1.不知道该如何判断每一个单元的词法。

           2.如何不断地进行词法分析,如何结束。

    解决方案:

           1.定义一个新的数组,并将原字符串读到空格后赋值给这个新的数组,然后对这个新数组中存储的字符串进行判断。

           2.利用循环,每判断一次,就将之前判断的单元删除,另后面的字符串浮到上面来继续进行判断,直到原字符串剩下‘’,退出循环。

  • 相关阅读:
    K2 BPM介绍(2)
    K2 BPM介绍(1)
    认识BPM
    使用VS Code发布博客
    IIS 使用 HTTP/2
    IIS 8的第一次请求不变慢如何配置
    C# 图片识别技术(支持21种语言,提取图片中的文字)
    第九讲 C#练习题
    c#基础 第八讲
    c#基础 第六讲
  • 原文地址:https://www.cnblogs.com/zzrf/p/5954298.html
Copyright © 2011-2022 走看看