没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|使用教程|编辑:郑恭琳|2018-01-08 10:55:18.000|阅读 564 次
概述:在这篇文章中,我们继续深入分析自顶向下的分析算法,包括Packrat(PEG),递归下降分析器,Pratt分析器和分析器组合器。
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
相关链接:
一定要先看看第7部分!如果您第一次遇到这个系列,您可以在本文顶部找到其余的帖子。
Packrat经常与正式语法PEG相关,因为它们是由同一个人Bryan Ford发明的。Packrat在他的论文中首先被描述了:标题说几乎所有我们关心的事情:它有一个线性的执行时间,不使用回溯。
其效率的另一个原因是记忆:在解析过程中存储部分结果。缺点是,直到最近才使用该技术的原因是存储所有中间结果所需的内存数量。如果所需的内存超过了可用的内存,算法将失去执行的线性时间。
Packrat也不支持左递归规则,因为PEG需要总是选择第一个选项。实际上,一些变体可以支持直接的左递归规则,但是以牺牲线性复杂性为代价。
如果需要的话,Packrat解析器可以执行无限量的lookahead。这会影响执行时间,在最坏的情况下可能是指数级的。
递归下降解析器是一个解析器,它与一组(相互)递归过程一起工作,对于语法的每个规则通常是一个过程。因此,解析器的结构反映了语法的结构。
termpredictive解析器以几种不同的方式使用:有些人把它作为自顶向下解析器的同义词,有些人认为它是从不回溯的递归下降解析器。
第二个含义的反义词是一个递归下降解析器,它会回溯。也就是说,通过依次尝试每一个规则,然后每次失败就返回,找到与输入相匹配的规则。
通常,递归下降解析器在解析左递归规则时会遇到问题,因为算法会一次又一次地调用同一个函数。这个问题的一个可能的解决方案是使用尾递归。使用此方法的解析器称为尾递归解析器。
尾递归本身只是在函数结束时发生的递归。然而,尾部递归与语法规则的转换一起使用。转换语法规则和在过程结束时进行递归的组合允许处理左递归规则。
Pratt解析器是一个广泛未使用的,但非常值得赞赏的(由少数人知道的),由Vaughan Pratt在一篇名为“”的论文中定义的解析算法。本文首先从BNF语法的论战开始,笔者认为错误的是解析研究的唯一问题。这是缺乏成功的原因之一。实际上,该算法不依赖于语法,而是直接对tokens进行操作,这使解析专家变得不同寻常。
第二个原因是,如果你有一个有意义的前缀来帮助区分不同的规则,那么传统的自顶向下的解析器就能很好地工作。例如,如果您得到token FOR,您正在查看for语句。由于这基本上适用于所有的编程语言及其语句,所以很容易理解为什么Pratt解析器没有改变解析世界。
Pratt算法的亮点在于表达式。事实上,优先的概念使得不可能仅仅通过查看tokens的顺序来理解输入的结构。
基本上,该算法要求您为每个运算符token分配一个优先值,并根据token的左侧和右侧确定要执行的操作。然后,它使用这些值和函数在遍历输入的同时将操作绑定在一起。
虽然Pratt算法没有公开地成功,但它用于解析表达式。JSLint也为Douglas Crockford(JSON成名)所采用。
解析器组合器是一个高阶函数,接受解析器函数作为输入,并返回一个新的解析器函数作为输出。解析器函数通常意味着接受一个字符串并输出解析树的函数。
解析器组合器是模块化的并且易于构建,但是它们也比较慢(在最坏的情况下它们具有O(n4)复杂性)并且不太高端。它们通常被用于更简单的解析任务或原型设计。从某种意义上说,解析器组合器的用户部分手动构建解析器,但依赖于创建解析器组合器的人所做的艰苦工作。
通常,它们不支持左递归规则,但是有更高级的实现可以做到这一点。例如,参见,其也设法描述具有执行多项式时间的算法。
许多当代实现被称为monadic解析器组合器,因为它们依赖于称为的函数式编程的结构。Monad是一个相当复杂的概念,我们不能在这里解释。但是,monad基本上可以将依赖于数据类型的功能和操作组合起来。关键的特点是数据类型指定如何组合不同的值。
最基本的例子是Maybe monad。这是一个正常类型的包装器,比如整数,在值有效的时候(567)返回值本身,当它不是时(即未定义或被零除),则返回一个特殊的值Nothing。因此,你可以避免使用空值,并毫不客气地崩溃程序。相反,Nothing值是正常管理的,就像管理任何其他值一样。
请继续关注第9部分!
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@dpuzeg.cn
本教程演示DevExpress WinForms的Banded Grid View 是如何进行用户自定义的,欢迎下载最新版组件体验!
可视化项目时间线对于有效规划和跟踪至关重要。在本篇教程中,您将学习如何使用 C# 在 Excel 中创建组合图,只需几行代码,即可自动生成动态、美观的组合图。
本文将为大家介绍DevExpress XAF将.NET Aspire集成到Blazor项目中后如何实现数据库依赖,欢迎下载最新版组件体验!
FP3 文件是使用流行的报表生成工具FastReport创建的报表。这种格式广泛用于存储可立即查看的报表数据,这些数据可以轻松共享或保存以供日后分析。但是,要打开和查看此类文件,需要一个特殊的程序——FastReport Viewer。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@dpuzeg.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢