如何创建数学公式解释器

问题描述 投票:3回答:3

我必须用PHP创建一个简单的公式解释器。它必须支持4个运算符:exp,ln,加法,减法和括号。

我应该从哪里开始?我听说用户输入的公式必须转换成树,是真的吗?也许口译员已经存在?

php interpreter
3个回答
4
投票

是的,更正用户输入的公式必须转换为abstract syntax tree

数学公式通常使用infix表示法编写。你需要将其转换为postfixprefix表示法。 postfix符号也被称为reverse polish notation

您可以使用shunting yard algorithm来完成此任务。 See a detailed example

这个stackoverflow question链接到PHP中的实现。


1
投票

您可以使用基本的字符串操作将公式重写为PHP表达式并将其重写为eval。根据语法,您甚至可以单独保留表达式,只需为expln定义PHP函数,因此当您输入eval时,可以直接评估它。

这比为这样一种简单的语言编写自己的解析器和解释器要简单得多。

如果这是课堂作业,那么你的老师可能会因为这样做而失败。


0
投票

我创建了这个,看看:Formula Interpreter

How does it work ?

首先,使用公式及其参数创建FormulaInterpreter的实例

$formulaInterpreter = new FormulaInterpreter("x + y", ["x" => 10, "y" => 20]);

使用execute()方法解释公式。它将返回结果:

echo $formulaInterpreter->execute();

在一条线上

echo (new FormulaInterpreter("x + y", ["x" => 10, "y" => 20]))->execute();

Examples

# Formula: speed = distance / time
$speed = (new FormulaInterpreter("distance/time", ["distance" => 338, "time" => 5]))->execute() ;
echo $speed;


#Venezuela night overtime (ordinary_work_day in hours): (normal_salary * days_in_a_work_month)/ordinary_work_day
$parameters = ["normal_salary" => 21000, "days_in_a_work_month" => 30, "ordinary_work_day" => 8];
$venezuelaLOTTTArt118NightOvertime = (new FormulaInterpreter("(normal_salary/days_in_a_work_month)/ordinary_work_day", $parameters))->execute();
echo $venezuelaLOTTTArt118NightOvertime;


#cicle area
$cicleArea = (new FormulaInterpreter("3.1416*(radio*radio)", ["radio" => 10]))->execute();
echo $cicleArea;

About the formulas

  1. 它必须包含至少两个操作数和一个运算符。
  2. 操作数的名称可以是大写或小写。
  3. 到目前为止,不包括数学函数sin,cos,pow ......我正在努力将它们包括在内。
  4. 如果您的公式无效,您将收到如下错误消息:错误,您的公式(single_variable)无效。
  5. 参数的值必须为数字。

You can improve it if you want to!

© www.soinside.com 2019 - 2024. All rights reserved.