【问题标题】:Evaluation functions and expressions in Boolean expressions布尔表达式中的求值函数和表达式
【发布时间】:2013-10-17 05:07:43
【问题描述】:

我知道我们如何在转换为波兰表示法后评估表达式。但是我想知道如何评估这样的事情:

If a < b Then a + b Else a - b

a + b 发生在条件 a &lt; b 为 True 的情况下,否则,如果计算出 False a - b

这里的语法不是问题。因为我只需要算法来解决这个问题。我能够评估布尔和代数表达式。但是我该如何解决上述问题呢?

【问题讨论】:

  • 如果您只需要算法,您不妨删除语言标签。您需要哪些方面的帮助?解析,如何在你的栈上表示切换语句等?
  • 我在对代数表达式进行标记时遇到问题。

标签: algorithm stack expression-evaluation


【解决方案1】:

您需要将 a+b 或 a-b 分配给某物吗?

你可以这样做:

int c = a < b ? a+b : a-b;

或者

int sign = a < b ? 1 : -1; int c = a + (sign * b);

【讨论】:

  • 认为你的意思是小于。
  • 但是我如何在运行时评估这个?这是编译时代码。我们在NOT compile time 讨论运行时表达式评估。我认为您根本不理解这里的问题。
  • @Lohit 我不确定您所说的“运行时”是什么意思。据我所知,如果在运行时评估条件。
  • 非条件 - 表达式!!请阅读表达式评估。
【解决方案2】:

S-express 参考 LISP 语言: 例如

 (if (> a b)                  ; if-part
     (+ a b)                  ; then-part
   (- a b))                   ; else-part

【讨论】:

    【解决方案3】:

    实际上,如果您只想评估这个简单的 if 语句,请将其标记并评估它,但如果您想评估更复杂的事物,例如嵌套 if then else、if with experssions、multiple else、变量赋值、类型等。 .. 你需要使用一些解析器,比如LR parsers。您可以使用例如 Lex&Yacc 为您自己的语言编写一个好的解析器。它们支持某种复杂的语法。但是,如果您想知道 LR 解析器(左右)是如何工作的,您应该阅读它们,并查看它们如何使用它们的表来读取标记并解析它们。例如,看看 wiki 页面,看看 LR 解析器表是如何工作的(它不仅仅是简单的堆栈,在这里不容易描述)。

    如果你的问题真的只是解析if语句,你可以利用解析器技术作弊,你可以在a else之后添加空的东西,这也意味着一个动作.当您解析条件时,根据正确性或错误性,您将运行其中一项操作。顺便说一句,如果你想在 if 语句中解析表达式,你需要条件堆栈,意思是SLR table

    【讨论】:

      【解决方案4】:

      基本上,您需要构建对三元运算符的支持。 IE,目前你弹出一个操作符,然后等待2个连续值再解析它,如果你当前的操作是IF,你需要等待3,其他操作需要等待2。

      要处理 if 语句,您可以根据 C++ 的三元运算符来考虑 if 语句。您希望语法支持哪种格式取决于您。

      a < b ? a + b : a - b
      

      您应该能够像当前评估算术运算一样评估堆栈上的布尔运算符,因此 a

      < a b
      

      if 可以用栈上自己的符号来表示,我们可以坚持用'?'。

      ? < a b
      

      和2个可能的条件来评估需要用另一个操作符分隔,还不如用':'

      ? < a b : + a b - a b
      

      所以现在当你弹出 '?' 时,你会看到它需要 3 个值的运算符,所以像往常一样把它放在一边,继续计算堆栈,直到你有 3 个值。 ':' 运算符应该是一个二元运算符,它只是将其两个值都推回堆栈。

      一旦堆栈上有 3 个值,您评估 ?如:

      • 如果第一个值为1,推第二个值,扔掉第三个。

      • 如果第一个值为0,丢掉第二个,推第三个。

      【讨论】:

        猜你喜欢
        • 2010-11-29
        • 2015-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-04
        • 1970-01-01
        • 2016-02-24
        相关资源
        最近更新 更多