IOS。解析和评估逻辑和数学表达式

IOS. Parsing and evaluating logical and math expressions

我正在寻找一个用于解析和评估 String 中的逻辑和数学表达式的库。我需要的主要功能:

我找到了 DDMathParser 库,但它无法比较字符串。

DDMathParser 绝对可以比较字符串。您将启用 "interprets strings as variables" 选项,然后添加自定义变量解析器以将变量表达式与另一个变量表达式进行比较,并 return 与 true/false 结果进行比较。

稍后我会回来展示这是如何实现的。

经过一段时间的调查,我决定使用 CoreParse 库。该库使用 BNF 语言来描述语法。在我的例子中,语法有下一个形式:

var expressionGrammar = "Expression     ::= exprb@<BoolExpression> | exprm@<MathExpression> | exprs@<StringExpression>;\n" +
    "MathExpression ::= term@<MathTerm>   | expr@<MathExpression> op@<AddOp> term@<MathTerm>;\n" +
    "MathTerm       ::= fact@<MathFactor> | fact@<MathFactor>     op@<MulOp> term@<MathTerm>;\n" +
    "MathFactor     ::= num@'Number'  | '(' expr@<MathExpression> ')';\n" +
    "MulOp      ::= '*' | '/';\n" +
    "AddOp      ::= '+' | '-';\n" +

    "StringExpression   ::= fact@<StringFactor> | expr@<StringExpression> op@<AddOp> fact@<StringFactor>;\n" +
    "StringFactor       ::= str@'String' | '(' expr@<StringExpression> ')';\n" +

    "BoolExpression ::= term@<BoolTerm> |   term@<BoolTerm> op@<LogicOp> expr@<BoolExpression>;\n" +
    "BoolTerm   ::= fact@<BoolFactor>   |   fact@<BoolFactor> op@<CompareOp> term@<BoolTerm>;\n" +
    "BoolFactor ::= value@<LogicValue>  | '(' expr@<BoolExpression> ')' | factm1@<MathFactor> op@<CompareOp> factm2@<MathFactor>    | facts1@<StringFactor> op@<CompareOp> facts2@<StringFactor>;\n" +
    "CompareOp  ::= '<' | '>' | '>=' | '<=' | '==' | '!=';\n" +
    "LogicOp    ::= '&&' | '||';\n" +
    "LogicValue ::= val@'true' | val@'false';\n";