将表达式指定给弧并执行它

时间:2012-07-10 13:28:42

标签: php

我需要在我的网络应用程序中实现以下内容。我知道我的解决方案不正确,但我将代码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'

1 个答案:

答案 0 :(得分:0)

您不需要为此实现整个语言。我首先要限制可以做的事情,例如,将表达式限制为算术运算符(+, - ,*,/),括号和if-then运算符。您需要为if-then强制执行某种语法,以使其更容易,可能与php的运算符?:相同。之后,您需要仅为此语法构建解析器:将给定表达式解析为树。例如,表达式“a + b * c'会解析成这样的东西:

  +
 / \
a   *
   / \
  b   c

之后,你只需要评估这样的表达方式。例如,通过将数组传递到类型为evaluate的{​​{1}}函数中,您将获得7个。

解析的想法如下:

  1. 从字符串中的位置1开始 - 并调用递归函数来解析该位置的数据。在该功能中,从指定位置开始读取。
  2. 如果您阅读左括号,请递归调用
  3. 如果遇到右括号或字符串结尾,请返回根节点
  4. 读取第一个标识符(或在括号内递归)
  5. 阅读算术符号
  6. 读取第二个标识符(或在括号内递归)
  7. 如果符号是*或/,则创建带有符号的节点和两个操作数作为子节点,并将该节点作为前一个运算符的相应(左或右)子节点附加。
  8. 如果符号为+或 - ,则查找创建带有符号的节点,其中一个子节点是操作数之一,第二个节点是子树的根,*和/位于根节点(或第二个操作数,如果它是一个简单的操作)。
  9. 获得纯算术,括号,工作很容易;如果 - 然后有点棘手,但仍然不是太糟糕。大约10年前,我不得不在Java中实现这样的东西。我花了大约3天时间对所有内容进行排序,总共大约有500行代码在1类中,不包括javadoc。我怀疑在PHP中,由于PHP语法和类型转换的简单性,它将减少代码。

    听起来可能很复杂,但实际上,一旦开始这样做,它就会变得容易些。我记得17-18年前,大学的任务是做类似于算法课程的一部分。