📜  自顶向下解析器的分类(1)

📅  最后修改于: 2023-12-03 15:11:48.189000             🧑  作者: Mango

自顶向下解析器的分类

在编译器的前端部分,自顶向下解析器是一种常见的语法分析器。自顶向下解析器通常采用递归下降的方法来解析源代码,并且每个非终结符通常会对应一个单独的函数。

LL(1)解析器

LL(1)解析器是一种特定类型的自顶向下解析器。它可以解析满足LL(1)文法的源代码。LL(1)文法具有以下几个性质:

  1. 对于每个非终结符A和输入符号a,最多只有一个产生式可以应用于A --> X。
  2. 对于每个非终结符A,它的每个产生式所产生的符号串的后继集合没有交集。
  3. 如果产生式A --> ε在A中存在,则A不能出现在任何右部产生式中。

LL(1)解析器可以使用一个预测分析表(Parsing Table)来确定下一步要应用的规则。Predictive Parsing Table是LL(1)文法族中用于构建自顶向下解析器的主要数据结构之一。它是一个二维数组,其中每个单元表示一个非终结符和终结符的交叉点。在构建预测分析表时,您需要记住的最重要的事情是消除左递归和左公共前缀。

Recursive Descent解析器

另一种常见的自顶向下解析器是递归下降解析器。这种解析器通常基于源代码和产生式之间明确映射的事实,并且通常具有一对一的函数/过程来实现这些产生式。每个非终结符都将映射到其自己的函数中,而每个终结符都对应于语法中的一个叶节点。

递归下降解析器比LL(1)解析器具有更高的可读性,因为代码通常具有与语法描述相同的形式和结构。但是,递归下降解析器不如LL(1)解析器高效,并且经常需要大量的回溯来正确处理代码。

总结

自顶向下解析器是编译器前端的一部分。LL(1)解析器是一种特殊类型的自顶向下解析器,它使用预测分析表来确定下一步应该应用哪个规则。递归下降解析器是另一种常见的自顶向下解析器,其代码常常具有与语法描述相同的形式和结构。以上两种解析器各有优缺点,程序员应该根据自己的实际情况来选择使用哪种解析器。