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

实验报告一 词法分析程序

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

专业 计算机科学与技术   姓名 谢建航  学号 201506110209

一、        实验目的

 

1.编制一个词法分析程序。

 

二、        实验内容和要求

  1. 输入:源程序字符串
  2. 输出:二元组,用小括号括起
  3. 待分析语言的词法规则

 

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

 

  1. 1.      源程序名:压缩包文件(rarzip)中源程序名简易词法分析.c

可执行程序名:简易词法分析.exe

  1. 2.      原理分析及流程图

 

 技术分享

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

 技术分享

 

#include<stdio.h>

#include<string.h>

int ysf(char a[100],int i)

{

    switch(a[i])

    {

        case ‘+‘:

            {

                printf("(13,+)");

                printf("\n");

                return(1);

            }

 

        case ‘-‘:

            {

                printf("(14,-)");

                printf("\n");

                return(1);

            }

        case ‘*‘:

            {

                printf("(15,*)");

                printf("\n");

                return(1);

            }

        case ‘/‘:

            {

                printf("(16,/)");

                printf("\n");

                return(1);

            }

        case ‘:‘:

            {

                if(a[i+1]==‘=‘)

                {

                    printf("(18,:=)");

                    printf("\n");

                    return(2);

                }

                else

                    printf("(17,:)");

                    printf("\n");

                return(1);

 

            }

        case ‘<‘:

            {

                if(a[i+1]==‘>‘)

                {

                    printf("(21,<>)");

                    printf("\n");

                    return(2);

                }

                else if(a[i+1]==‘=‘)

                {

                    printf("(22,<=)");

                    printf("\n");

                    return(2);

                }

                else

                    printf("(20,<)");

                    printf("\n");

                return(1);

 

            }

        case ‘>‘:

            {

                if(a[i+1]==‘=‘)

                {

                    printf("(24,>=)");

                    printf("\n");

                    return(2);

                }

                else

                    printf("(23,>)");

                    printf("\n");

                return(1);

 

            }

        case ‘=‘:

            {

                printf("(25,=)");

                printf("\n");

                return(1);

            }

        case ‘;‘:

            {

                printf("(26,;)");

                printf("\n");

                return(1);

            }

        case ‘(‘:

            {

                printf("(27,()");

                printf("\n");

                return(1);

            }

        case ‘)‘:

            {

                printf("(28,))");

                printf("\n");

                return(1);

            }

        default:

            return(0);

            break;

 

    }

    printf("\n");

}

void number(char a[10])

{

    int i=0;

    char text[10];

    while(a[i]!=‘\0‘)

    {

        text[i]=a[i];

        i++;

    }

    text[i]=‘\0‘;

    printf("(11,%s)\n",text);

}

void fing(char a[10])

{

    int i=0;

    char text[10];

    while(a[i]!=‘\0‘)

    {

        text[i]=a[i];

        i++;

    }

    text[i]=‘\0‘;

 

    if( strcmp(text,"begin")==0)

    {

        printf("(1,begin)");

    }

    else if( strcmp(text,"if")==0)

    {

        printf("(2,if)");

    }

    else if( strcmp(text,"then")==0)

    {

        printf("(3,then)");

    }

    else if( strcmp(text,"while")==0)

    {

        printf("(4,while)");

    }

    else if( strcmp(text,"do")==0)

    {

        printf("(5,do)");

    }

    else if( strcmp(text,"end")==0)

    {

        printf("(6,end)");

    }

    else

    {

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

    }

    printf("\n");

}

 

main(){

    int i=0,j=-1,l=0,x=0;

    char a[100],text[10];

    printf("输入源程序,以#号结束:");

    gets(a);

    while(1)

    {

        if(a[i]>=‘0‘&&a[i]<=‘9‘)

        {

            while(a[i]>=‘0‘&&a[i]<=‘9‘)

                i++;

 

            l=0;

 

            for(++j;j<i;j++)

            {

                text[l]=a[j];

                l++;

            }

 

            text[l]=‘\0‘;

 

            number(text);

            i--;

        }

        else if(a[i]>=‘a‘&&a[i]<=‘z‘||a[i]>=‘A‘&&a[i]<=‘Z‘)

        {

            l=0;

            for(i;a[i]>=‘a‘ && a[i]<=‘z‘ ||a[i]>=‘A‘&&a[i]<=‘Z‘;i++)

            {

                text[l]=a[i];

                l++;

            }

            i--;

 

            text[l]=‘\0‘;

            fing (text);

 

        }

        else

        {

            if(a[i]==‘#‘)

            {

                printf("(0,#)");

                break;

            }

 

            x=ysf(a,i);

            if(x==1)

            {

                j=i;

            }

            else if(x==2)

            {

                i++;

                j=i;

            }

        }

        i++;

 

    }

 

}

  1. 4.      运行结果及分析

  技术分享        

 

 

 

 

 

 

四、        实验总结

 

一开始不知道怎么处理字符串,后来用先用字符数组对输入进行保存,再用另一个字符数字进行一一记录,标记为字符串。

根据数组记录的字符串类型调用函数,再进行一一输出。

做这个软件算是复习了大一所学的c语言知识吧。

实验报告一 词法分析程序