实验一 词法分析实验

实验一、词法分析实验

 

一、        实验目的

编制一个词法分析程序

二、        实验内容和要求

输入:源程序字符串

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

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

 1.      源程序名:压缩包文件(rarzip)中源程序名×××.c可执行程序名:×××.exe

2.      原理分析及流程图

把输入的字符用链表进行存储,利用自己构造的一个判断函数,读取字符链表中存储的字符并进行判断处理,如果符合条件则输出,并继续判断直到链表为空则退出。

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

typedef struct link          //字符链表

{

    char data;               //存放字符

    struct link *next;       //指向下一个

}Link;

 

 

 

 

void specialchar(Link *charhead)   //判断字符函数

{

    Link *q,*p;

    int i;

    q=charhead->next;

    while(q!=NULL)

    {

    switch(q->data)

    {

    case 'b':                       //判断是否是标识符begin

    special[0]=q->data;       //把待判断的字符存入数组

     q=q->next;

     if(q->data=='e')             //如果符合则继续进入判断

     {

        special[1]=q->data;    //把待判断的字符存入数组

        q=q->next;

        if(q->data=='g')

        {

            special[2]=q->data;

            q=q->next;

            if(q->data=='i')

            {

                special[3]=q->data;

                q=q->next;

                if(q->data=='n')

                {

                special[4]=q->data;            //把符合文法的字符全部存入到一个数组里

                printf("<标识符> ");

                for(i=0;i<5;i++)                 //用for循环把数组输出 

                    printf("%c",special[i]);

                printf("\n");

                }

            }

        }

     }

     break;

…………….

 

 

  1. 4.      运行结果及分析

一般必须配运行结果截图,结果是否符合预期及其分析。

   (截图需根据实际,截取有代表性的测试例子)

 

四、        实验总结

程序能够把题目中给出的关键字begin、 if、 then、 while 、do、 end、 l(l|d)*、dd*,以及加减乘除,小括号,尖括号等于号 等判断出来。

本程序使用的是链表进行存储,原因是链表具有灵活性,能够根据用户的输入情况来申请空间,而且所需的空间灵活,不像数组那样要求申请固定的空间导致空间的浪费。同时本程序也使用大量的判断符,利用数组把待判断的字符进行存储,一旦发现符合我们的文法规则就把数组进行输出。然后重复使用该数组。

不足:进入判断后指针会指向下一个链表元素,当发现不符合这个单词的文法规则的时候就会退出switch循环,而退出switch循环时,会再一次指向下一个链表元素,因此产生,当不符合文法规则的时候,就会少判断到一个字符元素。

 

           

 

posted @ 2016-10-13 11:36  247李嘉嘉  阅读(628)  评论(2编辑  收藏  举报