• 词法分析~实验报告


    实验一、词法分析实验

                                                专业 商业软件3班     姓名 陈笑璞    学号 201506110218

    一、        实验目的

    (1)    编制一个词法分析程序

    (2)    词法分析是编译的第一个阶段,主要任务是从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用于语法分析。

    (3)    通过词法分析的练习,能够进一步了解编译原理。

    (4)    通过了解词法分析程序的设计原则、单词的描述技术、识别机制及词法分析程序的自动构造原理。

    二、        实验内容和要求

    (1)    输入:源程序字符串

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

     

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

    实验方法、步骤:

    (1)    对字符串表示的源程序

    (2)    从左到右进行扫描和分解

    (3)    根据词法规则

    (4)    识别出一个一个具有独立意义的单词符号

    (5)    以供语法分析之用

    (6)    发现词法错误,则返回出错信息

    2、原理分析:   我的设计思路是利用链队列(好处:先进先出且不浪费存储空间)进行存储用户输入字符串,

    以回车键结束(其中必须以非数字结尾,否则程序出错)(这是我在后来的编程里遇到的问题,我知道问题出在哪里,

    但我现在还解决不了,因为我是通过申请子针域来存储,所以我是利用p->next来作为判断结束条件,

    如果以数字结束,那p->next指向未知领域,程序出错,同时这也是很危险的),然后我是利用出队列来判断,

    如果是字母存进数组里,直到下一个字符不是字母,调用函数判断数组的字符串,利用strcmp来判断,输出数组,再清空数组;

     

    void Print(char str[])//调用函数来判断关键字与标识符并输出
    {
    
        int i=0;
        if(strcmp(str,"begin")==0)
            printf("(1,'%s')
    ",str);
        else if(strcmp(str,"if")==0)
            printf("(2,'%s')
    ",str);
        else if(strcmp(str,"then")==0)
            printf("(3,'%s')
    ",str);
        else if(strcmp(str,"while")==0)
            printf("(4,'%s')
    ",str);
        else if(strcmp(str,"do")==0)
            printf("(5,'%s')
    ",str);
        else if(strcmp(str,"end")==0)
            printf("(6,'%s')
    ",str);
        else
        {
            if(str[0]=='')
                return;
            printf("(10,'%s')
    ",str);
        }
        memset(str,0,N);//清空数组str里的所有元素
    }

    结果测试:

    四、        实验总结

    说实话,通过这次的编译原理词法分析的实验,我遇到了不少问题,也学到了不少的东西,因为这次实验

    我是想用我自己的想法来编写程序,我是用链队列来存储字符串的,也许用数组来存储字符串会简单点,

    但我不想,我还是想利用链队列来存储字符串,这样可以节约存储空间,还可以利用队列先进先出的特点,

    不好就是利用队列不够灵活,每次都要出栈判断、存储,释放p的子针域;虽然在编写过程中,遇到不少问题,

    遇到一个,就想办法解决一个,通过问朋友老师等,也通过发朋友圈问,还通过发博客来问大神们,这种途径是

    最有效的,也是最好的;所以每次就差一点就做好了,又会遇到一个新的问题,就要想办法去解决它,如今

    除了字符串是以数字结尾会出现问题外(暂时没找到好的方法),其他问题已解决。

     

  • 相关阅读:
    60. 搜索插入位置
    62. 搜索旋转排序数组
    101. 删除排序数组中的重复数字 II
    397. 最长上升连续子序列
    172. 删除元素
    31. 数组划分
    100. 删除排序数组中的重复数字
    407. 加一
    412. 分糖果
    14. 二分查找
  • 原文地址:https://www.cnblogs.com/2647409627qq/p/5955714.html
Copyright © 2020-2023  润新知