• 实验一、词法分析程序实验


    实验一、词法分析实验

    专业:商业软件工程3班   姓名:张德标  学号:201506110200

    一、        实验目的

    编制一个词法分析程序

    二、        实验内容和要求

    内容:对字符串表示的源程序,从左到右进行扫描和分解,根据词法规则,识别出一个一个具有独立意义的单词符号以供语法分析只用,发现语法错误,则返回出错信息

    要求:输入源程序字符串,输出二元组(种别,单词符号本身)

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

     1.     源程序名

    2.     原理分析及流程图

    主要总体设计问题。

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

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

    #include<stdio.h>

    #include<string.h>

    void fengxi();

    char a[80],b[8];

    char ch;

    int p,x,y,i,k,m=0,r;

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

    void fengxi()    //主要实现词法分析的函数

    {

        for(i=0;i<8;i++) b[i]=NULL;

        ch=a[p++];

        while(ch==' ')

        {

            ch=a[p];

            p++;

        }

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

        {

            m=0;

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

            {

                b[m++]=ch;

                ch=a[p++];

            }

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

            p--;

            x=10;

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

                if(strcmp(b,c[i])==0)

                {

                    x=i+1;

                    break;

                }

        }

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

        {

            {

                y=0;

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

                {

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

                    ch=a[p++];

                }

            }

            p--;

            x=11;

            if(y>32767)  //整数的最大范围比较

                x=-1;

        }

         else switch(ch)  // 其他字符

        {

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

                ch=a[p++];

                if(ch=='>')

                {

                    x=21;

                    b[m++]=ch;

                }

                else if(ch=='=')

                {

                    x=22;

                    b[m++]=ch;

                }

                else

                {

                    x=23;

                    p--;

                }

                break;

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

                ch=a[p++];

                if(ch=='=')

                {

                    x=24;

                    b[m++]=ch;

                }

                else

                {

                    x=20;

                    p--;

                }

                break;

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

                ch=a[p++];

                if(ch=='=')

                {

                    x=18;

                    b[m++]=ch;

                }

                else

                {

                    x=17;

                    p--;

                }

                break;

            case'*':x=13;b[0]=ch;break;

            case'/':x=14;b[0]=ch;break;

            case'+':x=15;b[0]=ch;break;

            case'-':x=16;b[0]=ch;break;

            case'=':x=25;b[0]=ch;break;

            case';':x=26;b[0]=ch;break;

            case'(':x=27;b[0]=ch;break;

            case')':x=28;b[0]=ch;break;

            case'#':x=0;b[0]=ch;break;

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

            default: x=-1;break;

        }

    }

    main()  //主函数

    {

        p=0;

        r=1;

        printf("Please input string:\n");

        do

        {

            scanf("%c",&ch);

            a[p++]=ch;

        }while(ch!='#');

        p=0;

        do

        {

            fengxi();

            switch(x)

            {

                case 11:printf("< %d,%d >\n",x,y);break;

                case -1:printf("Error in r\n!\n");break;

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

                default:printf("< %d,%s >\n",x,b);break;

            }

        }while(x!=0);

    }

    4.  运行结果及分析

    四、 实验总结

    心得体会:在这次词法分析的实验中,学习了如何用文法描述词法规则。

    难点问题:在实现字符串之间的比较的时候,不了解strcmp这个的用法。

    解决方法:通过查阅上学期C语言的课本,查找到相关字符串比较的方法。

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

     

  • 相关阅读:
    poj2386 Lake Counting
    poj 1852 Ants
    Luogu P2419 [USACO08JAN]牛大赛Cow Contest
    Luogu P2336 [SCOI2012]喵星球上的点名
    Luogu P2463 [SDOI2008]Sandy的卡片
    Luogu P2852 [USACO06DEC]牛奶模式Milk Patterns
    Luogu P4248 [AHOI2013]差异
    【NOI2008】志愿者招募
    Luogu P2743 [USACO5.1]乐曲主题Musical Themes
    P3723 [AH2017/HNOI2017]礼物
  • 原文地址:https://www.cnblogs.com/932zdb/p/5954984.html
Copyright © 2020-2023  润新知