上一篇文章对大部分文法都构造出了一个使用的状态机了,这次主要来讲右递归的情况。右递归不像左递归那么麻烦,因为大部分右递归写成循环也不会过分的让语法树变得难以操作,不过仍然有少数情况是我们仍然希望保留递归的语法树形状,譬如C++的连等操作,因此这里就来讲一下这个问题。
右递归是怎么形成的呢?在这里我们先不想这个问题,我们来看一个普通的文法。在上一篇文章我们已经说过了,如果一条文法有一个非终结符引用了另一条文法,那么就要做一条shift和reduce来从这个状态机穿插到那个状态机上:
开发纪事(六) 构造一个真正能用的状态机(下)-语法树构造">
在这里需要讲一下,绿色的箭头是shift,紫色的箭头是reduce,他们都是ε边。更进一步说,如果A刚好以B作为结尾,那么A的最后一个输入就不是终结符输入,不过因为她不是右递归,所以现在看起来还没什么问题:
我们已经接近右递归的形状了。右递归的一个根本特征当然是递归(废话)。为了制作一个右递归,我们可以想一下,如果A和B不是两个rule而是同一个rule会怎么样?当然咋这么一看,好像就是A可以访问自己了:
时间: 2024-11-08 18:59:45