Logic 动态条件逻辑函数

Logic 动态条件逻辑函数,logic,Logic,我需要编写一个函数,它可以在运行时接受if语句(例如,用户输入,或从数据文件)。理想情况下,它应该能够解出不低于以下复杂度的表达式: a && ( b || !c || ( d && e ) ) 我想我需要的是一个递归函数(一个调用自身的函数)。当然,函数需要返回true或false 由于上述示例的复杂性,函数不仅需要循环遍历各个条件,而且还需要了解运算符,知道评估它们的顺序,并优先考虑它们的速度(例如,在示例中,如果a为false,则无需评估语句的其余部分)

我需要编写一个函数,它可以在运行时接受if语句(例如,用户输入,或从数据文件)。理想情况下,它应该能够解出不低于以下复杂度的表达式:

a && ( b || !c || ( d && e ) )
我想我需要的是一个递归函数(一个调用自身的函数)。当然,函数需要返回true或false

由于上述示例的复杂性,函数不仅需要循环遍历各个条件,而且还需要了解运算符,知道评估它们的顺序,并优先考虑它们的速度(例如,在示例中,如果a为false,则无需评估语句的其余部分)


有人有什么想法吗?

一种解决方案是使用调车场算法将表达式转换为RPN,然后将其计算为RPN(因为RPN比中缀更容易计算)。第一部分,转换为RPN(伪代码):

  • read\u token()
    从上一步生成的RPN队列中读取值
  • eval(t,val)
    使用操作数对一元运算符
    t
    求值
    val
  • eval(t,val1,val2)
    使用操作数
    val1
    val2
  • result
    是表达式的最终值
如果所有操作符都是左关联的,并且没有使用任何函数,那么这个简化算法应该可以工作。注意,不需要递归,因为我们使用自己的堆栈实现。
有关示例和更多信息,请参见和

您使用的是什么语言?有些库可以在一行代码中为您实现这一点。我使用的是PHP,但出于安全原因,我不想使用类似JavaScript的eval方法,我也希望能够自定义语法。如果您想要PHP解决方案,您应该将该标记添加到您的问题中(编辑问题下方的链接).我不认为这个问题是语言特有的,因为它几乎适用于任何编程语言。我希望解决方案更多的是一种技术或模式,而不是只适用于PHP开发人员的东西。感谢您提供了非常翔实的答案。我将仔细阅读RPN并试一试。如果我将我的示例转换为RPN,我应该得到
abc | | | dee&!|&&?还是应该是
abc!d e&&&&&&
?a b c!听起来更好:c!翻译成!c、 d e&&翻译成d&&e etcOr甚至
a b c!d e&&| | |&&
while (tokens left) {
  t = read_token();
  if (t is number) {
    output(t);
  } else if (t is unary operator) {
    push(t);
  } else if (t is binary operator) {
    r = pop();
    if (r is operator and precedence(t)<=precedence(r)) {
       output(r);
    } else {
       push(r);
    }
    push(t);
  } else if (t is left parenthesis) {
    push(t);
  } else if (r is right parenthesis) {
    while ((r = pop()) is not left parenthesis) {
        output(r);
        if (stack is empty) {
          mismatched parenthesis!
        }
    }
    if (top() is unary operator) {
        output(pop());
    }
  }
}
while (stack is not empty) {
  if (top() is parenthesis) {
     mismatched parenthesis!
  }
  output(pop());
}
while (tokens left) {
  t = read_token();
  if (t is number) {
    push(t);
  } else if (t is unary operator) {
    push(eval(t, pop()));
  } else if (t is binary operator) {
    val1 = pop();
    val2 = pop();
    push(eval(t, val1, val2));
  }
}
result = pop();