• 词法分析实验报告


    实验一、词法分析实验

    专业:商业软件工程  

    姓名:  陈  瑾

    学号:201506110101

    一、        实验目的

     

         编制一个词法分析程序

    二、        实验内容和要求

    –      输入:源程序字符串

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

    –     待分析语言的词法规则

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

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

    可执行程序名:E:\编程练习、C语言、c_file\Debug\1010.exe

    2.      原理分析及流程图

    主要总体设计问题。

    (包括存储结构,主要算法,关键函数的实现等)

    输入:所给文法的源程序字符串。

    输出:二元组(syn,token或sum)构成的序列。

    其中:syn为单词种别码;token为存放的单词自身字符串;sum为整型常数。

    关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表)。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。

    首先设置3个变量:①token用来存放构成单词符号的字符串;②sum用来整型单词;③syn用来存放单词符号的种别码。

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

    实现主要功能的程序段,重要的是程序的注释解释。

    #include <stdio.h>

    #include <stdlib.h>

    #include <string.h>

    char prog[100],ch,token[8];

    int p=0,syn,n,i;

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

    void scaner();

    void main()

    {

       p=0;

       printf("please input sentence, end of '#' !\n");

       do

       {

              ch=getchar();

              prog[p++]=ch;

       }while(ch!='#');

       p=0;

       do

       {

              scaner();

              switch(syn)

              {

              case -1:printf("词法分析 出错\n");

                     break;

              default :printf("<%d,%s>\n",syn,token);

                     break;

              }

       }while(syn!=0);

       printf("词法分析 成功\n");

       getchar();

    }

    void scaner()

    {

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

       {

              token[n]='\0';

       }

       n=0;

       ch=prog[p++];

       while(ch==' ')

       {

              ch=prog[p++];

       }

       if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))

       {

              do{

                     token[n++]=ch;

                     ch=prog[p++];

              }while((ch>='a'&&ch<='z')||(ch>='a'&&ch<='z')||(ch>='0'&&ch<='9'));

              syn=10;

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

              {

                     if(strcmp(token,keyword[n])==0)

                     {

                            syn=n+1;

                     }

              }

              p--;//return;

       }

       else if(ch>='0'&&ch<='9')

       {

              p--;

              do

              {

                     token[n++]=prog[p++];

                     ch=prog[p];

              }while(ch>='0'&&ch<='9');

              syn=11;

              return;

       }

       else

       {

              switch(ch)

              {

              case '+':syn=13;token[0]=ch;

                     break;

            case '-':syn=14;token[0]=ch;

                     break;

            case '*':syn=15;token[0]=ch;

                     break;

            case '/':syn=16;token[0]=ch;

                     break;

            case ':':syn=17;token[0]=ch;

            ch=prog[p++];

            if(ch=='='){token[1]=ch;syn++;}

            else p--;

            break;

              case '<':syn=20;token[0]=ch;

                     ch=prog[p++];

                     if(ch=='>')

                     {

                            token[1]=ch;syn++;

                     }

                     else if(ch=='='){token[1]=ch;syn=syn+2;}

                     else p--;

                     break;

              case '>':syn=23;token[0]=ch;

                     ch=prog[p++];

                     if(ch=='=')

                     {

                            token[1]=ch;syn++;

                     }

                     else p--;

                     break;

              case '=':syn=25;token[0]=ch;

                     break;

            case ';':syn=26;token[0]=ch;

                     break;

            case '(':syn=27;token[0]=ch;

                     break;

            case ')':syn=28;token[0]=ch;

                     break;

            case '#':syn=0;token[0]=ch;

                     break;

              default: printf("词法分析出错! 请检查是否输入非法字符\n");

                     syn=-1;

                     break;

              }

       }

    }

    4、运行结果及分析

    四、    实验总结

    词法分析,当输入一个字符时,可以根据定义的语法进行分析。但当输入长的程序时候,应当如何获取,然后分割,最后进行分析。试着一个一个字来读取,遇到正常字符开始的就连续读取直到遇到一个分隔符(如空格)。 如果是连续的空格,如果是特殊的字, 如果是以特定字符开头的(如双引号”)类似这样多种情况,如何进行分析。后经过查找资料,询问同学,最终勉强完成作业。虽然不是很好,但过程有了更深的理解了词法分析的过程,以及该算法。

  • 相关阅读:
    C# 关于类的事件和委托
    C# 多态
    C# 声明方法的语法
    C# 面向对象基础
    近期发现的一些.net资源
    asp.net 2.0学习资源
    设置VSS使支持通过Internet访问
    大型社区设计:提高用户体验的10个细节
    委托的用法
    有滚动条、固定Header的ASP.Net DataGrid实现
  • 原文地址:https://www.cnblogs.com/cs007/p/5962376.html
Copyright © 2020-2023  润新知