jstudz81/math-parser

PHP 数学表达式解析器,包括基本函数、变量和隐式乘法。也支持符号微分。

v1.3.13 2018-01-04 09:33 UTC

README

Latest Stable Version Total Downloads License Code Climate

描述

PHP 数学表达式解析和评估库。

预期用途:安全且高效地评估用户提交的公式。该库支持基本算术、基本函数、变量以及额外函数。

词法分析和解析器生成一个抽象语法树(AST),可以使用树解释器遍历。math-parser 库包含三个解释器

  • 一个计算给定表达式值的评估器。
  • 一个微分器,将 AST 转换为表示所提供表达式导数的一个(相对)简化的 AST。
  • 一个基本的 LaTeX 输出生成器,用于使用 MathJax 进行表达式美化打印。

示例

可以微调词法分析和解析器,但库中包含一个 StdMathParser 类,可以标记和解析标准数学表达式,包括算术运算以及基本函数。

use MathParser\StdMathParser;
use MathParser\Interpreting\Evaluator;

$parser = new StdMathParser();

// Generate an abstract syntax tree
$AST = $parser->parse('1+2');

// Do something with the AST, e.g. evaluate the expression:
$evaluator = new Evaluator();

$value = $AST->accept($evaluator);
echo $value;

更有趣的示例,包含变量

$AST = $parser->parse('x+sqrt(y)');

$evaluator->setVariables([ 'x' => 2, 'y' => 3 ]);
$value = $AST->accept($evaluator);

我们可以使用 AST 做其他事情。该库包含一个微分器,可以计算关于给定变量的(符号)导数。

use MathParser\Interpreting\Differentiator;

$differentiator = new Differentiator('x');
$f = $parser->parse('exp(2*x)-x*y');
$df = $f->accept($differentiator);

// $df now contains the AST of '2*exp(x)-y' and can be evaluated further
$evaluator->setVariables([ 'x' => 1, 'y' => 2 ]);
$df->accept($evaluator);

隐式乘法

另一个有用的功能是解析器理解隐式乘法。表达式 2x 的解析方式与 2*xxsin(x)cos(x)^2 的解析方式相同,解析为 x*sin(x)*cos(x)^2

请注意,隐式乘法与显式乘法的优先级相同。特别是 xy^2z 被解析为 x*y^2*z,而不是 x*y^(2*z)

为了充分利用隐式乘法,标准词法分析器只允许单字母变量。(否则,我们无法确定 xy 应该被解析为 x*y 还是作为单个变量 xy)。

文档

对于完整的文档,请参阅 github.io 项目页面

感谢

词法分析器基于 Marc-Oliver Fiset 在其 博客 中描述的词法分析器。

解析器是“Shunting Yard”算法的一个版本,例如由 Theodore Norvell 描述。