现在理解得还不是很好,先去做PA3,在做作业的过程中加深理解。

错误处理

在语法分析阶段,我们要检查程序中的语法是否正确,如果有错误,需要一些方法报错,以及越过错误点继续检查。

下面是几个错误处理方法

恐慌模式

最简单同时也是使用最多的方法。

当遇到一个错误时,我们跳过一些输入字符,直到遇到指定的字符(串)后从该处继续检查,这些指定的字符需要人为设置,通常称为同步字符(synchronizing token)。

错误产生式

在产生式集合中加入可以推导出常见错误的产生式,这样,在推导过程中会导出错误的字符串,此时我们就知道产生了错误,就可以基于此给出错误信息。

局部和全局纠正

当错误产生时,在错误点修改(增删改)尽可能少的字符,以使程序正确,这个方法目前仅具理论价值。

Abstract Syntax Tree

AST是语法分析树的简化版本,如:

可以被如下AST代替:

自顶向下的语法分析

在自顶向下的分析中,我们要从开始符开始,如果通过推导得到了输入串,那么说明没有语法错误,并且在这个过程中我们也生成了语法分析树,如果不能推导出,则程序有语法错误。

有两种方法,第一种说白了,就是普通的深度搜索算法,其中会发生回溯,开销较大,不常用,而第二种是不会发生回溯的搜索,比较常用,结果都是给出一个字符串的最左推导或报错。

带回溯的深度搜索算法

对于当前的公式,从左到右对每个非终结符的可能推导一个一个尝试,直到找到结果(返回答案),或发现不匹配(回溯),如果所有可能都无法匹配,那么报错。

左递归

如果存在S→Sa∣bS\rightarrow Sa|bS→Sa∣b这种右侧的第一个符号为非终结符的表达式,可能会发生无限递归的情况,称为左递归,为了消除这种无线递归,将这种表达式重写为S→b∣AS\rightarrow b|AS→b∣A和A→aAA\rightarrow aAA→aA,更复杂的情况需要更一般化的处理。

不带回溯的预测算法

通过查看目标字符串中的下一个字符,可以指导我们选择哪一个产生式进行推导,从而避免了繁琐的回溯过程。在这里需要使用LL(k)语法。

LL(k)语法

LL(k)语法是产生式的另一种书写方式,下面的产生式:

可以写成:

即将公式右侧以相同字符开始的部分合并,这样,每次对于相同的字符,仅有一种选择,就可以避免回溯的发生。

First(a)

从上面的LL(k)语法看出,我们需要知道从一个字符可以推导出的首个字符有哪些。

将从a可以推出的字符串的首字符的集合记为First(a)

First(a)的方法:

  • a为终结符,则First(a) = {a}
  • a为非终结符,且有a→Y1Y2...Yna\rightarrow Y_1Y_2...Y_na→Y1​Y2​...Yn​,对于任意i∈[1,n]i \in [1,n]i∈[1,n],若有Y1Y2...Yi−1⇒∗ϵY_1Y_2...Y_{i-1} \Rightarrow ^* \epsilonY1​Y2​...Yi−1​⇒∗ϵ,则First(Yi)⊆First(a)First(Y_i) \subseteq First(a)First(Yi​)⊆First(a),即First(Yi)First(Y_i)First(Yi​)的元素都可以计入First(a)First(a)First(a)
  • 如果有a→ϵa\rightarrow \epsilona→ϵ,则将ϵ\epsilonϵ加入。

Follow(a)

龙书P 130。

自底向上的语法分析

与前面的方法相反,在这里,我们从输入串开始,通过反向推导产生式,最后如果得到开始符,说明没有语法错误,否则报错。

CS143 6、7. 自顶向下和自底向上的语法分析相关推荐

  1. 《编译原理》-用例题理解-自底向上的语法分析,FIRSTVT,LASTVT集

    <编译原理>-用例题理解-自底向上的语法分析,FIRSTVT,LASTVT集 上一篇:<编译原理>-用例题理解-自顶向下语法分析及 FIRST,FOLLOW,SELECT集,L ...

  2. python实现自顶向下,自底向上

    常用的算法设计思想主要有动态规划.贪婪法.随机化算法.回溯法等等,这些思想有重叠的部分,当面对一个问题的时候,从这几个思路入手往往都能得到一个还不错的答案. 本来想把动态规划单独拿出来写三篇文章呢,后 ...

  3. 自底向上分析语法分析程序设计与实现

    自底向上分析语法分析程序设计与实现 一.实验任务及内容 编制一个文法的输入,从键盘.文件或文本框输入给定文法,依次存入输入缓冲区(字符型数据). 编制一个算法,模拟LR(0)分析器的主控流程,实现对给 ...

  4. 人体姿态估计 自顶向下与自底向上

    自顶向下 自顶向下的算法先从图像中检测出所有人,随后利用单人姿态估计的方法对所有人进行姿态估计.自顶向下算法的缺点是算法运行效率随着人数增加而降低,且部分被遮挡的人无法被检测,精度不高. 自底向上 自 ...

  5. 自顶向下和自底向上测试的优缺点

    自顶向下测试方法的主要优点是不需要测试驱动程序,能够在测试阶段的早期实现并验证系统的主要功能,而且能在早期发现上层模块的接口错误. 自顶向下测试方法的主要缺点是需要存根程序,可能遇到与此相联系的测试困 ...

  6. 【软件测试】简述自顶向下和自底向上两种集成测试方法

    自顶向下的集成是从主控模块(主程序,即根结点)开始,按照系统程序结构,沿着控制层次从上而下,逐渐将各模块组装起来.在从上向下的集成测试过程中,需对那些未经集成的模块开发桩模块.在集成过程中,可以采用宽 ...

  7. 自顶向下和自底向上的估算方式

    软件项目的估算通常可以采用以下二种不同的方式:自顶向下估算和自底向上估算. 在自顶向下的估算方式中,首先对软件项目某些属性的整体值(如整个项目的规模.工作量和成本)进行估算,然后根据这一估算值,软件项 ...

  8. 自顶向下与自底向上的归并排序

    自顶向下的归并排序 在本节中我们所讨论的算法都基于归并排序这个简单的操作,即将两个有序的数组归并排序成一个有序数组.很快人们就根据这个操作发明了一种简单的归并算法.要将一个数组排序,可以先将它分成两半 ...

  9. 自顶向下 与自底向上解决01 背包问题

    01背包问题具体例子:假设现有容量10kg的背包,另外有3个物品,分别为a1,a2,a3.物品a1重量为3kg,价值为4:物品a2重量为4kg,价值为5:物品a3重量为5kg,价值为6.将哪些物品放入 ...

最新文章

  1. JSP 开发环境搭建概述
  2. [python]两种编程思维--面向过程和面向对象
  3. Python进阶之路:namedtuple
  4. 【转】log4j 设置将生成的日志进行gz压缩并删除过期日志
  5. 银行现在都很缺钱吗,为什么给的利息比以前高了?
  6. 【ES9(2018)】Promise.prototype.finally()
  7. android 相机应用程序,2020年最佳Android相机的应用程序
  8. html小游戏代码_研发实践:Mozilla分享如何开发一款WebVR小游戏
  9. WinForm多线程+委托防止界面假死
  10. mysql server 6.0_MySQL Server 6.0完全卸载以及卸载中遇到的问题
  11. Activity 过渡动画 — 让切换更加炫酷
  12. GD32 USB调试、DFU过程问题
  13. win10下使用pycharm实现基于pyg的cora+citeseer+pubmed数据集的JKNET模型测试
  14. 网页版数据库管理工具安装教程——phpAdmin
  15. 颜色恒常性评价指标——角度误差【弧度角度】避坑
  16. 通过 irp 请求包删除文件
  17. 最新“量子纠缠”原子使量子计算机更进一步
  18. Elasticsearch 同义词配置
  19. webgoat靶场通关记录
  20. 单片机音乐播放器课程设计C语言,单片机课程设计简易音乐播放器

热门文章

  1. 坎坎坷坷的深度学习之路(一)-环境搭建
  2. 企业高管IT战略指南——企业为何要落地DevOps?
  3. 对docker一些认知
  4. mac电脑开机进入grub界面
  5. 第059篇:高分二号遥感影像预处理流程(ENVI5.3.1平台+ENVI App Store中最新的中国国产卫星支持工具)
  6. 开发一个属于自己的app
  7. Linux系统的时区时间设置
  8. keil 局部变量不能查看值,显示为not in scope
  9. 986-Golang的chan数据结构
  10. 前端白屏问题_小程序白屏问题和内存解决方法