博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实验四、递归下降语法分析实验
阅读量:5072 次
发布时间:2019-06-12

本文共 1374 字,大约阅读时间需要 4 分钟。

  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

你可能感兴趣的文章
proxy写监听方法,实现响应式
查看>>
第一阶段冲刺06
查看>>
十个免费的 Web 压力测试工具
查看>>
EOS生产区块:解析插件producer_plugin
查看>>
lintcode-easy-Remove Element
查看>>
mysql重置密码
查看>>
jQuery轮 播的封装
查看>>
一天一道算法题--5.30---递归
查看>>
Java基础03 构造器与方法重载
查看>>
这些老外的开源技术养活了很多国产软件
查看>>
JS取得绝对路径
查看>>
排球积分程序(三)——模型类的设计
查看>>
python numpy sum函数用法
查看>>
php变量什么情况下加大括号{}
查看>>
less入门
查看>>
linux程序设计---序
查看>>
【字符串入门专题1】hdu3613 【一个悲伤的exkmp】
查看>>
C# Linq获取两个List或数组的差集交集
查看>>
21.Longest Palindromic Substring(最长回文子串)
查看>>
HDU 4635 Strongly connected
查看>>