词法分析实验报告

实验一、词法分析实验

专业 商业软件工程 姓名 胡德霖 学号 201506110208

一、        实验目的

     输入字符串,显示字符串和种别码

二、        实验内容和要求

     将输入的字符串通过词法分析器一一识别出来,同时将该字符串或者字符并且和种别码一起输出来。

 

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

 

  1. 1.      程序名:词法分析.c

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

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

 

主要总体设计问题。

采用数组存放数据,通过字符串的比较实现关键字的种别码输出。

问题:当输入连续的关键字时如ifif后面一个无法识别.

解决:当输出完一个关键字后就释放token的数组

  1. 3.      主要程序段及其解释:
  2. #include <stdio.h>
    #include <string.h>
    #define MAX 100
    main()
    {
        int i=0,j,n,syn;
        char num[MAX],standard[6][10]={"begin","if","then","while","do","end"},string[MAX],token[MAX],ch;
        printf("请输入一串字符,以#结尾:");
        do{
            scanf("%c",&ch);
            string[i]=ch;
            i++;
        }while(ch!='#');
        string[i]='#';
        i=0;
        do{
            for(j=0;j<MAX;j++)
                token[j]='';
            for(j=0;j<MAX;j++)
                num[j]='';
            ch=string[i];
            i++;
            while(ch==' '||ch=='
    ')
            {
                ch=string[i];
                i++;
            }
            j=0;
            while(ch>='a'&& ch<='z' || ch>='A'&&ch<='Z') /*判断是否为字符关键字*/
            {
                token[j]=ch;
                ch=string[i];
                i++;
                j++;
                for(n=0;n<6;n++)
                {
                    if(strcmp(token,standard[n])==0)
                    {
                        syn=n+1;
                        printf("%s,种别码%d
    ",standard[n],syn);
                        for(j=0;j<MAX;j++)
                            token[j]='';
                        j=0;
                    }
                }
    
            }
            while(ch>='0'&& ch<='9') /*判断是否为数字*/
            {
                num[j]=ch;
                ch=string[i];
                i++;
                j++;
            }
            if(num[0]>='0'&&num[0]<='9')
                printf("%s,种别码%d
    ",num,syn=11);
            for(j=0;j<MAX;j++)
                num[j]='';
            j=0;
            switch(ch)
            {
            case '+':
                syn=13;
                printf("%c,种别码%d
    ",ch,syn);
                break;
            case '-':
                syn=14;
                printf("%c,种别码%d
    ",ch,syn);
                break;
            case '*':
                syn=15;
                printf("%c,种别码%d
    ",ch,syn);
                break;
            case '/':
                syn=16;
                printf("%c,种别码%d
    ",ch,syn);
                break;
            case ':':
                ch=string[i];
                i++;
                if(ch=='=')
                {
                    syn=18;
                    printf("%c%c,种别码%d
    ",token[j-1],ch,syn);
                }
                else
                {
                    syn=17;
                    printf("%c,种别码%d
    ",ch,syn);
                    i--;
                }
                break;
            case '<':
                token[j]=ch; 
                j++;
                ch=string[i];
                i++;
                if(ch=='=')
                {
                    syn=21;
                    printf("%c%c,种别码%d
    ",token[j-1],ch,syn);
                }
                else
                {
                    syn=20;
                    printf("%c,种别码%d
    ",ch,syn);
                    i--;
                }
                break;
            case '>':
                token[j]=ch;
                j++;
                ch=string[i];
                i++;
                if(ch=='=')
                {
                    syn=24;
                    printf("%c%c,种别码%d
    ",token[j-1],ch,syn);
                }
                else{
                    syn=23;
                    printf("%c,种别码%d
    ",ch,syn);
                    i--;
                }
                break;
            case '=':
                syn=25;
                printf("%c,种别码%d
    ",ch,syn);
                break;
            case ';':
                syn=26;
                printf("%c,种别码%d
    ",ch,syn);
                break;
            case '(':
                syn=27;
                printf("%c,种别码%d
    ",ch,syn);
                break;
            case ')':
                syn=28;
                printf("%c,种别码%d
    ",ch,syn);
                break;
            default:
                i--;
                break;
            }
            
        }while(ch!='#');
        getchar();
        getchar();
    }

利用string数组储存用户输入的字符串再一个个读取字符,当读到字母就用token数组存放,读完后再对照是否为关键字,当为其他字符时再判断输出。

  1. 4.      运行结果及分析

 

四、        实验总结

心得体会,在这次的实验中了解词法分析的过程,解决一些问题。在完成我的词法分析器的时候考虑到关键字固定的字符串,这就有利于字符串的比较,从而识别出对应的种别码。因为是第一次接触,显得有些不知所措,不知道从何下手,最后经过努力,勉勉强强算是完成了吧。

 

 

 

 

 

原文地址:https://www.cnblogs.com/q1736699804/p/5955506.html