parsing - 跳出深度递归函数调用

标签 parsing exception recursion swift

我用 Objective-C 编写了一个关于高度模糊语言的解析器。一切正常。我经常跳出许多抛出异常的函数调用(我一直在我的代码中,所以异常永远不会从解析器中消失)。

我想到将代码移植到 Swift 中,然后我发现 Swift 中没有异常处理。

我不想也不需要异常处理,但是跳出许多不同的嵌套函数调用在编写解析器.

在Swift中,有什么好的方法可以代替将异常跳转到@catch block 吗?


递归函数的例子,让它更清楚(工作 Playground 代码):

import Foundation

func addToSum(sum: Int, rest: String) -> Int {
    if rest == "" {
        return sum
    } else {
        if rest[rest.endIndex.predecessor()] != "i" {
            // can't throw exception, if scratches is like "iiiiiiiiiiiioiiiiii"
        }

        var shorterRest = rest.substringToIndex(rest.endIndex.predecessor())
        return addToSum(sum + 1, shorterRest)
    }
}

let scratches = "iiiiiiiiiiiiiiiiiiiii"
var sum = addToSum(0, scratches) // sum is 11 ;-)

我知道这个例子不是很好,因为它只有一个函数,你可以很容易地添加一个错误,但后来我不得不返回每个函数回调。

请看大图。我不需要在解析器中进行回溯。


Here是具有相同问题的链接:Use exceptions as flow control in parsers。不幸的是,它没有给出答案。

最佳答案

在这种情况下,通过返回一个 Optional 可以很容易地处理这个问题。不是抛出异常,而是返回 nil 并让它传播回链。

func addToSum(sum: Int, rest: String) -> Int? {
    if rest == "" {
        return sum
    } else {
        if rest[rest.endIndex.predecessor()] != "i" {
            return nil
        }

        var shorterRest = rest.substringToIndex(rest.endIndex.predecessor())
        return addToSum(sum + 1, shorterRest)
    }
}

let scratches = "iiiiiiiiiiiiiiiiiiiii"
var sum = addToSum(0, scratches)  // sum is 21, actually
sum = addToSum(0, "iiiioiii")     // sum is now nil

关于parsing - 跳出深度递归函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25315702/

相关文章:

c++ - 如何读取可能以字符串或数字开头的行?

c# - 如何处理来自同一个异常对象的不同类型的异常?

c++ - what() 未打印的重新抛出异常的自定义错误消息

java - 获取树结构中所有可能的路径

java - next 无法解析为 java 中的值或字段

比较两个没有 CR LF 的字符数组

regex - 解析正则表达式时创建自动机

java - 如何编写通用日志解析器

java - TypeNotPresentExceptionProxy

c - 在递归函数中打印函数参数