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

    实验一、词法分析实验

    1502商业软件工程专业 黄浩峰  姓名  201506110142学号

    一、 实验目的

         通过实验了解词法分析器的词法分析过程。

    二、 实验内容和要求

    设计一个词法分析程序,对关键字,以及字符的识别。读取分析后,输出字符及其种别码。

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

     

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

    可执行程序名:×××.exe

    2. 原理分析及流程图

    主要总体设计问题。

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

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

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

    #include<stdio.h>

    #include<string.h>

    char prog[80],token[8];

    char ch;

    int syn,p,m=0;

    int n,row,sum=0;

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

    void get1()

    {

        /*3,标识符,数字,符号3块,分别对应ifelse——ifelse*/

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

            token[n]=NULL;

        ch=prog[p++];

       while((ch==' ')||(ch=='/n'))

        {

            ch=prog[p];

            p++;

        }

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

        {

            m=0;

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

            {

                token[m++]=ch;

                ch=prog[p++];

            }

            token[m++]='';

            p--;

            syn=10;

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

            {

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

            {

                syn=n+1;

                break;

            }

            }

        }

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

            {

               sum=0;

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

               {

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

                   ch=prog[p++];

               }

               p--;

               syn=11;

            }

            else {

                switch(ch)//other string

                {

                    case'<':

                        m=0;

                        token[m++]=ch;

                        ch=prog[p++];

                        if(ch='>')

                        {

                            syn=22;

                        }

                        else if(ch=='=')

                        {

                            syn=21;

                            token[m++]=ch;

                        }

                        else

                        {

                            syn=20;

                            p--;

                        }break;

                    case'>':

                        m=0;

                        token[m++]=ch;

                        ch=prog[p++];

                        if(ch=='=')

                        {

                            syn=24;

                            token[m++]=ch;

                        }

                        else

                        {

                            syn=23;

                            p--;

                        }break;

                    case':':

                        m=0;

                        token[m++]=ch;

                        ch=prog[p++];

                        if(ch=='=')

                        {

                            syn=18;

                            token[m++]=ch;

                        }

                        else

                        {

                            syn=17;

                            p--;

                        }break;

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

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

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

                        case'-':syn=14;token[0]=ch;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;

                        case' ':syn=-2;break;

                        default: syn=-1;break;

                }

            }

    }

    int main()

    {

        p=0;

        row=1;

        printf("输入一串字符串(#结束)");

        do

        {

            scanf("%c",&ch);

            prog[p++]=ch;

        }while(ch!='#');

        p=0;

        do

        {

            get1();

            switch(syn)

            {

                case 11:

                    printf("(%d,%d)",syn,sum);

                    break;

                case -1:

                   printf("错误(row)!");

                   getch();

                   break;

                case -2:

                    row=row++;

                    break;

                default:

                    printf("(%d,%s)",syn,token);

                    break;

            }

        }while(syn!=0);

        getch();

    }

    4. 运行结果及分析

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

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

     

     

     

     

     

     

    四、 实验总结

     

    本次实验,通过自己思考与在网上找资料参考下解决。

    程序中除了(beginifwhileenddothen)六个关键字符,还根据老师给出的种别码表加入了{>....等字符}

    我认为词法分析是作为扫描器一样的功能,将字符一个一个读取标记,为接下来的语法分析使用。

  • 相关阅读:
    数据类型装换
    变量及数据类型
    27 网络通信协议 udp tcp
    26 socket简单操作
    26 socket简单操作
    14 内置函数 递归 二分法查找
    15 装饰器 开闭原则 代参装饰器 多个装饰器同一函数应用
    12 生成器和生成器函数以及各种推导式
    13 内置函数 匿名函数 eval,exec,compile
    10 函数进阶 动态传参 作用域和名称空间 函数的嵌套 全局变量
  • 原文地址:https://www.cnblogs.com/shadows24/p/5954748.html
Copyright © 2011-2022 走看看