我需要在我的网络应用程序中实现以下内容。我知道我的解决方案不正确,但我将代码jsut用于演示这个想法。
有一个类'arc'。我需要能够为此弧分配任何表达式(例如a + b + c,a-c,if-then)。一旦指定了表达式,我希望能够使用一些随机变量执行它。是否可以在Web应用程序中实现此类功能?也许,我应该使用像MathPL这样的插件?或者也许有一种绝对不同的方法来解决这类问题?
class arc {
var $arcexpression;
function setExpression($arcexpression) {
$this->arcexpression = $arcexpression;
}
function getExpression() {
return $this->arcexpression;
}
}
$arc = new arc();
$arc->setExpression("if a>b then return a else return b");
$result = $arc->execute(a,b); // the function 'execute' should be somehow described in 'arc'
答案 0 :(得分:0)
您不需要为此实现整个语言。我首先要限制可以做的事情,例如,将表达式限制为算术运算符(+, - ,*,/),括号和if-then运算符。您需要为if-then强制执行某种语法,以使其更容易,可能与php的运算符?:
相同。之后,您需要仅为此语法构建解析器:将给定表达式解析为树。例如,表达式“a + b * c'会解析成这样的东西:
+
/ \
a *
/ \
b c
之后,你只需要评估这样的表达方式。例如,通过将数组传递到类型为evaluate
的{{1}}函数中,您将获得7个。
解析的想法如下:
获得纯算术,括号,工作很容易;如果 - 然后有点棘手,但仍然不是太糟糕。大约10年前,我不得不在Java中实现这样的东西。我花了大约3天时间对所有内容进行排序,总共大约有500行代码在1类中,不包括javadoc。我怀疑在PHP中,由于PHP语法和类型转换的简单性,它将减少代码。
听起来可能很复杂,但实际上,一旦开始这样做,它就会变得容易些。我记得17-18年前,大学的任务是做类似于算法课程的一部分。