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

    实验一、词法分析实验

    专业:商业软件工程专业   姓名:叶胜轩  学号:201506110125

    一、        实验目的

    (1)    理解词法分析在编译程序中的作用。

    (2)    加深对有穷自动机模型的理解。

    (3)    掌握词法分析程序的实现方法。

    (4)    用C语言对一个简单语言的子集编制一个一遍扫锚的编译理解,掌握编译程序的实现方法和技术。

    二、        实验内容和要求

    1,待分析的简单语言的词法。

    2,各种单词符号对应的种别码。

    3,词法分析程序的功能(输入,输出)。

     

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

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

    可执行程序名:1.exe

    2.      原理分析及流程图

    主要总体设计问题。

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

    词法分析主程序示意图

     

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

    #include <stdio.h>                 
    #include <string.h>               
    #include <conio.h>                
    #include <ctype.h>                 
    char prog[80]={'\0'},token[8];                    
    char ch;
    int syn,n,sum,m,p;                         
    char *rwtab[6]={"begin","if","then","while","do","end"};
    void scaner()
    {
        m=0;
        sum=0;
        for(n=0;n<8;n++)
            token[n]='\0';
        ch=prog[p++];
        while(ch==' ')
            ch=prog[p++];
        if(isalpha(ch))   
        {
            while(isalpha(ch)||isdigit(ch))    
            {
               token[m++]=ch;
               ch=prog[p++];
            }
               token[m++]='\0';
               ch=prog[p--];
               syn=10;
               for(n=0;n<6;n++)
                if(strcmp(token,rwtab[n])==0)   
                {
                    syn=n+1;
                    break;
                }      
           }
                else
            if(isdigit(ch))    
            {
                while(isdigit(ch))    
                {
                sum=sum*10+ch-'0';
                ch=prog[p++];
                }
                ch=prog[p--];
                syn=11;
            }
            else
                switch(ch)
            {
                    case'<':m=0;token[m++]=ch;ch=prog[p++];
                            if(ch=='>')
                            {
                                syn=21;
                                token[m++]=ch;
                            }
                            else if(ch=='=')
                            {
                                syn=22;
                                token[m++]=ch;
                            }
                                else
                                {
                                     syn=20;
                                     ch=prog[p--];
                                }
                            break;
                    case'>':m=0;token[m++]=ch;ch=prog[p++];
                            if(ch=='=')
                            {
                                syn=24;
                                token[m++]=ch;
                            }
                            else
                            {
                                syn=23;
                                ch=prog[p--];
                            }
                            break;
                 case':':m=0;token[m++]=ch;ch=prog[p++];
                         if(ch=='=')
                         {
                             syn=18;
                             token[m++]=ch;
                         }
                         else
                         {
                             syn=17;
                             ch=prog[p--];
                         }
                         break;
                 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=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:syn=-1;
    }
    }
    main()
    { 
        p=0;
        printf("\n请输入需要分析的字符串,以#表示结束:");
        do 
        {
               ch=getchar();
               prog[p++]=ch;
         }while(ch!='#');
       p=0;
       do
       {
            scaner();
            switch(syn)
            {
                case 11: printf("(%d,%d)\n",syn,sum);break;
                case -1: printf("\n 出错;\n");break;
                default: printf("(%d,%s)\n",syn,token);
            }
        }while(syn!=0);
        getch();
    }

    4.      运行结果及分析

    四、实验总结

    词法分析让我知道我还有很多不会的地方,甚至需要上网查找和问同学,还需认真努力学习。

  • 相关阅读:
    PHP 设计模式系列 —— 资源库模式(Repository)
    在 Laravel 5 中使用 Repository 模式实现业务逻辑和数据访问的分离
    laravel集合
    2013项目总结
    项目总结
    到底创建了几个String对象?
    String s=new String("abc")创建了几个对象?
    局部刷新
    robot framework 在pycharm中语法无法高亮显示的,显示绿色解决办法(Robot Framework with PyCharm)
    UNIX环境高级编程——进程管理和通信(总结)
  • 原文地址:https://www.cnblogs.com/TopHin/p/5961317.html
Copyright © 2011-2022 走看看