简单算术求和的递归解析可以很容易地类比为添加大量括号。递归解析器可能会像这样解析上述总和1+(2.0+(3+(4)))
:这样做的原因是你想把整个事情分解成可以计算的单个工作单元。这意味着每个部分必须最多包含两个数字和一个运算符(递归的基本情况是一个数字)。
每对括号都通过额外的递归级别(函数调用自身)添加。因此,最初的调用会看到类似“1 加上一些复杂的东西,下一级递归将为我处理”。
当尚未达到基本情况时,每次调用都会解析第一个数字和操作。然后,它会在操作后在字符串的下一部分调用自身,并返回操作符的结果,以获取其数字和下一次调用(例如,类似return number + parse(string[length:])
)。
当达到基本情况时(字符串中只剩下一个数字),它不会根据另一个函数调用返回某些内容,而是只返回数字。然后,递归展开,每个函数都获得复数右手边的值。最终,原始调用将返回结果。
这很容易扩展到允许其他运算符,方法是让函数的每个实例都在一个运算符(而不是运算符和一个数字)上工作,以及它左右两边的表达式,从最高优先级的运算符开始。因此,在解析类似 的字符串时0+1+2*3+4
,必须从乘法开始。您的函数返回类似 的function(left-hand-side) operator function(right-hand-side)
内容,最初会像这样解析它(0+1+2)*(3+4)
:这将变成(0+(1+(2)))*(3+(4))
. 您可以沿具有相同优先级的运算符进行线性解析,因此该算法可以迭代查找要递归的乘法或除法,递归找到的第一个;如果没有找到,它可以对加法和减法执行相同的操作,最后如果没有找到,则将数字作为基本情况返回(有趣的是,我给出的后一个示例有 2 个基本情况实例,2 和 4;这是一个功能多重递归)。