我最近遇到了PEG解析器,以及Guido van Rossum的article on PEG parsers以及如何构建它们。那篇文章讨论的是“ PEG”解析器,但在内部看起来完全像递归下降解析器(生成器)。我推断PEG解析器与生成递归下降解析器有关,但不确定。
递归下降解析器和PEG解析器有什么区别?什么时候应该使用其中一个?
答案 0 :(得分:3)
PEG是描述递归下降解析器的语法。
当人们谈论解析表达式语法(PEG)时,他们经常混淆三件事:
Bryan Ford(PEG的创建者)在他的2004 article中描述了前两个,但是第一点并不是一个新颖的贡献。相反,就表现力而言,PEG相当于1970年代的top-down parsing language(TDPL),但福特借用了EBNF和regular expression语法的便利方面,使语法易于阅读和书写。极小的TDPL。基本上,PEG的表示法使TDPL更易于使用,例如使用C或Python而不是Assembly编写代码。
在福特基于其硕士论文的2002 article中,他还介绍了Packrat解析算法,该算法允许递归下降解析器(甚至那些具有无限前瞻性的PEG解析器)通过记忆或缓存中间结果而在线性时间内运行。但是,这是理论上的结果,即使对某些病理情况有帮助,但在许多情况下,Packrat记忆的开销非常大。无需Packrat解析即可使用PEG进行解析只是递归下降解析。
与CFG相比,关于PEG形式属性的一个有趣的事情是优先选择运算符(PEG表示法使用/
而不是EBNF的|
进行模棱两可的选择)。通过优先选择,按顺序尝试替代方案,一旦替代方案成功,将不再尝试其他方案。因此,与context-free grammar(CFG)不同,PEG是明确的;有一个输入解析,或者没有解析。相关地,PEG被认为是“分析性”语法,而不是“生成性”语法(例如CFG,其源于描述自然语言话语的语言学),因为它们的目的是解析而不是许可(或生成)有效字符串。 >
您实际上并没有在PEG解析和递归下降解析之间进行选择,因为它们是同一件事,但是您可以选择使用PEG解析库通过语法来实现解析器,而不是手写解析功能。但是,正如Michael Dyck commented一样,PEG是递归下降解析器的子集,因为您可以编写递归下降解析器,而这超出了PEG中可表示的范围。再说一次,许多PEG库以语义动作或其他语法构造等功能扩展了原始形式主义。