词法分析~实验报告

实验一、词法分析实验

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

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

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

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

 

原文地址:https://www.cnblogs.com/2647409627qq/p/5955714.html