NOTE: currently, this uses a fork of swift-parsing fixes a bug that happens when parsing floating-point literals that have a trailing 'e' or 'E' specifier.
let parser = MathParser() let evaluator = parser.parse('4 * sin(t * π) + 2 * sin(t * π)') let v1 = evaluator.eval("t", value: 0.0) // 0.0 let v2 = evaluator.eval("t", value: 0.5) // 6.0 let v3 = evaluator.eval("t", value: 1.0) // 0.0
The parser will return
nil if it is unable to completely parse the expression.
By default, the expression parser and evaluator handle the following symbols and functions:
You can reference additional symbols or variables and functions by providing your own mapping functions. There are two places where this can be done:
If a symbol or function does not exist during an
eval call, the final result will be
NaN. If a symbol is resolved during parsing, it will be replaced with the symbol's value. Otherwise, it will be resolved during a future
eval call. Same for function calls -- if the function is known during parsing and the argument is a known value, then it will be replaced with the function result. Otherwise, the function call will take place during an
One of the original goals of this parser was to be able to accept a Wolfram Alpha math expression more or less as-is -- for instance the definition https://www.wolframalpha.com/input/?i=Sawsbuck+Winter+Form%E2%80%90like+curve -- without any editing. Here is the start of the textual representation from the above link:
x(t) = ((-2/9 sin(11/7 - 4 t) + 78/11 sin(t + 11/7) + 2/7 sin(2 t + 8/5) ...
Skipping over the assignment one can readily see that the representation includes implied multiplication between terms when there are no explicit math operators present (eg
sin(11/7 - 4 x
t)). There is support for this sort of operation in the parser that can be enabled by setting
enableImpliedMultiplication when creating a new
MathParser instance (it defaults to
false). Note that when enabled, an expression such as
2^3 2^4 would be considered a valid expression, resolving to
2^3 * 2^4 = 128.