LL(1)解析器是非递归的谓词解析器,那么为什么LL(1)语法可以是递归的呢?

时间:2018-07-16 16:38:00

标签: parsing recursion ll compiler-construction

LL(1)解析器是非递归的谓词解析器,那么为什么LL(1)语法可能是递归的?累积根据上面的定义,LL(1)语法总是非递归的,但这没有发生。请任何人解释我

1 个答案:

答案 0 :(得分:0)

我认为您的困惑源于这里存在几种不同类型的递归的事实。

首先,存在一个事实,即任何可以生成无限多个字符串的CFG(基本上就是您实际上想在实践中使用的任何CFG)都必须涉及一定量的递归。如果没有任何递归,则只能得到有限的多个字符串。因此,从这种意义上讲,存在 CFG递归,其中存在一些生产规则,导致原始非终端设备在第二(或第三,第四等)时间被生产。

接下来,有解析器的实现方式。一些解析器是使用递归下降或递归回溯实现的。这是一个设计决策,与原始语法是否递归是分开的。我们称其为解析器递归。

通常来说,大多数LL(1)解析器都实现为不使用 parser递归,而是进行大量基于表的查找来确定如何驱动解析。但是,许多LL(1)语法中都有 CFG递归,但这是独立的。

作为示例,请考虑以下(非常简单的)LL(1)语法:

  

A→b | cA

请注意,这里存在CFG递归,因为生产A→cA是递归的。

扩充语法后,我们得到以下语法:

  

S→A $

     

A→b | cA

以下是上述语法的LL(1)解析表:

     | b  | c  | $
-----+----+----+---
  S  | A$ | A$ | acc
  A  | b  | cA | -

我们可以使用此解析表来实现(非迭代)LL(1)解析器,只需跟踪到目前为止的部分匹配并在需要预测要使用的生产时随时查询该表即可。