词法分析

 

4.运行结果及分析

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

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

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

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

#include<stdio.h>

#include<string.h>

#include<iostream>

char pro[80],gain[8];

char ch;

int syn,p,m=0,n,row,sum=0;

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

 void scaner()

{

    for(n=0;n<8;n++) gain[n]=NULL; 

    ch=pro[p++];  /将数组中的字符逐个取出/

    while(ch==' ')

    {

        ch=pro[p];

        p++;

    }

if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))  /对输入的字符串的a~zA~Z进行识别/ 

    {

        m=0;

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

        {

            gain[m++]=ch;

            ch=pro[p++];

        }

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

        p--;

        syn=10;/当字符为a~zA~Z0~9时,syn10/

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

            if(strcmp(gain,rwtab[n])==0) 

            {

                syn=n+1;//得出相应种别

                break;

            }

    }

    else if((ch>='0'&&ch<='9'))  //数字    {

        {

            sum=0;

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

            {

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

                ch=pro[p++];

            }

        }

        p--;

        syn=11;

        if(sum>100000)

            syn=-1;

    }

    else switch(ch)   //其他字符     {

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

            ch=pro[p++];

            if(ch=='>')

            {

                syn=21;

                gain[m++]=ch;

            }

            else if(ch=='=')

            {

                syn=22;

                gain[m++]=ch;

            }

            else

            {

                syn=23;

                p--;

            }

            break;

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

            ch=pro[p++];

            if(ch=='=')

            {

                syn=24;

                gain[m++]=ch;

            }

            else

            {

                syn=20;

                p--;

            }

            break;

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

            ch=pro[p++];

            if(ch=='=')

            {

                syn=18;

                gain[m++]=ch;

            }

            else

            {

                syn=17;

                p--;

            }

            break;

        case'*':syn=13;token[0]=ch;break;

        case'/':syn=14;token[0]=ch;break;

        case'+':syn=15;token[0]=ch;break;

        case'-':syn=16;token[0]=ch;break;

        case'=':syn=25;token[0]=ch;break;

        case';':syn=26;token[0]=ch;break;

        case'(':syn=27;token[0]=ch;break;

        case')':syn=28;token[0]=ch;break;

        case'#':syn=0;token[0]=ch;break;

        case'\n':syn=-2;break;

        default: syn=-1;break;

    }

}

int main()

{

    p=0;

    row=1;

    cout<<"Please input string:"<<endl;

    do

    {

        cin.get(ch);

        pro[p++]=ch; /ch录入数组中/

    }

    while(ch!='#');   /*输入分析的词*/

    p=0;

    do

    {

        scaner(); /*对每个字符进行分析返回syn值,确定种别*/

        switch(syn)

        {

        case 11: cout<<"("<<syn<<","<<sum<<")"<<endl; break;  

        case -1: cout<<"Error in row "<<row<<"!"<<endl; break;

        case -2: row=row++;break;

        default: cout<<"("<<syn<<","<<token<<")"<<endl;break;

        }

    }

    while (syn!=0);/当函数返回syn=0时,结束!/

}

 

 

四、实验总结

 

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

    通过这次实验,让我加深了对词法分析的理解,一开始的时候有点明白,但是不知如何完成实验,通过上网查阅资料,并对其研究与理解,明白了怎么完成这个实验,在这个实验的过程中,我深刻地理解了词法分析的意义与作用,使我得到了很大的锻炼。

posted on 2016-10-13 20:49  hasbb  阅读(469)  评论(0编辑  收藏  举报

导航