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不能够有所输出。

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

    四、        实验总结

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

  • 相关阅读:
    PAT (Advanced Level) 1086. Tree Traversals Again (25)
    PAT (Advanced Level) 1085. Perfect Sequence (25)
    PAT (Advanced Level) 1084. Broken Keyboard (20)
    PAT (Advanced Level) 1083. List Grades (25)
    PAT (Advanced Level) 1082. Read Number in Chinese (25)
    HDU 4513 吉哥系列故事――完美队形II
    POJ Oulipo KMP 模板题
    POJ 3376 Finding Palindromes
    扩展KMP
    HDU 2289 Cup
  • 原文地址:https://www.cnblogs.com/ffde/p/5954247.html
Copyright © 2011-2022 走看看