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

实验一、词法分析实验

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

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

 

原文地址:https://www.cnblogs.com/932zdb/p/5954984.html