[英]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.