• 文法分析程序


    实验一、××实验

    专业   姓名  学号

    一、        实验目的

     

          编制一个语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析。

    二、        实验内容和要求

         实验内容:做一个可以对以下语法的分析程序

                  SàMH|a

                  HàLS-|&

                  Kà+ML|&

                  Là/H

                  MàK|*LM

                  &(空串);

     实验要求:在上机(一)词法分析的基础上,采用递归子程序法或其他适合的语法分析方法,实现其语法分析程序。要求编译后能检查出语法错误。

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

     

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

    源程序名×××.c

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

     

     

     

     

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

           

     

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

    #include <stdio.h>

    #include <string.h>

    char prog[800], token[20];

    char ch;

    int syn,p,m,n,sum;

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

    M();

    scaner();

    error();

    S();

    L();

    H();

    K();

    scaner()

    {

            for (n=0;n<20;n++) token[n]=NULL;

            m=0;

            sum=0;

            ch=prog[p++];

            while (ch==' ') {ch=prog[p++];}

            if (ch>='a'&& ch<='z')

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

                      {

                       token[m++]=ch;

                       ch=prog[p++];

                      }

                syn=10;p--;

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

                    if(strcmp(token,rwtab[n])==0) {syn=n+1;break;}

               }

     else

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

                {while (ch>='0' && ch<='9') {sum=sum*10+(ch-'0'); ch=prog[p++];}

                 syn=11;p--;

                }

              else

                    switch(ch)

                    {

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

                                ch=prog[p++];

                                if (ch=='>') {syn=21;token[m++]=ch;}

                                else if (ch=='=') {syn=22;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=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;token[0]=ch;

                    }

    }

    error()

    {

        printf("错误");

    }

    S()

    {printf("S ");

      if (syn==10) {

               scaner();

        }

        else{

        M();

        H();

        }

    }

    H()

    {printf("H ");

        if (syn!=10 && syn !=13 &&syn!=14 &&syn!=15  && syn!=0)

            error();

        else {

          L();

          S();

          scaner();

        }

    }

    L()

    {printf("L ");

               scaner();

               H();

    }

    M()

    {printf("F ");

        if (syn==15) {

               scaner();

               L();

               M();

        }

        else

            K();

    }

    K()

    {printf("K ");

        if (syn==13) {

               scaner();

               M();

               L();

        }

        else{

            if(syn!=10 && syn!=11 && syn!=0)

                error();

        }

    }

    main()

    {

         p=0;

          printf(" Please input the source code: ");

          do{

                     ch=getchar();

                     prog[p++]=ch;

          }while (ch!='#');

         p=0;

         scaner();

         S();

        if(syn==0)

        {

            printf(" 分析成功");

        }

        else

            printf(" 分析失败);

    }

    1. 4.      运行结果及分析

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

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

    错误语句:

    正确语句:

     

     

     

     

     

     

    四、        实验总结

    实验前首先要明白实验的目的了解什么是LL1语法�实验前首先要写出分析表然后写出实验输出的分析过程�然后再写代码�分析实验结果。

     

  • 相关阅读:
    解决SVN创建补丁乱码问题
    一款监控网络状态的好工具 Smokeping
    微软“2052”文件夹什么意思
    SVN目录大小写漏洞
    探索Emberjs——了解Emberjs
    第一次尝试三层架构<实现简单的增、删、查、改>
    站内搜索1之开篇介绍
    原生的几个javascript常用特效
    如果你喜欢上了一个程序员小伙>献给所有的程序员女友
    站内搜索3之Lucene.Net使用
  • 原文地址:https://www.cnblogs.com/wwc000/p/6185118.html
Copyright © 2020-2023  润新知