--[[ Imperative Core Languge Partial Test H. Conrad Cunningham, Professor Computer and Information Science University of Mississippi Developed for CSci 450, Org. of Programming Languages, Fall 2016 1234567890123456789012345678901234567890123456789012345678901234567890 2016-10-08: Implemented test script --]] -- Set module "parameters" UTILITIES = "utilities" ABS_SYNTAX = "abs_syn_simplify" -- Whatever your module is named VALUES = "values_01" -- Import Utilities module local util = require(UTILITIES) local treeConcat, printTree, show_data = util.treeConcat, util.printTree, util.show_data -- Import Abstract Syntax module local absyn = require(ABS_SYNTAX) local exprToString = absyn.exprToString local simplify = absyn.simplify local getArg = absyn.getArg local Int, isInt = absyn.Int, absyn.isInt local Var, isVar = absyn.Var, absyn.isVar local Neg, isNeg = absyn.Neg, absyn.isNeg local Add, isAdd = absyn.Add, absyn.isAdd local Sub, isSub = absyn.Sub, absyn.isSub local Mul, isMul = absyn.Mul, absyn.isMul local Div, isDiv = absyn.Div, absyn.isDiv local Eq, isEq = absyn.Eq, absyn.isEq local Ne, isNe = absyn.Ne, absyn.isNe local Lt, isLt = absyn.Lt, absyn.isLt local Gt, isGt = absyn.Gt, absyn.isGt local Le, isLe = absyn.Le, absyn.isLe local Ge, isGe = absyn.Ge, absyn.isGe local If, isIf = absyn.If, absyn.isIf local Nop, isNop = absyn.Nop, absyn.isNop local Set, isSet = absyn.Set, absyn.isSet local While, isWhile = absyn.While, absyn.isWhile local Write, isWrite = absyn.Write, absyn.isWrite local Block, isBlock = absyn.Block, absyn.isBlock -- Import Values module local values = require(VALUES) local FALSEVAL, TRUEVAL = values.FALSEVAL, values.TRUEVAL local isFalse, isTrue = values.isFalse, values.isTrue local asBoolVal = values.asBoolVal --[[ TEST SCRIPT Testing is quite incomplete! Expand! --]] local function eqExpr(e1,e2) return exprToString(e1) == exprToString(e2) end local zero = Int(0) local one = Int(1) local two = Int(2) local three = Int(3) local four = Int(4) local five = Int(5) local vx = Var("x") local vy = Var("y") local vz = Var("z") print("\nTest Int") print("expression: " .. exprToString(two)) local twoS = simplify(two) print("simplfified: " .. exprToString(twoS)) print("success: " .. tostring(eqExpr(twoS,two))) print("\nTest Var") print("expression: " .. exprToString(vx)) local vxS = simplify(vx) print("simplfied: " .. exprToString(vxS)) print("success: " .. tostring(eqExpr(vxS,vx))) print("\nTest Nop") local nop = Nop("nop test") print("expression: " .. exprToString(nop)) local nopS = simplify(nop) print("simplfied: " .. exprToString(nopS)) print("success: " .. tostring(eqExpr(nopS,nop))) print("\nTest Neg") local neg2 = Neg(two) print("expression: " .. exprToString(neg2)) local neg2S = simplify(neg2) print("simplified: " .. exprToString(neg2S)) print("success: " .. tostring(eqExpr(neg2S,Int(-2)))) print() local nneg2 = Neg(neg2) print("expression: " .. exprToString(nneg2)) local nneg2S = simplify(nneg2) print("simplified: " .. exprToString(nneg2S)) print("success: " .. tostring(eqExpr(nneg2S,two))) print("\nTest Add") local add32 = Add(three, two) print("expression: " .. exprToString(add32)) local add32S = simplify(add32) print("simplified: " .. exprToString(add32S)) print("success: " .. tostring(eqExpr(add32S,five))) print() local addxz = Add(vx,zero) print("expression: " .. exprToString(addxz)) local addxzS = simplify(addxz) print("simplified: " .. exprToString(addxzS)) print("success: " .. tostring(eqExpr(addxzS,vx))) print() local addzx = Add(zero,vx) print("expression: " .. exprToString(addzx)) local addzxS = simplify(addzx) print("simplified: " .. exprToString(addzxS)) print("success: " .. tostring(eqExpr(addzxS,vx))) print() local addxy = Add(vx,vy) print("expression: " .. exprToString(addxy)) local addxyS = simplify(addxy) print("simplified: " .. exprToString(addxyS)) print("success: " .. tostring(eqExpr(addxyS,addxy))) print() local add2312 = Add(Add(two,three),Add(one,two)) print("expression: " .. exprToString(add2312)) local add2312S = simplify(add2312) print("simplified: " .. exprToString(add2312S)) print("success: " .. tostring(eqExpr(add2312S,Int(8)))) print("\nTest Sub") local sub32 = Sub(three, two) print("expression: " .. exprToString(sub32)) local sub32S = simplify(sub32) print("simplified: " .. exprToString(sub32S)) print("success: " .. tostring(eqExpr(sub32S,one))) print() local subxz = Sub(vx,zero) print("expression: " .. exprToString(subxz)) local subxzS = simplify(subxz) print("simplified: " .. exprToString(subxzS)) print("success: " .. tostring(eqExpr(subxzS,vx))) print() local subzx = Sub(zero,vx) print("expression: " .. exprToString(subzx)) local subzxS = simplify(subzx) print("simplified: " .. exprToString(subzxS)) print("success: " .. tostring(eqExpr(subzxS,vx))) print() local subznx = Sub(zero,Neg(vx)) print("expression: " .. exprToString(subznx)) local subznxS = simplify(subznx) print("simplified: " .. exprToString(subznxS)) print("success: " .. tostring(eqExpr(subznxS,vx))) print() local subxy = Sub(vx,vy) print("expression: " .. exprToString(subxy)) local subxyS = simplify(subxy) print("simplified: " .. exprToString(subxyS)) print("success: " .. tostring(eqExpr(subxyS,subxy))) print() local subs11a23 = Sub(Sub(one,one),Add(two,three)) print("expression: " .. exprToString(subs11a23)) local subs11a23S = simplify(subs11a23) print("simplified: " .. exprToString(subs11a23S)) print("success: " .. tostring(eqExpr(subs11a23S,Int(-5)))) print("\nTest Mul") local mul32 = Mul(three, two) print("expression: " .. exprToString(mul32)) local mul32S = simplify(mul32) print("simplified: " .. exprToString(mul32S)) print("success: " .. tostring(eqExpr(mul32S,Int(6)))) print() local mulxz = Mul(vx,zero) print("expression: " .. exprToString(mulxz)) local mulxzS = simplify(mulxz) print("simplified: " .. exprToString(mulxzS)) print("success: " .. tostring(eqExpr(mulxzS,zero))) print() local mulzx = Mul(zero,vx) print("expression: " .. exprToString(mulzx)) local mulzxS = simplify(mulzx) print("simplified: " .. exprToString(mulzxS)) print("success: " .. tostring(eqExpr(mulzxS,zero))) print() local mulx1 = Mul(vx,one) print("expression: " .. exprToString(mulx1)) local mulx1S = simplify(mulx1) print("simplified: " .. exprToString(mulx1S)) print("success: " .. tostring(eqExpr(mulx1S,vx))) print() local mul1x = Mul(one,vx) print("expression: " .. exprToString(mul1x)) local mul1xS = simplify(mul1x) print("simplified: " .. exprToString(mul1xS)) print("success: " .. tostring(eqExpr(mul1xS,vx))) print() local mulxy = Mul(vx,vy) print("expression: " .. exprToString(mulxy)) local mulxyS = simplify(mulxy) print("simplified: " .. exprToString(mulxyS)) print("success: " .. tostring(eqExpr(mulxyS,mulxy))) print() local mula23s12 = Mul(Add(two,three),Sub(one,two)) print("expression: " .. exprToString(mula23s12)) local mula23s12S = simplify(mula23s12) print("simplified: " .. exprToString(mula23s12S)) print("success: " .. tostring(eqExpr(mula23s12S,Int(-5)))) print("\nTest Div") local div32 = Div(three, two) print("expression: " .. exprToString(div32)) local div32S = simplify(div32) print("simplified: " .. exprToString(div32S)) print("success: " .. tostring(eqExpr(div32S,Int(1)))) print() local divzx = Div(zero,vx) print("expression: " .. exprToString(divzx)) local divzxS = simplify(divzx) print("simplified: " .. exprToString(divzxS)) print("success: " .. tostring(eqExpr(divzxS,zero))) print() local divx1 = Div(vx,one) print("expression: " .. exprToString(divx1)) local divx1S = simplify(divx1) print("simplified: " .. exprToString(divx1S)) print("success: " .. tostring(eqExpr(divx1S,vx))) print() local divxy = Div(vx,vy) print("expression: " .. exprToString(divxy)) local divxyS = simplify(divxy) print("simplified: " .. exprToString(divxyS)) print("success: " .. tostring(eqExpr(divxyS,divxy))) print() local diva23s12 = Div(Add(two,three),Sub(one,two)) print("expression: " .. exprToString(diva23s12)) local diva23s12S = simplify(diva23s12) print("simplified: " .. exprToString(diva23s12S)) print("success: " .. tostring(eqExpr(diva23s12S,Int(-5)))) print("\nTest Write") local wrex = Write(Div(Add(two,three),Sub(one,two))) print("expression: " .. exprToString(wrex)) local wrexS = simplify(wrex) print("simplified: " .. exprToString(wrexS)) print("success: " .. tostring(eqExpr(wrexS,Write(Int(-5))))) print("\nTest If") local ifty = If(two,vy,vz) print("expression: " .. exprToString(ifty)) local iftyS = simplify(ifty) print("simplified: " .. exprToString(iftyS)) print("success: " .. tostring(eqExpr(iftyS,vy))) print() local iffz = If(zero,vy,vz) print("expression: " .. exprToString(iffz)) local iffzS = simplify(iffz) print("simplified: " .. exprToString(iffzS)) print("success: " .. tostring(eqExpr(iffzS,vz))) print() local ifu = If(vx,vy,vz) print("expression: " .. exprToString(ifu)) local ifuS = simplify(ifu) print("simplified: " .. exprToString(ifuS)) print("success: " .. tostring(eqExpr(ifuS,ifu))) print("\nTest While") local whfy = While(zero,vy) print("expression: " .. exprToString(whfy)) local whfyS = simplify(whfy) print("simplified: " .. exprToString(whfyS)) print("success: " .. tostring(eqExpr(whfyS,zero))) print() local whxy = While(vx,vy) print("expression: " .. exprToString(whxy)) local whxyS = simplify(whxy) print("simplified: " .. exprToString(whxyS)) print("success: " .. tostring(eqExpr(whxyS,whxy))) print("\nTest Set") local setxx = Set("xx",Add(vx,Mul(vy,one))) print("expression: " .. exprToString(setxx)) local setxxS = simplify(setxx) print("simplified: " .. exprToString(setxxS)) print("success: " .. tostring(eqExpr(setxxS,Set("xx",Add(vx,vy))))) print("\nTest Block") local blk1 = Block(vx,one,setxx,vy) print("expression: " .. exprToString(blk1)) local blk1S = simplify(blk1) print("simplified: " .. exprToString(blk1S)) print("success: " .. tostring(eqExpr(blk1S,Block(setxxS,vy)))) print("\nTest Eq") local eq32 = Eq(three, two) print("expression: " .. exprToString(eq32)) local eq32S = simplify(eq32) print("simplified: " .. exprToString(eq32S)) print("success: " .. tostring(eqExpr(eq32S,zero))) local eq23 = Eq(two,three) print("expression: " .. exprToString(eq23)) local eq23S = simplify(eq23) print("simplified: " .. exprToString(eq23S)) print("success: " .. tostring(eqExpr(eq23S,zero))) print() local eq22 = Eq(two, two) print("expression: " .. exprToString(eq22)) local eq22S = simplify(eq22) print("simplified: " .. exprToString(eq22S)) print("success: " .. tostring(eqExpr(eq22S,one))) print() local eqxy = Eq(vx, vy) print("expression: " .. exprToString(eqxy)) local eqxyS = simplify(eqxy) print("simplified: " .. exprToString(eqxyS)) print("success: " .. tostring(eqExpr(eqxyS,eqxy))) print("\nTest Ne") local ne32 = Ne(three, two) print("expression: " .. exprToString(ne32)) local ne32S = simplify(ne32) print("simplified: " .. exprToString(ne32S)) print("success: " .. tostring(eqExpr(ne32S,one))) print() local ne23 = Ne(two,three) print("expression: " .. exprToString(ne23)) local ne23S = simplify(ne23) print("simplified: " .. exprToString(ne23S)) print("success: " .. tostring(eqExpr(ne23S,one))) print() local ne22 = Ne(two, two) print("expression: " .. exprToString(ne22)) local ne22S = simplify(ne22) print("simplified: " .. exprToString(ne22S)) print("success: " .. tostring(eqExpr(ne22S,zero))) print() local nexy = Ne(vx, vy) print("expression: " .. exprToString(nexy)) local nexyS = simplify(nexy) print("simplified: " .. exprToString(nexyS)) print("success: " .. tostring(eqExpr(nexyS,nexy))) print("\nTest Lt") local lt32 = Lt(three, two) print("expression: " .. exprToString(lt32)) local lt32S = simplify(lt32) print("simplified: " .. exprToString(lt32S)) print("success: " .. tostring(eqExpr(lt32S,zero))) print() local lt23 = Lt(two,three) print("expression: " .. exprToString(lt23)) local lt23S = simplify(lt23) print("simplified: " .. exprToString(lt23S)) print("success: " .. tostring(eqExpr(lt23S,one))) print() local lt22 = Lt(two, two) print("expression: " .. exprToString(lt22)) local lt22S = simplify(lt22) print("simplified: " .. exprToString(lt22S)) print("success: " .. tostring(eqExpr(lt22S,zero))) print() local ltxy = Lt(vx, vy) print("expression: " .. exprToString(ltxy)) local ltxyS = simplify(ltxy) print("simplified: " .. exprToString(ltxyS)) print("success: " .. tostring(eqExpr(ltxyS,ltxy))) print("\nTest Le") local le32 = Le(three, two) print("expression: " .. exprToString(le32)) local le32S = simplify(le32) print("simplified: " .. exprToString(le32S)) print("success: " .. tostring(eqExpr(le32S,zero))) print() local le23 = Le(two,three) print("expression: " .. exprToString(le23)) local le23S = simplify(le23) print("simplified: " .. exprToString(le23S)) print("success: " .. tostring(eqExpr(le23S,one))) print() local le22 = Le(two, two) print("expression: " .. exprToString(le22)) local le22S = simplify(le22) print("simplified: " .. exprToString(le22S)) print("success: " .. tostring(eqExpr(le22S,one))) print() local lexy = Le(vx, vy) print("expression: " .. exprToString(lexy)) local lexyS = simplify(lexy) print("simplified: " .. exprToString(lexyS)) print("success: " .. tostring(eqExpr(lexyS,lexy))) print("\nTest Gt") local gt32 = Gt(three, two) print("expression: " .. exprToString(gt32)) local gt32S = simplify(gt32) print("simplified: " .. exprToString(gt32S)) print("success: " .. tostring(eqExpr(gt32S,one))) print() local gt23 = Gt(two,three) print("expression: " .. exprToString(gt23)) local gt23S = simplify(gt23) print("simplified: " .. exprToString(gt23S)) print("success: " .. tostring(eqExpr(gt23S,zero))) print() local gt22 = Gt(two, two) print("expression: " .. exprToString(gt22)) local gt22S = simplify(gt22) print("simplified: " .. exprToString(gt22S)) print("success: " .. tostring(eqExpr(gt22S,zero))) print() local gtxy = Gt(vx, vy) print("expression: " .. exprToString(gtxy)) local gtxyS = simplify(gtxy) print("simplified: " .. exprToString(gtxyS)) print("success: " .. tostring(eqExpr(gtxyS,gtxy))) print("\nTest Ge") local ge32 = Ge(three, two) print("expression: " .. exprToString(ge32)) local ge32S = simplify(ge32) print("simplified: " .. exprToString(ge32S)) print("success: " .. tostring(eqExpr(ge32S,one))) print() local ge23 = Ge(two,three) print("expression: " .. exprToString(ge23)) local ge23S = simplify(ge23) print("simplified: " .. exprToString(ge23S)) print("success: " .. tostring(eqExpr(ge23S,zero))) print() local ge22 = Ge(two, two) print("expression: " .. exprToString(ge22)) local ge22S = simplify(ge22) print("simplified: " .. exprToString(ge22S)) print("success: " .. tostring(eqExpr(ge22S,one))) print() local gexy = Ge(vx, vy) print("expression: " .. exprToString(gexy)) local gexyS = simplify(gexy) print("simplified: " .. exprToString(gexyS)) print("success: " .. tostring(eqExpr(gexyS,gexy))) print("\nTest expression") -- (if 1 (+ (* x 1) (+ (* 3 0) (- y 0))) (neg (neg z))) local test1 = If(Int(1), Add( Mul( Var("x"), Int(1) ), Add( Mul(Int(3), Int(0)), Sub(Var("y"), Int(0)))), Neg(Neg(Var("z"))) ) print("expression: " .. exprToString(test1)) local test1S = simplify(test1) print("simplified: " .. exprToString(test1S)) print("success: " .. tostring(eqExpr(test1S,Add(Var("x"),Var("y")))))