github/workflows/pycopy-test: Upgrade Pycopy to 3.6.1.
[ScratchABlock.git] / xform_expr_basic.py
blobfaa689c2e2ffa9e179627090a769b17a78bef114
1 # ScratchABlock - Program analysis and decompilation framework
3 # Copyright (c) 2020 Paul Sokolovsky
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 from core import *
21 def expr_neg_if_possible(expr):
22 if is_value(expr):
23 return VALUE(-expr.val, expr.base)
24 if is_expr(expr):
25 if expr.op == "NEG":
26 return expr.args[0]
27 if expr.op == "+":
28 new_args = [expr_neg(x) for x in expr.args]
29 return EXPR("+", new_args)
32 def expr_neg(expr):
33 new = expr_neg_if_possible(expr)
34 if new:
35 return new
37 return EXPR("NEG", expr)