布尔表达式中的评估函数和表达式

时间:2013-10-17 05:07:43

标签: algorithm stack expression-evaluation

我知道在转换成波兰语符号后我们如何评估表达式。但是,我想知道如何评估这样的事情:

If a < b Then a + b Else a - b
如果条件a + b为True,则会发生

a < b,否则,如果计算出False a - b

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

4 个答案:

答案 0 :(得分:0)

你需要为某事分配+ b或a-b吗?

你可以这样做:

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

或者

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

答案 1 :(得分:0)

请参阅S-express的LISP语言: e.g

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

答案 2 :(得分:0)

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

如果你的问题只是解析if语句,你可以从解析器技术中作弊,你可以在&lt;之后添加空的东西。 b,这意味着一些动作,else之后的空事,这也意味着一个动作。解析条件时,根据正确性或错误,您将执行其中一个操作。顺便说一下,如果你想在if语句中解析表达式,你需要条件堆栈,就像SLR table那样。

答案 3 :(得分:0)

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

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

a < b ? a + b : a - b

您应该能够以当前评估算术运算的方式评估堆栈上的布尔运算符,因此&lt; b应该按

< a b

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

? < a b

并且评估的两个可能条件需要由另一个运算符分隔,也可以使用':'

? < a b : + a b - a b

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

在堆栈上有3个值后,您会评估吗?为:

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

  • 如果第一个值为0,则抛弃第二个值并推送第三个。