Parsing LL算法分类的问题

Parsing LL算法分类的问题,parsing,computer-science,grammar,context-free-grammar,ll,Parsing,Computer Science,Grammar,Context Free Grammar,Ll,我正在研究上下文无关语法,我被困在第一步:理解自上而下的解析算法是如何构造的 我的问题围绕着自顶向下的解析器。我介绍了三种算法: 递归下降 预测的 预测递归下降 问题 但我不明白如何将它们联系起来。因此,请回答以下问题: 递归下降是基于回溯和低效的吗 预测性语法分析是一种与其他两种完全不同的算法,这是真的吗 预测递归下降是一种特殊的递归下降算法,但没有回溯,这是真的吗 预测算法使用解析表,递归下降算法不使用,这是真的吗? 预测递归下降算法使用预测解析表(一种增强的解析表)是真的吗 请回答

我正在研究上下文无关语法,我被困在第一步:理解自上而下的解析算法是如何构造的

我的问题围绕着自顶向下的解析器。我介绍了三种算法:

  • 递归下降
  • 预测的
  • 预测递归下降
问题 但我不明白如何将它们联系起来。因此,请回答以下问题:

  • 递归下降是基于回溯和低效的吗
  • 预测性语法分析是一种与其他两种完全不同的算法,这是真的吗
  • 预测递归下降是一种特殊的递归下降算法,但没有回溯,这是真的吗
  • 预测算法使用解析表,递归下降算法不使用,这是真的吗? 预测递归下降算法使用预测解析表(一种增强的解析表)是真的吗
请回答这个问题:

  • LL解析器使用哪种算法?预测,预测递归下降还是递归下降

谢谢

递归下降允许您实现一定范围的正式解析器。例如,它允许开发LL(k)解析器。在LL情况下,递归下降不需要回溯,也就是说,鉴于LL的性质,解析器不会意识到它遗漏了一些解析规则。另一方面,递归下降还允许您实现使用回溯的解析器。因此,您可以使用回溯,也可以不使用回溯,还可以使用递归下降来填充一系列解析器族

递归下降没有内置的效率保证。这取决于您编写的代码以及您要解决的问题。C语言家族的clang解析器是递归的,具有回溯功能,作者认为它是解析C语言的正确方法

我不确定有关预测性解析的术语,wikipedia建议它是一个没有回溯的递归下降解析器,就像上面的例子一样,但是这种情况被称为预测性递归下降解析器更有意义。有一些课堂讲稿指出,预测性解析器不是隐式使用堆栈来保存解析器状态的解析器。在这种情况下,例如,预测解析器使用显式管理的堆栈,可能由具有解析规则的表驱动

鉴于递归下降和预测解析作为两种解析实现技术之间的对比,我认为递归解析器是一种使用递归函数(并隐式使用堆栈)实现解析器的方法,而预测解析是一种使用表和显式堆栈实现解析器的方法(但没有递归函数)。预测性递归下降表明有一个使用表和递归函数的解析器,这在我看来很奇怪。最糟糕的情况是,预测性递归下降解析器是一个没有回溯的递归下降解析器(而不是预测性解析器),它的名称很难看

概念上的LL解析器既可以转换为递归下降解析器(即一组递归函数),不会进行任何回溯,因为LL不需要它,也可以转换为预测解析器(即while循环+堆栈+表)

学习递归下降解析器的最佳方法是学习万花筒语言教程:


预测解析器是一个具有多种形式的通用解析器家族(LL和LR解析器是比较突出的示例)。预测解析器通常通过尝试“预测”使用哪些产品(或应用哪些缩减)来工作通过使用解析当前状态的一些知识。例如,在LL解析中,解析器尝试根据当前非终结符和输入的下几个字符预测应用哪个产品。在LR解析中,预测是基于下一个终结符在特定时间点执行哪些缩减(如果有)输入的ls和解析器的当前配置

许多(但不是全部)预测解析器都是表驱动的。LR解析器通常使用表来实现,一些LL解析器也是如此,尽管情况并非总是如此。许多LL解析器使用递归下降来实现,而许多LR解析器使用递归上升来实现

递归下降解析通常是指自上而下的解析算法,该算法通过对每个终端和非终端使用不同的递归函数来猜测要使用的产品。它们通常根据语法使用一定量的回溯,并且通常在左递归语法上失败。通常,手工编写的LL解析rs是使用无回溯的递归下降编写的,这是可能的,因为语法是专门构造的,不需要任何回溯。这是预测性递归下降

使用回溯时,递归下降可能会非常低效。通常,您不会在需要这样回溯的语法上使用递归下降

希望这有帮助