递归下降分析算法是自顶向下分析算法的一部分。

递归下降分析算法

  • 也称为预测分析

    • 分析高效(线性时间)
    • 容易实现(方便手工编码)
    • 错误定位和诊断信息准确
    • 被很多开源和商业的编译器所采用
      • GCC 4.0, LLVM, ...
  • 算法基本思想
    • 每个非终结符构造一个分析函数
    • 前看符号指导产生式规则的规则

对于给定的文法G如下:

S -> N V N
N -> s| t| g| w
V -> e| d

我们写出它的递归下降算法如下:

parse_S

一般算法框架

X -> β11 ... β1i| β21 ... β2j| β31 ... β3k| ...

对应的代码实现如下:

parse_X

举个例子,当 β11 ... β1i 为 a B c D 时,也就是 i 为 4。(其中大写表示非终结符,小写为终结符),则其分析过程如下:

parse_X

当然,使用递归下降算法也存在一定的问题,当对于上面给出的算法框架的第三行我们也是 a 开头的一些类符号的时候,当读入前看字符为 a 的时候,不仅仅可以对第一行的 a B c D 的判断执行操作,对于第三行也可以。

对算数表达式的递归下降分析

E -> E + T| T
T -> T * F| F
F -> num

对于给定的上述文法,我们应用其对句子 3+4*5 做语法分析

// a first try
parse_E()token = tokens[i++]if(token == num)? //  E+T or Telse error("...") 

然而该算法存在一定的问题,对于 token == num的情况下,我们不知道如何做出判断,因为就 E 可以推导出的结果来说 T 可以通过 F 推出 num, 而 E + T由于是 T 的递归,所以 T 能推出的 num , E +T 也可以推出。存在选择问题。

那么我们需要对算法进行改进。

对于 E 可以推出的 T 的结果可以衍生为 T+T+...+T,

而对于 T 可以推出的 F 的结果可以变为 F*F*...*F

于是我们可以构建新的算法,对上面的两个衍生结果进行判断。

// a second try
parse_E()parse_T()token = tokens[i++]  while(token == +)parse_T()token = tokens[i++]parse_T()parse_F()token = tokens[i++]  while(token == *)parse_F()token = tokens[i++]


原文链接:

  • 编译原理 - 网易云课堂

递归下降分析法的基本思想。_语法分析 | 递归下降分析算法相关推荐

  1. 软件测试 边界值分析法,[转] 软件测试方法_边界值分析法

    目录: ①边界值分析法的介绍和概念 ②边界值分析法的原理和思想 ③单缺陷假设和多缺陷假设 ④边界值测试数据类型 ⑤内部边界值分析 ⑥各类边界值测试介绍 ⑦基于边界值分析方法选择测试用例的原则 ⑧边界值 ...

  2. pde中微元分析法的主要思想_果然是清北学霸,高中数学解题思想与技巧方法,学会不下145分...

    美国著名数学教育家波利亚说过,掌握数学就意味着要善于解题.而当我们解题时遇到一个新问题,总想用熟悉的题型去"套",这只是满足于解出来,只有对数学思想.数学方法理解透彻及融会贯通时, ...

  3. pde中微元分析法的主要思想_初中数学常用的思想方法丨所有题型的考试技巧最全整理,高分必备...

    [导语]初中数学虽然是基础数学,但是这并不意味着就没有难度,特别是在素质教育下,从培养学生综合素质能力的角度出发,初中数学越来越重视数学思维的培养,因此在很多数学问题的设置上,都进行了相当难度的调整, ...

  4. 数学建模层次分析法例题及答案_斩获国际特等奖!兰理工数学建模团队为百年校庆献礼...

    近日,2019年美国大学生数学建模竞赛(MCM-ICM)成绩正式公布. 兰州理工大学数学建模团队再创佳绩,分别获得国际特等奖(Outstanding Winner)1项.一等奖(Meritorious ...

  5. matlab层次分析法程序购置设备,[转载]MATLAB实现层次分析程序

    层次分析法(AHP)适用于那些难于完全定量分析的问题.运用层次分析建模,大体上可按下面四个步骤进行: (1)建立递阶层次结构模型: (2)构造出各层次中的所有判断矩阵: (3)层次单排序及一致性检验: ...

  6. 递归下降分析法的基本思想。_还不懂这八大算法思想,刷再多题也白搭!

    各位朋友好久不见呢.最近由于刚入职,作为职场萌新,所以大部分时间都花在了工作上.因而也没有太多时间来写文章啦,这篇文章也是定题了许久,迟迟没有落笔.等之后工作慢慢稳定,业务熟练起来,文章更新频率就会高 ...

  7. pde中微元分析法的主要思想_有限元方法的核心思想

    有限元法(Finite Element Method)是基于近代计算机的快速发展而发展起来的一种近似数值方法,用来解决力学,数学中的带有特定边界条件的偏微分方程问题(PDE).而这些偏微分方程是工程实 ...

  8. python亲和性分析法推荐电影论文_数据挖掘-MovieLens数据集_电影推荐_亲和性分析_Aprioro算法...

    #!/usr/bin/env python2 # -*- coding: utf-8 -*- """ Created on Tue Feb  7 14:38:33 201 ...

  9. python亲和性分析法推荐电影论文_关于《Python数据挖掘入门与实战》读书笔记二(亲和性分析)...

    #原文的代码比较零散,网上的代码大多数互抄,先基于个人的理解对代码进行了归纳整理,并添加了注释importnumpyasnpfromcollectionsimportdefaultdictfromop ...

最新文章

  1. ros 消息队列与缓冲区_Spring Boot消息队列系统:RocketMQ初入门
  2. [20170420]关于延迟块清除3.txt
  3. 玩转Android之在线视频播放控件Vitamio的使用
  4. ECMAScript Query实例
  5. GBin1分享:jQuery新手技巧之“避免过多使用$('.someclass')”
  6. 重庆python就业工资待遇-重庆Python人工智能编程
  7. @EnableAspectJAutoProxy||AOP原理:【看给容器中注册了什么组件,这个组件什么时候工作,这个组件的功能是什么?】
  8. Java创建cookie和删除cookie
  9. 解决网站请求速度慢的一些方法
  10. 【英语学习】【Level 08】U05 Better option L2 Online shopping
  11. 最新!华为HCIA网络工程师题库精讲(02)
  12. Tomcat发布项目后JS中文乱码
  13. VUE源码相关面试题汇总
  14. 中南大学计算机软件专业曾进,中南大学_2012年校级优秀毕业生名单
  15. 金武彩印机械设备有限公司仓储管理系统设计与实现
  16. vue 实现ps图片编辑_Vue项目图片剪切上传——vue-cropper的使用
  17. Unity Shader 之 简单实现物体被压扁(top顶点的逐渐与bottom顶点重合)的效果
  18. python| requests 访问 https网站
  19. 分水岭算法c语言,分水岭算法的概念及原理
  20. 小数点化分数的过程_小学数学分数和小数互化知识点归纳

热门文章

  1. 深入理解JVM--类的执行机制
  2. HTML元素基础学习
  3. HA应用之 -- corosync+pacemaker
  4. 信息化与工业化融合的内涵、层次和方向
  5. Jmail 发送邮件错误
  6. Error:(1, 1) java: 非法字符: ‘\ufeff’
  7. 51nod 1680区间求和 (dp+树状数组/线段树)
  8. UITextInputMode
  9. RabbitMQ、Redis
  10. 长城守卫 Beijing guards CERC 2004 LA3177 解题总结