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

    实验一  词法分析实验

    专业:商业软件工程     姓名:陈冠中    学号:201506110195

    一、        实验目的

      词法分析程序完成的是编译第一阶段的工作。词法分析工作是把字符流的源程序变为单词序列,输出到一个中间文件,这个文件作为语法分析程序的输入而继续编译过程。而该实验就是设计一个简单的词法分析程序,通过编制一个程序来完成转换。

    二、        实验内容和要求

    实验要求:

    1.输入:源程序字符串

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

    实验内容:

    对字符串表示的源程序

    从左到右进行扫描和分解

    根据词法规则,识别出一个个具有独立意义的单词符号以供语法分析之用

    发现词法错误,则返回出错信息

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

    1.词法分析程序.c

    词法分析程序.exe

     

    2.原理分析及流程图

    从录入程序字符串,调用scaner函数 ,读取字符串中的数据,通过判断空格或回车前的单元,进行词法分析,最后以二元组形式输出。

     

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

    void scaner()

     { 

           sum=0;

        for(m=0;m<8;m++)

            t[m++]=NULL;

        ch=c[p++];

        m=0;

        while((ch==' ')||(ch=='\n'))

        ch=c[p++];

        if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))

          {

          while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))

          {

                    t[m++]=ch;

              ch=c[p++];

          }

          p--;

          s=10;

    //这段代码是在输入一段源程序后,程序对于里面数字和英文单独判断,输出s。

    t[m++]=’\0’;

    //这里是程序在输入后的字符串进行确定,不进行操作会使程序出错,在输出过程中进行随意分配。

          for(n=0;n<6;n++)

        if(strcmp(t,w[n])==0)

           {

                  s=n+1;

             break;

           }

          }

        else if((ch>='0')&&(ch<='9'))

          {

                  while((ch>='0')&&(ch<='9'))

                  { sum=sum*10+ch-'0';

              ch=c[p++];

                  }

        p--;

    s=11;

    //在对输入的源程序判断时,输入的不在范围的程序段时,输出s

          }

        else switch(ch)

        {

         case '<':t[m++]=ch;

              ch=c[p++];

                     if(ch=='>')

                {  s=22;

                   t[m++]=ch;

                }

              else

                {

                           s=20;

                   p--;

                    }

                  if(ch=='=')

                {  s=21;

                   t[m++]=ch;

                }

                          

              break;

         case '>':t[m++]=ch;

              ch=c[p++];

              if(ch=='=')

                { s=24;

                  t[m++]=ch;

                }

              else

                { s=23;

                  p--;

                }

              break;

         case '+': s=13;

                 t[m++]=ch;

                 break;

         case '-':

                s=14;

                t[m++]=ch; 

              break;

         case '!':ch=c[p++];

              if(ch=='=')

               { s=30;

                 t[m++]=ch;

               }

              else

              { s=31;

                 p--;

              }

              break;

         case '=':

                s=25;

                t[m++]=ch;

                break;

         case '*': s=15;

               t[m++]=ch;        

                     break;

         case '/': s=16;

               t[m++]=ch;

               break;

         case '(': s=27;

               t[m++]=ch;

               break;

         case ')': s=28;

               t[m++]=ch;

               break;

         case '{': s=5;

               t[m++]=ch;

               break;

         case '}': s=6;

               t[m++]=ch;

               break;

         case ';': s=26;

              t[m++]=ch;

              break;

         case '\"': s=32;

               t[m++]=ch;

               break;

         case '#': s=0;

               t[m++]=ch;

               break;

         case ':':t[m++]=ch;

              ch=c[p++];

               if(ch=='=')

                {  s=18;

                   t[m++]=ch;

                }

                     else

              { s=17;

                 p--;

                    }

               break;

        default: s=-1;

             break;

           }

              t[m++]='\0';

      }

    4.运行结果及分析

     

     

    四、        实验总结

    在看到词法分析这个实验时,对于词法分析的这个含义还不是很清楚,对于老师布置这个作业的意义也不清楚。在看到书上对于词法分析的讲解时,才明白词法分析是整个编译的第一阶段工作,可以说好的词法分析程序会让之后的编译工作变得更轻松。在参考了一些词法分析程序后,对于词法分析程序中的侧重点也有所了解,特别是对于一段源程序的存储与判断,最后与种别表进行相应的对比,这是简单的词法分析过程。在自己实现这个代码时,印象最深的是在对于分界符的判断时,在两个以上的一起判断时,就会出现单个分界符的错误输出,在经过一系列的错误尝试后,最后正确输出。可以说这个词法分析程序结合许多不同的方法,最终得到的简单可行的程序。

     

     

  • 相关阅读:
    HDU 1114 Piggy-Bank
    HDU 2955 Robberies
    NTOJ 290 动物统计(加强版)
    POJ 3624 Charm Bracelet
    HDU 2602 Bone Collector
    POJ 1523 SPF(无向图割顶)
    HDU 5311 Hidden String
    HDU 1421 搬寝室
    HDU 1058 Humble Numbers
    POJ 3259 Wormholes(spfa判负环)
  • 原文地址:https://www.cnblogs.com/cgz123/p/5955578.html
Copyright © 2011-2022 走看看