我们可以将++ + ++ a + a ++表示为表达式树吗?

时间:2017-04-29 05:21:04

标签: expression-trees

我在为一元运算符构造表达式树时感到困惑,如否定( - ),后期/预增量(++),后期/预先减少( - )。

2 个答案:

答案 0 :(得分:0)

根据语言的不同,(a++) + (++a) + (a++)完全合法,是未定义的行为,或者是彻头彻尾的编译错误。

在完全合法的情况下,我会想象它就像

expression = unary_op operand | operand unary_op | operand binary_op operand
operand = literal | expression
unary_op = ++ | --
binary_op = + | - | * | /
expressions must be evaluated from left to right

因此前缀表示法中的表达式树将是

tree = unary_op{tree} | binary_op{tree, tree} | literal

请注意,我们在树表示中区分前/后递增/递减 示例表达式将具有在dfs中评估的+{+{++_post{a}, ++_pre{a}}, ++_post{a}}树。

在未定义行为的情况下,语言可能表示未指定评估操作的顺序,这意味着(++a) / (++a)可能小于或大于1.

在编译错误的情况下,语言只是说:我们不会陷入这种混乱。

答案 1 :(得分:0)

解析器需要在语法上区分各种运算符,然后使用相同的字符拼写它们并不重要。表达式树不应该关心拼写。

也许更容易看出你是否替换了新的拼写,比如说$表示预增量而@代表后期增量:

A @ + $ A + A @

由于它已被解析,因此可以将所有一元运算符规范化为前缀表示法:

@ A + $ A + @ A