Математический парсер в Swift

Мне интересно, есть ли какие-нибудь хорошие математические парсеры в Swift. То есть он может взять строку и решить ее. Мне нужно, чтобы в нем были факториалы, экспоненты, квадратные корни и все основные арифметические операторы. Я хочу, чтобы он был встроен в Swift, а не в стороннюю (например, DDMathParser и GCMathParser). Было бы неплохо, если бы вы могли сделать пару из них.

1 ответ

Не существует синтаксического анализатора математических выражений, "встроенного в Swift".

В платформу Foundation включен оценщик выражений, который является частью iOS и Mac OS X и доступен как из Objective-C, так и из Swift. Это называется NSExpression,

Пример:

let expression = NSExpression(format: "2+3*4")
print(expression.expressionValueWithObject(nil, context: nil))
// prints "14"

Она не включает функцию факториала, но в этой статье описывается, как добавить свои собственные функции, и в качестве примера используется факториал. Вам придется перевести пример с Objective-C на Swift.

Основная проблема с использованием NSExpression является то, что, если строка выражения имеет какие-либо ошибки, она просто падает.

:; xcrun swift
Welcome to Apple Swift version 4.0.3 (swiftlang-900.0.74.1 clang-900.0.39.2). Type :help for assistance.
  1> import Foundation
  2> let ex = NSExpression(format: "1+", argumentArray: [])
Process 78868 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = internal ObjC exception breakpoint(-5).
    frame #0: 0x0000000100000e90 repl_swift`repl_swift.repl_main() -> Swift.Int
repl_swift`repl_swift.repl_main() -> Swift.Int:
->  0x100000e90 <+0>: pushq  %rbp
    0x100000e91 <+1>: movq   %rsp, %rbp
    0x100000e94 <+4>: xorl   %eax, %eax
    0x100000e96 <+6>: popq   %rbp
Target 0: (repl_swift) stopped.
ex: NSExpression = <extracting data from value failed>

Execution stopped at breakpoint.  Enter LLDB commands to investigate (type help for assistance.)
(lldb) 

Поэтому, если вы хотите взять строки, предоставленные пользователем, и проанализировать их как математические выражения, вы должны либо написать свой собственный анализатор, либо использовать сторонний анализатор, такой как DDMathParser,

Другие вопросы по тегам