词法分析实验报告

实验一、词法分析实验

商业软件工程   麦振澎  201506110162

一、        实验目的

  对用户输入的字符串进行判断,区分它们的类型,熟悉词法分析的过程。

二、        实验内容和要求

     用户输入的字符串进行判断,分别输出每个字符串所属的类型。其中的判断标准如下:

    无符号整数:<整数>{<整数>}

    标识符:<字母>{<字母><数字>}

    数字:0|1|2|......|8|9

    字母:a|b|......x|y|z

    保留字:const|var|procedur|begin|end|odd|if|then|call|while|do|read|write

    运算符:+|-|*|/|=|#|<|<=|>|>=|:=

    界符:(|)|,|;|.

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

  1.       源程序名:cifafenxi.c,可执行程序名:cifafenxi.exe
  2.       原理分析及流程图
      
      
  3. 主要程序段及其解释:

    (1). 将保留字存放在数组中:
      
    char const_temp[6]={'c','o','n','s','t',' '};
    char var_temp[4]={'v','a','r',' '};
    char procedur_temp[9]={'p','r','o','c','e','d','u','r',' '};
    char begin_temp[6]={'b','e','g','i','n',' '};
    char end_temp[4]={'e','n','d',' '};
    char odd_temp[4]={'o','d','d',' '};
    char if_temp[3]={'i','f',' '};
    char then_temp[5]={'t','h','e','n',' '};
    char call_temp[5]={'c','a','l','l',' '};
    char while_temp[6]={'w','h','i','l','e',' '};
    char do_temp[3]={'d','o',' '};
    char read_temp[5]={'r','e','a','d',' '};
    char write_temp[6]={'w','r','i','t','e',' '};

    2).判断数字和无符号整数:

    if(ch>='0'&&ch<='9')
            {
                chtemp=getchar();
                if(chtemp<'0'||chtemp>'9')
                {
                    printf("数字:%c\n",ch);
                    ch=chtemp;
                }
                else
                {
                    printf("无符号整数:%c",ch);
                    ch=chtemp;
                    while(ch>='0'&&ch<='9')
                    {
                        printf("%c",ch);
                        ch=getchar();
                    }
                    printf("\n");
                }
            }

    3).判断字母和标识符以及保留字:

    else if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')
            {
                chtemp=getchar();
                if((chtemp<'a'||chtemp>'z')&&(chtemp<'A'||chtemp>'Z'))
                {
                    printf("字母:%c\n",ch);
                    ch=chtemp;
                }
                else
                {
                    if(chtemp!='\n'&&(ch=='v'||ch=='p'||ch=='b'||ch=='e'||ch=='o'||ch=='i'||ch=='t'||ch=='d'||ch=='r'))
                        ch=Keyworld_first(ch,chtemp);
                    else if(chtemp!='\n'&&(ch=='w'||ch=='c'))
                        ch=Keyworld_double(ch,chtemp);
                    else
                    {
                        printf("标识符:%c%c",ch,chtemp);
                        if(chtemp=='\n')break;
                        ch=getchar();
                        while(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z'||ch>='0'&&ch<='9')
                        {
                            printf("%c",ch);
                            ch=getchar();
                        }
                        printf("\n");
                    }
                }
            }

    4).判断运算符:

    else if(ch=='+'||ch=='-'||ch=='*'||ch=='='||ch=='<'||ch=='>'||ch==':'||ch=='/'||ch=='#')
            {
                chtemp=getchar();
                if(chtemp=='='&&(ch=='>'||ch=='<'||ch==':'))
                {
                    printf("运算符:%c%c\n",ch,chtemp);
                    ch=getchar();
                }
                else
                {
                    printf("运算符:%c\n",ch);
                    ch=chtemp;
                }
            }

    4).判断界符:

    else if(ch=='('||ch==')'||ch==','||ch==';'||ch=='.')
            {
                printf("界符:%c\n",ch);
                ch=getchar();
            }

    5).区分保留字和标识符1:

    char Keyworld_first(char temp,char temppp)
    {
        char *p;
        int i,number,length=-1;
        switch (temp)
        {
            case 'v': p=var_temp;
                      break;
            case 'p': p=procedur_temp;
                      break;
            case 'b': p=begin_temp;
                      break;
            case 'e': p=end_temp;
                      break;
            case 'o': p=odd_temp;
                      break;
            case 'i': p=if_temp;
                      break;
            case 't': p=then_temp;
                      break;
            case 'd': p=do_temp;
                      break;
            case 'r': p=read_temp;
                      break;
        }
        for(i=0;i<9;i++)
        {
            if(p[i]==' ')break;
            length++;
        }
        number=0;
        while(temp==p[number])
        {
            if(number==length+1)break;
            if(number==0)
                temp=temppp;
            else 
                temp=getchar();    
            number++;
        }
        if(number==length+1&&(!(temp>='a'&&temp<='z'||temp>='A'&&temp<='Z'||temp>='0'&&temp<='9')))
        {
            printf("保留字:");
            for(i=0;i<=length;i++)
                printf("%c",p[i]);
            printf("\n");
        }
        else
        {
            printf("标识符:");
            for(i=0;i<number;i++)
                printf("%c",p[i]);
            while(temp>='a'&&temp<='z'||temp>='A'&&temp<='Z'||temp>='0'&&temp<='9')
                {
                    printf("%c",temp);
                    temp=getchar();
                }
            printf("\n");
        }
        return temp;
    }

    6).区分保留字和标识符2:

    char Keyworld_double(char temp,char temppp)
    {
        char *p;
        int i,number,length=-1;
        switch (temp)
        {
            case 'c': if(temppp=='o')
                          p=const_temp;
                      else if(temppp=='a')
                          p=call_temp;
                      else
                      {
                        printf("标识符:");
                        printf("%c",temp);
                        temp=temppp;
                        while(temp>='a'&&temp<='z'||temp>='A'&&temp<='Z'||temp>='0'&&temp<='9')
                            {
                                printf("%c",temp);
                                temp=getchar();
                            }
                        printf("\n");
                        return temp;
                      }
                      break;
            case 'w': if(temppp=='h')
                          p=while_temp;
                      else if(temppp=='r')
                          p=write_temp;
                      else
                      {
                          printf("标识符:");
                        printf("%c",temp);
                        temp=temppp;
                        printf("%c",temp);
                        while(temp>='a'&&temp<='z'||temp>='A'&&temp<='Z'||temp>='0'&&temp<='9')
                            {
                                printf("%c",temp);
                                temp=getchar();
                            }
                        printf("\n");
                        return temp;
                      }
                      break;
        }
        for(i=0;i<9;i++)
        {
            if(p[i]==' ')break;
            length++;
        }
        number=1;
        temp=temppp;
        while(temp==p[number])
        {    
            if(number==length+1)break;
            temp=getchar();
            number++;
        }
        if(number==length+1&&(!(temp>='a'&&temp<='z'||temp>='A'&&temp<='Z'||temp>='0'&&temp<='9')))
        {
            printf("保留字:");
            for(i=0;i<=length;i++)
                printf("%c",p[i]);
            printf("\n");
        }
        else
        {
            printf("标识符:");
            for(i=0;i<number;i++)
                printf("%c",p[i]);
            while(temp>='a'&&temp<='z'||temp>='A'&&temp<='Z'||temp>='0'&&temp<='9')
                {
                    printf("%c",temp);
                    temp=getchar();
                }
            printf("\n");
        }
        return temp;
    }
  4. 运行结果及截图:

    四、        实验总结
      
    对于实现这个功能而言,最麻烦的地方莫过于要去区分标识符和保留字,因为标识符可能是保留字中的一部分或者保留字的加长,所以为了方便判断,把保留字存在数组里,在判断的过程中能够方便地调用。对于实现功能而言,不算太难,比较基础,只是有点麻烦,需要细心而已,但细心对于我来说却是一个难题,希望在以后的学习中能改变这个缺点。

     

posted @ 2016-10-09 19:40  162--麦振澎  阅读(251)  评论(0编辑  收藏  举报