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