编译原理词法分析实验报告(此文章在管理发表文章 里也有) 159

实验一、词法分析实验

                                 专业:信息技术与工程学院   姓名:吕军  学号:201506110159

   一、        实验目的

 

         目的:主要是为了编辑一个词法分析程序。了解计算机的识别源程序字符串的过程。

二、        实验内容和要求

 

        实验内容:通过了解 各种单词符号对应的种别码表,编写一个简单的词法分析程序,通过计算机识别字符串,反映其中的单词符号和所对应的种别码。

        实验要求:用户输入源程序字符串,输出:二元组(种别,单词本身)

         

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

         1.      源程序名:简单的词法分析.c

                  可执行程序名:D:\Debug\简单的词法分析.exe

                 

        2.      原理分析及流程图

        主要总体设计问题:

  1. 该用什么方式录入用户所输入的字符串。
  2. 该用什么方法去实现 识别这字符串的内容。怎么区别,识别,字符和关键字。
  3. 程序的便利问题。

          程序原理分析:

         我所写的仅仅只是十几个,二十多个字符识别的程序,所以我所用的存储结构是:以getchar从键盘录入,存入字符数组中。

         主要算法:运用循环语句,使用switch case语句,一个个去识别是否对应得上字符串里的内容。

        关键函数:getchar   switch case

        流程图:

            

                        

                        

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

1.  while(ch!='\n')

      {

        ch=getchar();                   //字符串的录入与放存

        entry[i]=ch;

        i++;

       } 

  

  for(j=0;j<i-1;j++)
  {
    switch(entry[j])
    {
        case '+': printf("%c               13 \n",entry[j]);
                  break;
        case '-': printf("%c               14 \n",entry[j]);
                  break;
        case '*': printf("%c               15 \n",entry[j]);
                  break;
        case '/': printf("%c               16 \n",entry[j]);
                  break;
        case ':':
                  ch2=entry[j+1];
                  if(ch2=='=')
                  {
                  printf("%c%c              18\n",entry[j],entry[j+1]);
                  j=j+1;
                  }
                  else
                  printf("%c               17\n",entry[j]);
                  break;
        case '<':
                  ch2=entry[j+1];
                  if(ch2=='=')
                  {
                  printf("%c%c              21 \n",entry[j],entry[j+1]);
                  j=j+1;
                  }
                  else if(ch2=='>')
                  {
                  printf("%c%c              22 \n",entry[j],entry[j+1]);
                  j=j+1;
                  }
                  else
                  printf("%c               20 \n",entry[j]);
                  break;
        case '>':
                  ch2=entry[j+1];
                  if(ch2=='=')
                  {
                  printf("%c%c              24\n",entry[j],entry[j+1]);
                  j=j+1;
                  }
                  else
                  printf("%c              23\n",entry[j]);
                  break;
        case '=': printf("%c               25\n",entry[j]);
                  break;
        case ';': printf("%c               26 \n",entry[j]);
                  break;
           case '(': printf("%c               27 \n",entry[j]);
                  break;
         case ')': printf("%c               28 \n",entry[j]);
                  break;
        case '#': printf("%c               0\n",entry[j]);
                  break;
        case 'b':
                  if(entry[j+1]=='e'&&entry[j+2]=='g'&&entry[j+3]=='i'&&entry[j+4]=='n')
                  {
                    printf("begin           1\n");
                    j=j+4;
                  }
                  else
                  printf("未能识别        %c      这个单词符号     \n",entry[j]);
                  break;

        case 'i':   if(entry[j+1]=='f')
                    {
                    printf("if              2\n",entry[j]);
                    j=j+1;
                    }
                    else
                    printf("未能识别        %c        这个单词符号     \n",entry[j]);
                    break;

        case 't':
                      if(entry[j+1]=='h'&&entry[j+2]=='e'&&entry[j+3]=='n')
                      {
                      printf("then            3\n");
                      j=j+3;
                      }
                      else
                      printf("未能识别        %c         这个单词符号     \n",entry[j]);
                      break;

        case 'w':
                      if(entry[j+1]=='h'&&entry[j+2]=='i'&&entry[j+3]=='l'&&entry[j+4]=='e')
                      {
                      printf("while           4\n");
                      j=j+4;
                      }
                      else
                      printf("未能识别        %c          这个单词符号     \n",entry[j]);
                      break;


        case 'd':   if(entry[j+1]=='o')
                    {
                    printf("do              5\n ");
                    j=j+1;
                    }
                    else if(entry[j+1]=='i'&&entry[j+2]=='g'&&entry[j+3]=='h'&&entry[j+4]=='t')
                    {
                       printf("dight            11\n");
                       j=j+4;
                    }
                    else
                    printf("未能识别        %c           这个单词符号     \n",entry[j]);
                    break;

        case 'e': if(entry[j+1]=='n'&&entry[j+2]=='d')
                     {
                    printf("end              6\n");
                    j=j+2;
                     }
                    else
                    printf("未能识别        %c         这个单词符号     \n",entry[j]);
                    break;


        case 'l':
                      if(entry[j+1]=='e'&&entry[j+2]=='t'&&entry[j+3]=='t'&&entry[j+4]=='e'&&entry[j+5]=='r')
                      {
                      printf("letter          10 \n");
                      j=j+5;
                      }
                      else
                      printf("未能识别         %c         这个单词符号     \n",entry[j]);
                      break;

        default :
                      printf("未能识别         %c         这个字符     \n",  entry[j]);

    }
               //这一大段是将已知道的字符,对用户输入里的关键单词进行识别

  

      4.      运行结果及分析

          

            分析:我觉得程序还做得不太好,排版还是有些问题。

          四、        实验总结

     心得体会:

难点:1.用户输入字符串存储的问题,我考虑过用getchar直接录入,也考虑过用数组,和单链表,最终我选择了字符数组,因为将用户录入的字符串放在数组里更容易操作,当然,其他两种更加简便,不过我还没想出怎么去用,因为在选择用getchar和单链表的时候都会遇到一些问题。

     2.用什么方法去识别,去输出的问题。我想到的是用switch case的判断语句去实现的,不过这样很麻烦,而且工程量大,仅仅只适合于比较小规模的字符判别。如果字符判别类型过多,需要些很多的case语句。很麻烦。所以我写的只是简单的词法分析程序。而我看过我同学所写的程序,他写的很详细,他运用到了数组函数,用到了许多if else 和switch case语句,我觉得他那样写简便很多,而且他写的是判断标识符,界符的程序,如果添加其它的,可以简便的添加。我的太麻烦了。

解决方案:1.查阅书籍。

              2.向C语言厉害的同学请教。

              3.网络搜索,看看别人是怎么写的。有没有值得参考的地方。

原文地址:https://www.cnblogs.com/tiankongyiluozhiwu/p/5960612.html