You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

OSX DDMathParser:如何在字符串中识别函数Token

DDMathParser Tokenizer无法识别函数Token的问题

我来帮你梳理下这个问题——你当前的代码里,Tokenizer没把ln识别成函数Token,其实是因为DDMathParser的默认Tokenizer并不会自动加载预定义函数列表,它只处理基础的数字、符号和变量。

先把你给出的代码补全并格式化,方便查看:

let equationInputString = "3+ln(2)+var"
do { 
    let tokens = try Tokenizer(string: equationInputString).tokenize() 
    for element in tokens { 
        let tokenString = element.string 
        let tokenKind = element.kind 
        print(tokenString, ";", tokenKind)
    }
} catch {
    print("Tokenization error: \(error)")
}

运行这段代码的话,ln会被标记为变量类型(.variable,而不是函数。要让Tokenizer识别函数,有两种常见的解决方式:

方式一:直接用Parser处理(更贴合求值需求)

如果你最终目的是解析并求值表达式,直接用Parser会更省心,它会自动识别DDMathParser的预定义函数(比如lnsincos这些):

let equationInputString = "3+ln(2)+var"
do {
    let parser = Parser(string: equationInputString)
    // 可以给变量赋值,比如给var设值为5
    parser.variables["var"] = 5.0
    let evaluationResult = try parser.evaluate()
    print("表达式求值结果:\(evaluationResult)")
} catch {
    print("解析或求值出错:\(error)")
}

方式二:给Tokenizer手动配置函数集合

如果你一定要用Tokenizer单独识别函数,需要显式传入你要支持的函数名称集合:

let equationInputString = "3+ln(2)+var"
// 定义你需要识别的函数列表
let supportedFunctions: Set<String> = ["ln", "sin", "cos", "sqrt"]
do {
    let tokenizer = Tokenizer(string: equationInputString, functions: supportedFunctions)
    let tokens = try tokenizer.tokenize()
    for token in tokens {
        print("\(token.string) ; \(token.kind)")
    }
} catch {
    print("Token解析出错:\(error)")
}

这样运行后,ln就会被识别为.function类型的Token了。

本质原因是DDMathParser的Tokenizer默认构造器不会关联预定义函数,必须手动传入函数集合,或者依赖Parser来处理完整的表达式上下文,因为Parser内部会自动加载所有预定义函数。

内容的提问来源于stack exchange,提问作者JFS

火山引擎 最新活动