实验四、递归下降语法分析实验

  1. 实验目的

    1)掌握自上而下语法分析的要求与特点。

    2)掌握递归下降语法分析的基本原理和方法。

    3)掌握相应数据结构的设计方法。

  2. 实验内容和要求

      编程实现给定算术表达式的递归下降分析器。

    算术表达式文法如下:

     E-->E+T|T

     T-->T*F|F

      F-->(E)|i

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

     

    1. 原理分析及流程图

      1)当遇到终结符a时,则编写语句

      If(当前读到的输入符号==a)读入下一个输入符号

      2)当遇到非终结符A时,则编写语句调用A()

      3)当遇到A-->ε规则时,则编写语句
      If(当前读到的输入符号不属于Follow(A))error()

      4)当某个非终结符的规则有多个候选式时,按LL(1)文法的条件能唯一地选择一个候选式进行推导.

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

      #include<stdio.h>

      void E();

      void T();

      void E1();

      void T1();

      void F();

      char s[100];

      int i, SIGN;

      int main()

      {

      printf("请输入一个语句#号结束语句直接输入#号推出\n");

      while( 1 )

      {

      SIGN = 0;

      i=0;

      scanf("%s",&s);

      if( s[0] == '#')

      return 0;

      E();

      if(s[i]=='#')

      printf("正确语句\n");

      printf("请输入一个语句#号结束语句\n");

      }

      return 1;

      }

      void E()

      {

      if(SIGN==0)

      {

      T();

      E1();

      }

      }

      void E1()

      {

      if(SIGN==0)

      {

      if(s[i]=='+')

      {

      ++i;

      T();

      E1();

      }

      else if(s[i]!='#'&&s[i]!=')')

      {

      printf("语句有误\n");

      SIGN=1;

      }

      }

      }

      void T()

      {

      if(SIGN==0)

      {

      F();

      T1();

      }

      }

      void T1()

      {

      if(SIGN==0)

      {

      if(s[i]=='*')

      {

      ++i;

      F();

      T1();

      }

      else if(s[i]!='#'&&s[i]!=')'&&s[i]!='+')

      {

      printf("语句有误\n");

      SIGN=1;

      }

      }

      }

      void F()

      {

      if(SIGN==0)

      {

      if(s[i]=='(')

      {

      ++i;

      E();

      if(s[i]==')')

      ++i;

      else if(s[i]== '#')

      {

      printf("语句有误\n");

      SIGN=1;

      ++i;

      }

      }

      else if(s[i]=='i')

      ++i;

      else

      {

      printf("语句有误\n");

      SIGN=1;

      }

      }

      }

    3. 运行结果及分析

    4. 实验总结

      运用递归下降分析法完成了本试验的语法分析构造,并且成功的分析出每种正确的句子和错误的句子。函数的构造是根据文法分析的递归过程,所编写每个函数的功能,以文法的右部为函数名,对应的左部为相应分析过程。此分析法简单,直观,易构造分析程序,但是不适于文法过于复杂的,不易检查出错误。

原文地址:https://www.cnblogs.com/cs007/p/6188638.html