文法分析程序

实验一、××实验

专业   姓名  学号

一、        实验目的

 

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

二、        实验内容和要求

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

              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语法�实验前首先要写出分析表然后写出实验输出的分析过程�然后再写代码�分析实验结果。

 

原文地址:https://www.cnblogs.com/wwc000/p/6185118.html