• 201506110097-试验一实验报告


    格式说明:排版时注意按此模板的字体,字号和行距。

    报告提交和打印输出时请去掉此框。

    实验一、词法分析实验

    专业:商业软件工程一班   姓名:黄大贞  学号:201506110097

    一、        实验目的

     

          设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。

    二、        实验内容和要求

    1、待分析的简单的词法

    (1)保留字:if,else, for, while, do, int ,read, write,real,char

    (2)纯单分界符:+ — * () {} ; : ,

    (3)双分界符:> < = ! ,&&,||

    2 、实现功能:

    (1)在命令行中输入源程序文件名(包括文件名路径)

    (2)输入目标文件名(包括文件名路径)

    (3)调用所编词法分析代码将分析结果写入目标文件代码(编译完成) 三、词法分析程序的算法思想:算法的基本任务是从源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,分析与代码中相应的单词符号。

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

     

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

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

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

    主要总体设计问题。

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

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

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

    #include<stdio.h>                  /*定义I/O库所用的某些宏和变量*/
    #include<string.h>               /*定义字符串库函数*/
    #include<conio.h>                  /*提供有关屏幕窗口操作函数*/
    #include<ctype.h>                  /*分类函数*/
    char prog[80]={''},
         token[8];                     /*存放构成单词符号的字符串*/
    char ch;
    int syn,                           /*存放单词字符的种别码*/
          n,
        sum,                           /*存放整数型单词*/
        m,p;                           /*p是缓冲区prog的指针,m是token的指针*/
    char *rwtab[6]={"begin","if","then","while","do","end"};
    void scaner(){
        m=0;
        sum=0;
        for(n=0;n<8;n++)
            token[n]='';
        ch=prog[p++];
        while(ch==' ')
            ch=prog[p++];
        if(isalpha(ch))    /*ch为字母字符*/
     {
            while(isalpha(ch)||isdigit(ch))    /*ch 为字母字符或者数字字符*/
      {
               token[m++]=ch;
               ch=prog[p++];}
            token[m++]='';
            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))    /*ch是数字字符*/
      {
                while(isdigit(ch))    /*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("please input string: ");
        do {
               ch=getchar();
               prog[p++]=ch;
           }while(ch!='#');
        
    p=0;
        do{
            scaner();
            switch(syn){
                case 11: printf("(%d,%d) ",syn,sum);break;
              //  case -1: printf(" ERROR; ");break;
                default: printf("(%d,%s) ",syn,token);
    }
    }while(syn!=0);
        //getch();

    }

    1. 2.      运行结果及分析

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

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

     

    一、        实验总结

    通过编译原理的这次程序实验,在自已动手体验的情况下,更加透彻地理解了词法分析的过程,以及该算法。对于以后由模型向程序代码的转化能力上,有了很大的锻炼。以后我会更加专心的研究计算机知识,不断将现实中遇到的实际问题,向程序方面转变,做到灵活运用所学知识。

  • 相关阅读:
    MybatisPlus常用操作和配置
    C# Socket编程 同步以及异步通信
    PostgreSQL学习手册(PL/pgSQL过程语言)
    PostgreSQL学习手册(客户端命令<一>)
    PostgreSQL学习手册(服务器配置)
    PostgreSQL学习手册(系统视图)
    PostgreSQL学习手册(客户端命令<二>)
    PostgreSQL学习手册(角色和权限)
    PostgreSQL学习手册(数据库管理)
    PostgreSQL学习手册(系统表)
  • 原文地址:https://www.cnblogs.com/qq157049540/p/5961121.html
Copyright © 2020-2023  润新知