繁体   English   中英

布尔表达式中的求值函数和表达式

[英]Evaluation functions and expressions in Boolean expressions

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

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

如果条件a < b为True,则发生a + b ,否则,如果计算为False,则a - b

语法在这里不是问题。 由于我只需要算法即可解决此问题。 我能够评估布尔表达式和代数表达式。 但是我该如何解决以上问题?

您是否需要为某物分配a + b或ab?

你可以这样做:

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

要么

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

有关S-express,请参阅LISP语言:例如

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

实际上,如果您只想评估这个简单的if语句,请对其进行knok并求值,但是如果您想评估某种更复杂的事物,例如嵌套if则else,如果具有experisions,多个else,变量赋值,类型等...需要使用一些解析器,例如LR解析器 您可以使用Lex&Yacc等语言为自己的语言编写出色的解析器。 他们支持某种复杂的语法。 但是,如果您想了解LR解析器(或类似方式)的工作方式,则应该读入它们,并查看它们如何使用表读取令牌并对其进行解析。 例如,看一下Wiki页面,看看LR解析器表是如何工作的(它不仅仅是简单的堆栈,在这里不容易描述)。

如果您的问题只是真正地解析if语句,则可以使用解析器技术作弊,可以在<b之后添加空内容,这表示某些操作,而在else之后添加空else ,也表示操作。 解析条件时,根据正确性或错误性,您将执行一项操作。 顺便说一句,如果您想在if语句中解析表达式,则需要条件堆栈,这意味着像SLR table

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

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

a < b ? a + b : a - b

您应该能够以当前评估算术运算的方式评估堆栈上的布尔运算符,因此应将<

< a b

if可以在堆栈上用自己的符号表示,我们可以坚持使用“?”。

? < a b

而评估需求的2个可能条件需要由另一个运算符分隔,不妨使用':'

? < a b : + a b - a b

因此,当您弹出“?”时,您会看到需要3个值的运算符,因此请照常放置它,并继续评估堆栈,直到有3个值为止。 ':'运算符应为二进制运算符,只需将其两个值都推回堆栈即可。

一旦在堆栈上具有3个值,就可以评估? 如:

  • 如果第一个值为1,则推第二个值,然后丢弃第三个。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM