📜  在语法中删除直接和间接的左递归(1)

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

在语法中删除直接和间接的左递归

在语法中,左递归指的是产生式的右部能够匹配到以产生式左部开始的句子,而直接左递归和间接左递归是左递归中的两种情况。直接左递归是指一个产生式的右部以产生式的左部开始,而间接左递归则是通过多个产生式之间的循环引用导致左递归的产生。

直接左递归会导致左递归消耗大量的内存和时间,同时也会影响到计算机语言的编译器的运行效率。因此,在编写代码时,需要尽可能地避免直接左递归的出现。

解决直接左递归的方法有两种,一种是使用左因子消除,一种是使用递归下降语法。同时,我们还需要对间接左递归进行处理。

左因子消除

左因子消除是一种通过消除左公因子的方法使得直接左递归转化成为非左递归的方法。假设我们有如下的产生式:

A -> Aalpha | beta

其中,A是一个非终止符号,alpha和beta是由终止符号和非终止符号组成的符号串。左因子消除的过程如下:

  1. 将产生式改写为以下形式:

    A -> betaR
    AR -> alphaR | ε
    
  2. 将主产生式的右侧的所有出现A的位置替换为betaR。

    A -> betaR
    AR -> alphaR | ε
    B -> gamma
    

    这样,我们就成功消除了直接左递归。

在间接左递归的情况下,我们需要使用对两个非终止符号之间的循环引用进行展开的方法来解决。下面是一个例子:

A -> Balpha
B -> Cbeta
C -> Aphi | gamma

我们可以首先展开A的产生式,然后根据B和C的产生式进行展开,得到以下的结果:

A -> Cbetaalpha | gammabetaalpha | phialpha
B -> Cbeta
C -> Aphi | gamma

这样,我们就成功消除了间接左递归。

递归下降语法

递归下降语法是一种基于产生式的自顶向下的分析方法,在语法分析过程中施加了递归功能,可以较为方便地解决左递归问题。递归下降语法是一种自上而下的分析方法,从最高层次的语法符号开始,不断调用自己或其子例程, 直到达到最低层的终结符号为止。

递归下降语法的基本思路是对于每个非终止符号,我们都写一个函数来处理,当遇到终止符号时,我们就结束函数的递归调用。因此,在代码的处理过程中,我们需要使用递归的方法来解决左递归问题。

总结

通过左因子消除和递归下降语法这两种方法,我们可以有效地解决直接和间接左递归问题。在处理语言系统时,我们需要密切关注语法规则中的左递归问题,避免在规则设计阶段就出现错误,从而导致整个系统的不稳定。