zoukankan      html  css  js  c++  java
  • 实验报告1—’词法分析

    实验一、词法分析实验

    专业:商业软件工程   姓名:钟菲菲  学号:201506110191

    一、        实验目的

    编制一个词法分析程序

    二、        实验内容和要求

    输入:源程序字符串;

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

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

    1.      源程序名:压缩包文件(rarzip)中源程序名词法分析.c

    可执行程序名:词法分析.exe

    2.      原理分析及流程图

    主要总体设计问题。

     

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

    void Analyse(char a[])//词法分析的主要函数

    {

        int i=0,j=0,n=0,m=0,temp=0;

        char b[N];//数组b存储数组a中除关键字外的其他字母

        while(a[i]!='$')//对输入的单词符号进行识别判断是否为关键字或标志符,若是则输出单词本身及其词法规则和种别码

        {

             if(a[i]>=65&&a[i]<=122)//判断每一个单词符号是否为字母

            {

                j=0;

                while((a[i]>=65&&a[i]<=122)||(a[i]>='0'&&a[i]<='9')||a[i]=='_')

                {

                    b[j]=a[i];

                    j++;

                    i++;

                }

                i--;

                b[j]='\0';

                for(n=0;n<6;n++)

                {

                    if(strcmp(b,word[n])==0)

                    {

                                    printf("<关键字,%d,",n+1);

                                    while(word[n][m]!='\0')

                                    {

                                           printf("%c",word[n][m]);

                                           m++;

                                    }

                                    printf(">\n");

                                    temp=1;

                    }

                      }

                      if(temp==0)

                             printf("<标识符,10,%s>\n",b);

             }

             else

             {

                switch(a[i])//用switch结构实现对界符和运算符的识别和其词法规则和种别码的输出

                {

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

                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");

                             i++;

                         }

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

                    break;

                case '<': if(a[i+1]=='=')

                         {

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

                             i++;

                         }

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

                    {

                        printf("<运算符,22,<>>\n");

                        i++;

                    }

                    else printf("<界符,20,<>\n");

                    break;

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

                         {

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

                             i++;

                         }

                    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' ': break;

                case'\n': break;

                default:

                    if(a[i]>='0'&&a[i]<='9')   

                        printf("<数字,%c>\n",a[i]);

                    else

                        printf("'%c'输入错误!\n",a[i]);//若输入的单词符号为其他,则输出“输入错误”

                        break;

                }

             }

             i++;

        }

    }

    4.      运行结果及分析

     

    分析:输入关键字、运算符、界符时,输出其词法规则、单词符号本身以及其种别码,输入数字时,输出其词法规则以及数字本身。

    分析:输入的abcd不能够有所输出。

    分析:由于没有输入关键字,输入标识符后能够输出了。当输入空格时提示输出错误。

    四、        实验总结

    主要问题:若同时输入关键字和标识符,输出结果只显示关键字,只有当不输入关键字时输入标识符,才能输出标识符的单词符号。自己的程序还存在很大的不足,试着用很多想法改进了,还是没有完善。今后会再接再厉,有不懂的地方多提问。

  • 相关阅读:
    bzoj 3727: Final Zadanie 思维题
    bzoj 2510: 弱题 概率期望dp+循环矩阵
    bzoj 1131: [POI2008]Sta DFS
    bzoj 3572: [Hnoi2014]世界树 虚树
    bzoj 3611: [Heoi2014]大工程 虚树
    bzoj 3545: [ONTAK2010]Peaks Kruskal重构树
    bzoj 2118: 墨墨的等式 spfa
    bzoj 1441: Min 裴蜀定理
    bzoj 4540: [Hnoi2016]序列 莫队
    bzoj 4034: 树上操作 线段树
  • 原文地址:https://www.cnblogs.com/ffde/p/5954247.html
Copyright © 2011-2022 走看看