mossadal / math-parser
PHP 表达式解析器,支持基础函数、变量和隐式乘法。还支持符号微分。
v1.3.16
2018-09-15 22:20 UTC
Requires
- php: >=5.4.0
Requires (Dev)
- phpdocumentor/phpdocumentor: 2.*
- phpunit/php-code-coverage: 6.0.*
- phpunit/phpunit: 7.3.*
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 描述。