词法分析实验报告

格式说明:排版时注意按此模板的字体,字号和行距。

报告提交和打印输出时请去掉此框。

 

实验一、词法分析实验

   商软二班 张智恒 201506110172

一、        实验目的

 

     编制一个词法分析程序

 

二、        实验内容和要求

编写一个词法分析程序,使其能够识别对应的单词符号,并以(单词符号        种别码)的形式输出。

 

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

 1.      源程序名:压缩包文件(rarzip)中源程序名 zzh.c

可执行程序名:zzh.exe

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

# include<stdio.h>

# include<stdlib.h>

# include<string.h>

 

int panduan(char tmp[])

{

    char b[6][10] = {"begin", "if", "then", "while", "do", "end", };

    int k = 0;

 

    while(k < 6)                 // 临时变量tmp 与 字符串b[k] 进行比较

    {

        if(strcmp(tmp, b[k]) == 0)

        {

            printf("<%s, %d>\n", tmp, k+1);

            return 0;

        }

        k++;

    }

    printf("<%s, 10>\n", tmp);

 

    return 0;

}

 

void cifafenxi(char a[])

{

    int i = 0, j = 0;

    char tmp[10];

    int flag = 0;

 

    while(a[i] != '\0')

    {

        if(a[i] >= 'a' && a[i] <= 'z')        // 判断标识符

        {

            tmp[j] = a[i];

            j++;

            while((a[i+1] >= 'a' && a[i+1] <= 'z') || (a[i+1] >= '0' && a[i+1] <= '9'))

            {

                i++;

                tmp[j] = a[i];

                j++;

            }

            tmp[j] = '\0';

            j = panduan(tmp);

        }

 

        if(a[i] >= '0' && a[i] <= '9')        // 判断数字

        {

            tmp[j] = a[i];            

            j++;

            while(a[i+1] >= '0' && a[i+1] <= '9')

            {

                i++;

                tmp[j] = a[i];

                j++;

            }

            tmp[j] = '\0';

            printf("<%s, 11>\n", tmp);

            j = 0;

        }

 

        switch(a[i])        // 判断符号

        {

        case '+':printf("<+, 13>\n");break;

        case '-':printf("<-, 14>\n");break;

        case '*':printf("<*, 15>\n");break;

        case '/':printf("</, 16>\n");break;

        case ':':

            {

                if(a[i+1] == '=')

                    printf("<:=, 18>\n");

                else

                    printf("<:, 17>\n");

            }break;

        case '<':

            {

                if(a[i+1] == '=')

                    printf("<<=, 21>\n");

                else if(a[i+1] == '>')

                    printf("<<>, 22>\n");

                else

                    printf("<<, 20>\n");

            }break;

        case '>':

            {

                if(a[i+1] == '=')

                    printf("<>=, 24>\n");

                else

                    printf("<>, 23>\n");

            }break;

        case '=':printf("<=, 25>\n");break;

        case ';':printf("<;, 26>\n");break;

        case '(':printf("<(, 27>\n");break;

        case ')':printf("<), 28>\n");break;

        case '#':printf("<#, 0>\n");break;

        }

    

        i++;

    }

}

 

int main(void)

{

    char a[300];

 

    printf("input : ");

    gets(a);

    cifafenxi(a);

 

    return 0;

}

3.      运行结果及分析

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

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

 

 

 

 

 

 

 

 

四、        实验总结

 

1.很有难度,在机房里憋了几个小时,还是搞不定,主要是在数字那一块数字方面该程序是没有负数的,很多地方其实也都不算完美通过与同学的交流,掌握了主要方法后发现其原理十分简单,把每一种类型都分开出来特殊处理就可以了

词法分析是编译的第一个阶段,它的主要任务是从左至右逐个字符地对源程序进行扫描,

初次做词法分析时无从下手,后经过看书查资料对其慢慢理解, 勉强是做出了一个不太好的成品 ,

对于编译程序的学习,我会更加用心的,毕竟我觉得确实有难度,但它确实很有用,比如编译程序

的结构要如何简洁清晰条理化,编译程序的效率等等的实际问题

 

 

 

 

 

 

 

 

 

 

posted @ 2016-10-14 15:48  172张智恒  阅读(107)  评论(0编辑  收藏  举报