• 词法分析实验报告


    一、        实验目的

         编制一个词法分析程序。

    二、        实验内容和要求

         输入:源程序字符串

      输出:二元组(种别,单词符号本身)。

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

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

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

        2.      原理分析及流程图

      

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

          

     
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #define Max 1000
    int j=1;
    long g=0;
    char nchar[Max]={""}; 
    int k=0;
    char ch=NULL;
    char m[30]={""};
    int sym=-1;
    main()
    {
        char cha;
        int p;
        printf("请输入一串字符串:");
        while((cha=getchar())!='$')
        {
            nchar[g]=cha;
            g++;
        } 
        do
        {
            p=getsym();
        }while(p); 
    }
    int getsym()
    {
        int i;
        char a[2]={""};
        char word[][15]={"begin","do","end","if","then","while"};
        int wsym[6]={1,2,3,4,5,6};
        int ssym[9]={25,26,27,28,0,13,14,15,16};
        char b[9]={'=',';','(',')','#','+','-','*','/'};
        if(j==1&&k<g)
        {
            ch=nchar[k];
            j++;
            k++;
        }
        while(ch==' '||ch==10||ch==9||ch==13)  //判断是否为无用字符
        {
            if(k==g)
            {
                return 0;
            }
            ch=nchar[k];
            k++;
        }
        if(ch>='a'&&ch<='z')      
        {
            while((ch>='a'&&ch<='z')||(ch>='0'&&ch<='9')||ch=='_')
            {
                a[0]=ch;
                strcat(m,a);
                if(k==g)
                {
                    break;
                }
                ch=nchar[k];
                k++;
            }
            for(i=0;i<12;i++)
            {
                if(strcmp(m,&word[i][0])==0)
                    break;
            }
            if(i<12)                            //判断是否为保留字
            {
                sym=wsym[i]; 
                printf("保留字%s  种别码%d
    ",m,wsym[i]);
            }
            Else                           //判断是否为标识符
            {
                sym=10;
                printf("标识符%s  种别码10
    ",m); 
            }
            if(k==g)
            return 0;
            strcpy(m,"");
            return 1;
        }
        else if(ch>='0'&&ch<='9')
        {
            while(ch>='0'&&ch<='9')     //判断是否为数字
            {
                a[0]=ch;
                strcat(m,a);
                if(k==g)
                {
                    break;
                }
                ch=nchar[k];
                k++;
            }
            sym=11; 
            printf("常数%s   种别码11
    ",m);
            if(k==g)                   //判断是否为运算符
            return 0;
            strcpy(m,"");
            return 1;
        }
        else if(ch==':')
        {
            a[0]=ch;
            strcat(m,a);
            if(k==g)
            {
                sym=17; 
                printf("运算符%s  种别码17
    ",m);
                return 0;
            } 
            ch=nchar[k];
            k++;
            if(ch=='=')
            {
                a[0]=ch;
                strcat(m,a);
                sym=18;
                printf("运算符%s  种别码18
    ",m);
                if(k==g)
                {
                    return 0; 
                }
                ch=nchar[k];
                k++;
            }
            strcpy(m,"");
            return 1;
        }
        else if(ch=='<')
        {
            a[0]=ch;
            strcat(m,a);
            if(k<g)
            {
                ch=nchar[k];
                k++;
             } 
            if(ch=='=')
            {
                a[0]=ch;
                strcat(m,a);
                sym=21;
                printf("运算符%s   种别码21
    ",m);
                if(k==g)
                {
                    return 0; 
                }
                ch=nchar[k];
                k++;
            }
            else if(ch=='>')
            {
                a[0]=ch;
                strcat(m,a);
                sym=22;
                printf("运算符%s   种别码22
    ",m);
                if(k==g)
                {
                    return 0; 
                }
                ch=nchar[k];
                k++;
            }
            else
            {
                printf("运算符%s   种别码22
    ",m);
            }
            if(k==g)
            {
                return 0;
             } 
            strcpy(m,"");
            return 1;
        }
        else if(ch=='>')
        {
            a[0]=ch;
            strcat(m,a);
            if(k<g)
            {
                ch=nchar[k];
                k++;
             } 
            if(ch=='=')
            {
                a[0]=ch;
                strcat(m,a);
                sym=24;
                printf("运算符%s   种别码24
    ",m);
                if(k==g)
                {
                    return 0; 
                }
                ch=nchar[k];
                k++;
            }
            else
            {
                sym=23;
                printf("运算符%s   种别码23
    ",m);
            }
            if(k==g)
            {
                return 0; 
            }
            strcpy(m,"");
            return 1;
        }
        else
        {
            for(i=0;i<9;i++)
            {
                if(ch==b[i])
                    break;
            }
            if(i<9)
            {
                sym=ssym[i];
                a[0]=ch;
                strcat(m,a); 
                sym=ssym[i]; 
                printf("%s   种别码为:%d
    ",m,ssym[i]);
            }
            else
            {
                a[0]=ch;
                strcat(m,a); 
                sym=-1;
                printf("错误!%s不存在种别码
    ",m);
            }
            if(k<g)
            {
                ch=nchar[k];
                k++;
            }
            else
               {
                return 0;
            }
            strcpy(m,"");
            return 1;
        }
    }
     

              4.      运行结果及分析

        

          

    四、        实验总结

    通过这个实验,使我了解了编译器词法分析的过程。虽然在干开始做着个程序是是很茫然的,但是在经过一段时间的思考,有了感觉和眉目就开始左手写词法分析程序,这个也算是第二版本吧,第一个版本有个问题就是不能呢个让它在用户输入完后再执行分析,而是用户一换行就执行一段并输出结果,然后在让用户输入,这样做感觉不是很满意就对输入进行了改进,这只是一个功能简化的程序,如果以后要增加功能在这个基础上改就好了。

  • 相关阅读:

    泛型
    特性
    2.Linux基础入门
    1.Linux介绍及系统安装
    php十七种设计模式适用场合总结
    转载zendframework 插件方式
    常用的Jquery代码片段,没事的时候研究一下
    Zend Framework1.9 模块化搭建
    PHP的设计模式总结命令链模式
  • 原文地址:https://www.cnblogs.com/zd983886992/p/6030348.html
Copyright © 2020-2023  润新知