jstudz81 / math-parser
PHP 数学表达式解析器,包括基本函数、变量和隐式乘法。也支持符号微分。
v1.3.13
2018-01-04 09:33 UTC
Requires
- php: >=5.4.0
Requires (Dev)
README
描述
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*x
和 xsin(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 描述。