zoukankan      html  css  js  c++  java
  • 编译原理词法分析实验报告(此文章在管理发表文章 里也有) 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.网络搜索,看看别人是怎么写的。有没有值得参考的地方。

  • 相关阅读:
    在请求中使用XML Publisher生成文件报错
    Oracle Sourcing Implementation and Administration Guide(转)
    API To Import Negotiations(转)
    使用POI动态更新导出的EXCEL模板中的列
    使用POI设置导出的EXCEL锁定指定的单元格
    QML获取随机颜色
    Access导出excel
    Component
    QML中打印
    Qt Quick Dialogs
  • 原文地址:https://www.cnblogs.com/tiankongyiluozhiwu/p/5960612.html
Copyright © 2011-2022 走看看