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的预定义函数(比如ln、sin、cos这些):
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




