实验报告

实验一、词法分析实验

商软   伍思敏  201506110249

一、        实验目的

 

    编制一个词法分析程序

二、        实验内容和要求

     输入:源程序字符串

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

词法分析程序的主要任务:

1.对字符串表示的源程序 

2.从左到右进行扫描和分解

3.根据词法规则

4.识别出一个一个具有独立意义的单词符号

5.以供语法分析之用

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

 

  1. 1.      源程序名:压缩包文件(rarzip
  2. 2.      中源程序名词法分析.c

可执行程序名:词法分析.exe

  1. 3.      原理分析及流程图

主要总体设计问题。

(包括存储结构,主要算法,关键函数的实现等)

char charp[80];                   //存放所有输入的字符

char token[8];                   //单词自身字符串

char ch;                        //单个字符

char*rwtab[6]={"begin","if","then","while","do","end"};

int sym;                      //sym:单词种别码

int s=0,m=0,i=0,w=0,sum=0;   //sum:整型常数

void main()

{

    printf("请输入一串字符串(以输入#号作为结束):");

    do

    {

        ch=getchar();    //ch获取键盘输入的字符

        charp[i++]=ch;   //把字符一个个放在charp数组中

    }while(ch!='#');      //输入以#号键结束

do

{

  analyze();   //识别单词

  switch(sym)

  {

    case -1:

        printf(" 错误 : w %d!\n",w);

        break;

    case -2:

        w=w++;break;

    case 11:

        printf("(%d,%d)\n",sym,sum);

        break;

    default:

        printf("(%d,%s)\n",sym,token);

        break;

  }

}while(sym!=0);

}

 

 
   
  1. 4.      主要程序段及其解释:

实现主要功能的程序段,重要的是程序的注释解释。

void analyze()

{

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

        token[i]=NULL;

        ch=charp[s++];

    while(ch==' ')

    {

        ch=charp[s];

        s++;

    }

    if((ch>='0'&&ch<='9'))  //分析数字

    {

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

            {

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

                ch=charp[s++];

            }

            s--;

            sym=11;

            if(sum>32767)

                sym=-1;

    }

    else if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z'))   //分析标识符或者变量名

    {

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

        {

            token[m++]=ch;

            ch=charp[s++];

        }

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

            s--;

            sym=10;

            for(i=0;i<6;i++)   //将识别出来的字符和已定义的标示符作比较,

            if(strcmp(token,rwtab[i])==0)

            {

                sym=i+1;

                break;

            }

    }

    else switch(ch)//分析其他字符

    {

     case'<':m=0;token[m++]=ch;

        ch=charp[s++];

        if(ch=='=')

        {

            sym=21;

            token[m++]=ch;

        }

        else if(ch=='>')

        {

            sym=22;

            token[m++]=ch;

        }

        else

        {

            sym=23;

            s--;

        }

        break;

    case'>':m=0;token[m++]=ch;

       ch=charp[s++];

       if(ch=='=')

       {

           sym=24;

           token[m++]=ch;

       }

       else

       {

           sym=20;

           s--;

       }

       break;

    case':':m=0;token[m++]=ch;

       ch=charp[s++];

       if(ch=='=')

       {

           sym=18;

           token[m++]=ch;

       }

       else

       {

           sym=17;

           s--;

       }

       break;

        case'*':

            sym=13;token[0]=ch;

            break;

        case'/':

            sym=14;token[0]=ch;

            break;

        case'+':

            sym=15;token[0]=ch;

            break;

        case'-':

            sym=16;token[0]=ch;

            break;

        case'=':

            sym=25;token[0]=ch;

            break;

        case';':

            sym=26;token[0]=ch;

            break;

        case'(':

              sym=27;token[0]=ch;

              break;

        case')':

            sym=28;token[0]=ch;

            break;

        case'#':

            sym=0;token[0]=ch;

            break;

        case'\n':

            sym=-2;

            break;

        default:

            sym=-1;

            break;

    }

}

  1. 5.      运行结果及分析

一般必须配运行结果截图,结果是否符合预期及其分析。

   (截图需根据实际,截取有代表性的测试例子)

 

 

 

 

 

四、        实验总结

心得体会,实验过程的难点问题及其解决的方法。

第一次接触编译原理有很多东西都是不会和不知道,在这次作业中很多东西不知道,知道要写词法分析的作业的时候我是一脸茫然不知道怎么写才好,和怎么开始写,在网上搜了很多关于编译原理的东西和知道点,看了资料后还是不知道怎么写和词法分析是写关于什么知识方面的,但是后来慢慢接触了,了解到一些知识,慢慢知道更多,希望以后能了解更多。

 

 

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/candyxue/p/5958307.html