2013-10-17 90 views
0

我知道我们如何在转换为波兰语符号后评估表达式。不过,我想知道我怎么能这样评价了一句:布尔表达式中的评估函数和表达式

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

a + b发生的情况下,状态a < b是真,否则,如果假a - b计算。

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

+0

如果你只是需要算法,你可能会丢掉语言标签。你需要哪方面的帮助?解析,如何在堆栈中表示切换语句等? – Kindread

+0

我在Tokenizing的代数表达式中遇到问题。 –

回答

0

你需要给某物分配一个+ b或a-b吗?

你可以这样做:

或者

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

+0

认为你的意思不够。 – Kindread

+0

但我如何评估这在运行时?这是编译时间代码。我们在这里讨论运行时表达式评估'不'编译时间。我不认为你在这里理解这个问题。 –

+0

Thanks @Kindread,我更正了我的代码。 –

0

请参考S-快递LISP语言: e.g

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

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

如果您的问题真的很解析if语句,可以从分析器技术作弊,你可以else后经过< B,这意味着一些行动,而空的东西加空的东西,这也意味着一个动作。当你解析条件时,根据正确性或错误,你将运行一个动作。顺便说一句,如果你想解析表达式里面的语句,你需要条件堆栈,意味着像SLR table

0

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

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

a < b ? a + b : a - b 

你应该能够在栈上评估布尔运算符您目前评估的算术运算的方式,所以<乙方应推为

< a b 

的,如果能够通过自己的符号来表示在堆栈上,我们可以坚持'?'。

? < a b 

和2个的条件,从而评估需要由另一运营商分开,还不如用“:”

? < a b : + a b - a b 

所以,现在当你弹出,你看它是经营者?需要3个值,所以按照通常的方式放在一边,并继续评估堆栈,直到有3个值。 ':'运算符应该是一个二元运算符,它将它的两个值简单地推回栈中。

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

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

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