首页 > 代码库 > 实验报告一 词法分析程序

实验报告一 词法分析程序

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

专业:商业软件工程   姓名:卓润峰  学号:201506110202

一、        实验目的

编制一个词法分析程序。

二、        实验内容和要求

1.输入:源程序字符串。

2.输出:二元组(种别,单词本身)

3.待分析语言的词法规则

主要是从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用于语法分析

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

1.     源程序名:压缩包文件(rarzip)中源程序名 cifafenxi.c

可执行程序名:cifafenxi.exe

2.     原理分析及流程图

 技术分享

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

#include<stdio.h>

#include<string.h>

char one[9][10]={"begin","if","then","while","do","end","main","int","char"};

int number;

 

int fenxi(char a[],int p)

{

    char b[10];

    int i=0,j=1,q;

    b[0]=a[0];

    printf("\n");

    if((b[0]>=‘a‘&&b[0]<=‘z‘)||(b[0]>=‘A‘&&b[0]<=‘Z‘))

    {

        for(j=1;j<10;j++)

            {

                b[j]=a[j];

                if(b[j]==‘ ‘)

                {

                    b[j]=‘\0‘;

                    p=j;

                    break;

                }

            }

            for(j=0;j<9;j++)

                if(strcmp(b,one[j])==0)

                {

                    printf("(%d,%s)",j+1,b);

                    q=0;

                    return p;

                }

                else

                    q=1;

            if(q==1)

            {

                printf("(10,%s)",b);

                return p;

            }

 

        }

        if((b[0]>=48)&&(b[0]<=57))

        {

            for(j=1;j<10;j++)

            {

                b[j]=a[j];

                if(b[j]==‘ ‘)

                {

                    b[j]=‘\0‘;

                    p=j;

                    printf("(11,%s)",b);

                    return p;

                }

            }

        }

        if((b[0]==‘+‘)||(b[0]==‘-‘)||(b[0]==‘*‘)||(b[0]==‘/‘)||(b[0]==‘=‘)||(b[0]==‘(‘)||(b[0]==‘)‘)||(b[0]==‘#‘))

        {

            b[1]=a[1];

            if(b[1]==‘ ‘)

            {

                 p=1;

                 b[1]=‘\0‘;

            }

            switch(b[0])

            {

            case ‘+‘:j=13;break;

            case ‘-‘:j=14;break;

            case ‘*‘:j=15;break;

            case ‘/‘:j=16;break;

            case ‘=‘:j=25;break;

            case ‘;‘:j=26;break;

            case ‘(‘:j=27;break;

            case ‘)‘:j=28;break;

            case ‘#‘:j=0;break;

            }

            printf("(%d,%s)",j,b);

            return p;

        }

        if((b[0]==‘:‘)||(b[0]==‘>‘)||(b[0]==‘<‘))

        {

            b[1]=a[1];

            if((b[1]!=‘=‘)&&(b[1]!=‘>‘)&&(b[1]!=‘<‘)&&(b[1]==‘ ‘))

            {

 

                p=1;

                b[1]=‘\0‘;

                switch(b[0])

                {

                case ‘:‘:j=17;break;

                case ‘<‘:j=20;break;

                case ‘>‘:j=23;break;

                }

                printf("(%d,%s)",j,b);

                return p;

            }

            else

            {

                b[1]=a[1];

                b[2]=‘\0‘;

                p=2;

                if((b[0]==‘:‘)&&(b[1]==‘=‘))j=18;

                else if((b[0]==‘<‘)&&(b[1]==‘=‘))j=21;

                else if((b[0]==‘>‘)&&(b[1]==‘=‘))j=24;

                else if((b[0]==‘<‘)&&(b[1]==‘>‘))j=22;

                printf("(%d,%s)",j,b);

                return p;

            }

        }

 

}

 

void maopao(char a[],int p)

{

    int i;

    for(i=0;a[i]!=‘\0‘;i++)

        a[i]=a[p+i+1];

}

 

main()

{

    char a[100];

    int p;

    printf("请输入一段程序(空格后回车结尾):");

 

    gets(a);

    do

    {

        p=fenxi(a,p);

        maopao(a,p);

    }while(a[0]!=‘\0‘);

}

4.     运行结果及分析

技术分享

四、        实验总结

这是编译原理这门课的开始程序,讲真看这门课真的跟天书一样,很多东西都是很难理解的,很抽象,像这个词法编译器,是老师讲了很久才懂得原理,很多功能还不是很完善,有许多要改进的地方,也有很多的BUG,想了很久也很难解决问题,不过最后还是完成了这个程序,学到了很多知识,也复习了大一所学的c语言许多语法。

 

实验问题:

       1.不知道该如何判断每一个单元的词法。

       2.如何不断地进行词法分析,如何结束。

解决方案:

       1.定义一个新的数组,并将原字符串读到空格后赋值给这个新的数组,然后对这个新数组中存储的字符串进行判断。

       2.利用循环,每判断一次,就将之前判断的单元删除,另后面的字符串浮到上面来继续进行判断,直到原字符串剩下‘\0’,退出循环。

实验报告一 词法分析程序