递归下降分析程序

实验一、递归下降与分析程序实验

专业:商业软件专业   姓名:吴华锐  学号:201506110140

一、 实验目的

编译识别LL1文法

G[s]:

S→a |∧| (T)

T→T, S | S

转化为LL1文法

S →a |∧| (T)

T →ST'

T'→,ST'| ε

     

 

二、 实验内容和要求

     利用c语言构造语法分析程序

 

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

 

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

源程序名 递归下降分析程序.c

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

  1. 原理分析及流程图

主要总体设计问题。

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

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

#include<stdio.h>

#include <string.h>

void scaner();

void E();

void E1();

void T();

void T1();

void F();

void error();

char proce[100],ch,token[20];

int syn,i,j,m,sum=0;

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

main()

{

    i=0;//记录输入多少个字符

    printf("\n 请输入词法分析程序:");

      do{

                 ch=getchar();

                 proce[i]=ch;

                 i++;

      }while (ch!='#');

      i=0;

      do{

          scaner();

          switch(syn)

                  {

                     case 11: printf("\n(%d,%d)",syn,sum);

                              break;

                     case -1: printf("\n(%s,#)",token);

                              break;

                     default: printf("\n(%d,%s)",syn, token);

                  }

       }while (syn!=0);

 

  printf("\n");

 

    i=0;

 

    scaner();

     E();

     if (syn==0)

              printf("\n 语法正确. \n");

     else     printf("\n  语法失败. \n");

 

}

void scaner()

{

        for (j=0;j<20;j++)

            token[j]=NULL;//token赋值为空

        m=0;

        sum=0;

        ch=proce[i];

        i++;

        while (ch==' ')

        {

            ch=proce[i++];

        }

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

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

                  {

                   token[m++]=ch;

                   ch=proce[i++];//继续看后面的

                  }

 

            syn=10;i--;//判断为变量

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

                if(strcmp(token,keyword[j])==0)

                    {

                        syn=j+1;

                         break;

                     }//如果有可以匹配的就为关键字

           }

 else

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

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

              {

                sum=sum*10+(ch-'0');

                ch=proce[i];

                i++;

              }

              syn=11;

              i--;

            }

          else

                switch(ch)

                {

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

                             m++;

                            ch=proce[i];

                            i++;

                            if (ch=='>')

                                {

                                    syn=21;

                                   token[m]=ch;

                                   m++;

                                 }

                            else if (ch=='=')

                                {

                                    syn=22;

                                   token[m]=ch;

                                   m++;

                                 }

                                 else

                                    {

                                        syn=20;

                                        i--;

                                    }

                             break;

 

                  case '>': m=0;

                            token[m]=ch;

                            m++;

                            ch=proce[i];

                            i++;

                            if (ch=='=')

                            {

                             syn=24;

                             token[m]=ch;

                             m++;

                            }

                            else

                                {

                                    syn=23;

                                    i--;

                                }

                            break;

                  case ':': m=0;

                            token[m++]=ch;

                            ch=proce[i++];

                            if (ch=='=')

                            {

                                syn=18;

                              token[m++]=ch;

                            }

                            else

                                {

                                    syn=17;

                                    i--;

                                }

                            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;

                }

}

void E()

{

    printf("E ");

    T();

    E1();

 

}

void E1()

{

    printf("E1 ");

    if (syn==13)

    {

        scaner();

        T();

        E1();

    }

    else {

        if (syn!=28 && syn!=0)

        error();

    }

}

void T()

{

    printf("T ");

    F();

    T1();

}

void T1()

{

    printf("T1 ");

    if (syn==15) {

        scaner();

        F();

        T1();

    }

    else {

        if (syn!=28 && syn!=0 && syn!=13) error();

    }

}

 

void F()

{

    printf("F ");

    if (syn==27)

    {

        scaner();

        E();

        if(syn==28) scaner();

        else error();

    }

    else if (syn==11 || syn==10)

      scaner();

 

}

 

void error()

{

    printf("\n (%d,%s)语法错误! \n",syn, token);

}

  1. 运行结果及分析

 

 

 

 

 

 

 

四、 实验总结

 

主要是进行消除左递归,这个实验能让自己更加熟悉递归下降分析程序的步骤和方法。

posted on 2016-12-17 11:19  140-吴华锐  阅读(718)  评论(0编辑  收藏  举报