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

Posted 天空遗落之物

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译原理--词法分析--实验报告(此文章在管理-发表文章 里也有)相关的知识,希望对你有一定的参考价值。

实验一、词法分析实验

                                 专业:信息技术与工程学院   姓名:吕军  学号: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.网络搜索,看看别人是怎么写的。有没有值得参考的地方。

以上是关于编译原理--词法分析--实验报告(此文章在管理-发表文章 里也有)的主要内容,如果未能解决你的问题,请参考以下文章

编译原理的实验报告一

编译原理 实验一 java语言实现对C语言词法分析

编译原理 实验一 java语言实现对C语言词法分析

实验一词法分析试验报告

lex实现扩展的pl0语言的词法分析器(附源码)

实验一 词法分析器+编译原理