IOS。解析和评估逻辑和数学表达式
IOS. Parsing and evaluating logical and math expressions
我正在寻找一个用于解析和评估 String 中的逻辑和数学表达式的库。我需要的主要功能:
- 检查表达式的类型(逻辑或数学)
- 正在解析和计算数学表达式。例如:“3*(2+1)”
- 正在分析和评估逻辑表达式。例如:“(2+1 == 0) || (5 >= 10)”
- 必须也适用于字符串。例如:" ('B' != 'A') && ('k' != 'K') "
我找到了 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";
我正在寻找一个用于解析和评估 String 中的逻辑和数学表达式的库。我需要的主要功能:
- 检查表达式的类型(逻辑或数学)
- 正在解析和计算数学表达式。例如:“3*(2+1)”
- 正在分析和评估逻辑表达式。例如:“(2+1 == 0) || (5 >= 10)”
- 必须也适用于字符串。例如:" ('B' != 'A') && ('k' != 'K') "
我找到了 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";