• 词法分析~实验报告


    实验一、词法分析实验

                                                专业 商业软件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的子针域;虽然在编写过程中,遇到不少问题,

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

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

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

     

  • 相关阅读:
    C# Nest客户端查询es字段为空的语句
    Nuget 包还原成功,但引用异常
    ES7.2 安装问题
    elasticsearch 子节点有Unassigned Shards处理方法 和 failed to obtain in-memory shard lock
    rabbitmq修改日志级别
    C# NEST terms
    ES create index template
    Servicestack + Exceptionless本地部署
    live-server的使用
    处理cnpm控制台运行无反应(干瞪眼 就是不动)
  • 原文地址:https://www.cnblogs.com/2647409627qq/p/5955714.html
Copyright © 2020-2023  润新知