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)六个关键字符,还根据老师给出的种别码表加入了{>....等字符}

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

  • 相关阅读:
    Servlet 易错点和注意点
    Spring 完成自动注入(autowire)
    Java 定时调度Timer&Quartz
    常用Linux命令杂记
    Spring 使用AOP——基于注解配置
    Spring 使用AOP——xml配置
    Spring 使用纯注解方式完成IoC
    Spring 简单使用IoC与DI——XML配置
    让多个HTML页面 使用 同一段HTML代码
    Feture、ListenableFuture、ComplatableFuture
  • 原文地址:https://www.cnblogs.com/shadows24/p/5954748.html
Copyright © 2011-2022 走看看