include "expr-grammar-ambiguos.Grm" % Part 2. Transformation rules rule main replace [expression] E [expression] construct NewE [expression] E [removePlusZero1] [removePlusZero2] [removeMinusZero] [removeMultiplicationByOne1] [removeMultiplicationByOne2] [removeDivisionByOne] [resolveMultiplicationByZero1] [resolveMultiplicationByZero2] [resolveBracket] [resolveDouble] [resolveDoubleDivision] where not NewE [= E] by NewE end rule rule removePlusZero1 replace [expression] N1 [expression] + 0 by N1 end rule rule removePlusZero2 replace [expression] 0 + N1 [expression] by N1 end rule rule removeMinusZero replace [expression] N1 [expression] - 0 by N1 end rule rule removeMultiplicationByOne1 replace [expression] N1 [expression] * 1 by N1 end rule rule removeMultiplicationByOne2 replace [expression] 1 * N1 [expression] by N1 end rule rule resolveMultiplicationByZero1 replace [expression] N1 [expression] * 0 by 0 end rule rule resolveMultiplicationByZero2 replace [expression] 0 * N1 [expression] by 0 end rule rule removeDivisionByOne replace [expression] N1 [expression] / 1 by N1 end rule rule resolveBracket replace [expression] (N1 [number]) by N1 end rule rule resolveDouble replace [expression] N1 [number] + N1 by (2*N1) end rule rule resolveDoubleDivision replace [expression] N1 [number] / N1 by 1 end rule