zoukankan      html  css  js  c++  java
  • 实验报告

    实验一、词法分析实验

    商软   伍思敏  201506110249

    一、        实验目的

     

        编制一个词法分析程序

    二、        实验内容和要求

         输入:源程序字符串

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

    词法分析程序的主要任务:

    1.对字符串表示的源程序 

    2.从左到右进行扫描和分解

    3.根据词法规则

    4.识别出一个一个具有独立意义的单词符号

    5.以供语法分析之用

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

     

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

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

    1. 3.      原理分析及流程图

    主要总体设计问题。

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

    char charp[80];                   //存放所有输入的字符

    char token[8];                   //单词自身字符串

    char ch;                        //单个字符

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

    int sym;                      //sym:单词种别码

    int s=0,m=0,i=0,w=0,sum=0;   //sum:整型常数

    void main()

    {

        printf("请输入一串字符串(以输入#号作为结束):");

        do

        {

            ch=getchar();    //ch获取键盘输入的字符

            charp[i++]=ch;   //把字符一个个放在charp数组中

        }while(ch!='#');      //输入以#号键结束

    do

    {

      analyze();   //识别单词

      switch(sym)

      {

        case -1:

            printf(" 错误 : w %d!\n",w);

            break;

        case -2:

            w=w++;break;

        case 11:

            printf("(%d,%d)\n",sym,sum);

            break;

        default:

            printf("(%d,%s)\n",sym,token);

            break;

      }

    }while(sym!=0);

    }

     

     
       
    1. 4.      主要程序段及其解释:

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

    void analyze()

    {

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

            token[i]=NULL;

            ch=charp[s++];

        while(ch==' ')

        {

            ch=charp[s];

            s++;

        }

        if((ch>='0'&&ch<='9'))  //分析数字

        {

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

                {

                    sum=sum*10+ch-'0';

                    ch=charp[s++];

                }

                s--;

                sym=11;

                if(sum>32767)

                    sym=-1;

        }

        else if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z'))   //分析标识符或者变量名

        {

            while((ch>='0'&&ch<='9')||(ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z'))

            {

                token[m++]=ch;

                ch=charp[s++];

            }

                token[m++]='\0';

                s--;

                sym=10;

                for(i=0;i<6;i++)   //将识别出来的字符和已定义的标示符作比较,

                if(strcmp(token,rwtab[i])==0)

                {

                    sym=i+1;

                    break;

                }

        }

        else switch(ch)//分析其他字符

        {

         case'<':m=0;token[m++]=ch;

            ch=charp[s++];

            if(ch=='=')

            {

                sym=21;

                token[m++]=ch;

            }

            else if(ch=='>')

            {

                sym=22;

                token[m++]=ch;

            }

            else

            {

                sym=23;

                s--;

            }

            break;

        case'>':m=0;token[m++]=ch;

           ch=charp[s++];

           if(ch=='=')

           {

               sym=24;

               token[m++]=ch;

           }

           else

           {

               sym=20;

               s--;

           }

           break;

        case':':m=0;token[m++]=ch;

           ch=charp[s++];

           if(ch=='=')

           {

               sym=18;

               token[m++]=ch;

           }

           else

           {

               sym=17;

               s--;

           }

           break;

            case'*':

                sym=13;token[0]=ch;

                break;

            case'/':

                sym=14;token[0]=ch;

                break;

            case'+':

                sym=15;token[0]=ch;

                break;

            case'-':

                sym=16;token[0]=ch;

                break;

            case'=':

                sym=25;token[0]=ch;

                break;

            case';':

                sym=26;token[0]=ch;

                break;

            case'(':

                  sym=27;token[0]=ch;

                  break;

            case')':

                sym=28;token[0]=ch;

                break;

            case'#':

                sym=0;token[0]=ch;

                break;

            case'\n':

                sym=-2;

                break;

            default:

                sym=-1;

                break;

        }

    }

    1. 5.      运行结果及分析

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

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

     

     

     

     

     

    四、        实验总结

    心得体会,实验过程的难点问题及其解决的方法。

    第一次接触编译原理有很多东西都是不会和不知道,在这次作业中很多东西不知道,知道要写词法分析的作业的时候我是一脸茫然不知道怎么写才好,和怎么开始写,在网上搜了很多关于编译原理的东西和知道点,看了资料后还是不知道怎么写和词法分析是写关于什么知识方面的,但是后来慢慢接触了,了解到一些知识,慢慢知道更多,希望以后能了解更多。

     

     

     

     

     

     

     

     

  • 相关阅读:
    vue中使用keepAlive(缓存页面&记忆上次浏览位置)及使用后生命周期的改变
    vue搭配antD-Vue开发项目(一)
    vscode使用
    vue移动端项目经验(三)
    [CF960F] Pathwalks
    [CF1004E] Sonya and Ice-cream
    [CF1142B] Lynyrd Skynyrd
    [CF55D] Beautiful numbers
    [洛谷P4438] HNOI2018 道路
    JOI2019 有趣的家庭菜园3
  • 原文地址:https://www.cnblogs.com/candyxue/p/5958307.html
Copyright © 2011-2022 走看看