实验报告一 词法分析程序

实验一  词法分析实验

专业:商业软件工程     姓名:陈冠中    学号: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.运行结果及分析

 

 

四、        实验总结

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

 

 

原文地址:https://www.cnblogs.com/cgz123/p/5955578.html