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

    实验一、词法分析实验

    专业:商业软件工程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语言的课本,查找到相关字符串比较的方法。

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

     

  • 相关阅读:
    重读APUE(7)-link/unlink与mkdir/rmdir
    重读APUE(6)-umask
    社交系统中用户好友关系数据库设计
    修改Web项目的名称后,在TomCat中部署项目,项目的名称还是与原来相同的解决方案
    域名解析TTL是什么意思 TTL值设置为多少合适?
    mysql权限控制—新建用户允许其远程连接
    毕业设计技术方向(转载)
    统一资源定位符URL的组成
    开发中model,entity和pojo的区别
    要不要签三方协议
  • 原文地址:https://www.cnblogs.com/932zdb/p/5954984.html
Copyright © 2011-2022 走看看