--[[ 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-09-13: Separated from monolithic program for Assignment #1 2016-09-21: Removed Min, Max, Set, Let for new base aftr HW1 2016-09-22: Added ImpCore features --]] -- Set module "parameters" UTILITIES = "utilities" ENVIRONMENT = "environment" ABS_SYNTAX = "abs_syn_core" -- ImpCore EVALUATOR = "evaluator_core" -- ImpCore 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 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 -- Aded Set, While, Write, Block for ImpCore 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 -- Import Environment module local environ = require(ENVIRONMENT) local newEnv = environ.newEnv local findBinding = environ.findBinding local assign = environ.assign local setVal = environ.setVal local getVal = environ.getVal local dumpEnv = environ.dumpEnv -- Import Evaluator module local evaluator = require(EVALUATOR) local eval = evaluator.eval --[[ TEST SCRIPT Testing is quite incomplete! Expand! --]] print("\nSTART") print("Testing is quite incomplete! Expand!\n") local env = newEnv() setVal("x",1,env) setVal("y",2,env) setVal("z",3,env) dumpEnv(env) print("\nTry getVals") local x, y, z = getVal("x", env), getVal("y", env), getVal("z", env) print("x, y, z = " .. x .. ", " .. y .. ", " .. z) print("\nTry Int") local two = Int(2) print("two = Int(2) : " .. exprToString(two)) local three = Int(3) print("three = Int(3) : " .. exprToString(three)) print("eval(Int(2), env)) = " .. tostring(eval(two, env))) print("eval(Int(3), env)) = " .. tostring(eval(three, env))) print("\nTry Var") local vx = Var("x") print("vx = Var(x) : " .. exprToString(vx)) print("eval(vx, env) = " .. tostring(eval(vx, env))) local vy = Var("y") print("vy = Var(y) : " .. exprToString(vy)) print("eval(vy, env) = " .. tostring(eval(vy, env))) print("\nTry Neg") local en = Neg(three) print("en = Neg(Int(3)) : " .. exprToString(en)) print("eval(en, env)) = " .. tostring(eval(en, env))) print("\nTry Mul") local em = Mul(two, vx) print("em = Mul(Int(2), Var(x)) : " .. exprToString(em)) print("eval(em, env)) = " .. tostring(eval(em, env))) print("\nTry Add") local ea = Add(three, em) print("ea = Add(Int(3),Mul(Int(2),Var(x))) : " .. exprToString(ea)) print("eval(ea, env)) = " .. tostring(eval(ea, env))) print("\nTry Sub") local esub = Sub(three, en) print("esub = Sub(three, en) : " .. exprToString(esub)) print("eval(esub, env)) = " .. tostring(eval(esub, env))) print("\nTry Div") local ediv = Div(three, three) print("ediv = Div(three, three) : " .. exprToString(ediv)) print("eval(ediv, env)) = " .. tostring(eval(ediv, env))) local ediv2 = Div(three, two) print("edivs = Div(three, two) : " .. exprToString(ediv2)) print("eval(ediv2, env)) = " .. tostring(eval(ediv2, env))) print("\nTry Eq") local ceq = Eq(three,three) print("ceq = Eq(Int(3),Int(3)) : " .. exprToString(ceq)) print("eval(ceq, env) : " .. tostring(eval(ceq))) ceq = Eq(two,three) print("ceq = Eq(Int(2),Int(3)) : " .. exprToString(ceq)) print("eval(ceq, env) = " .. tostring(eval(ceq))) print("\nTry Lt") local clt = Lt(three,three) print("clt = Lt(Int(3),Int(3)) : " .. exprToString(clt)) print("eval(clt, env) = " .. tostring(eval(clt))) clt = Lt(two,three) print("clt = Lt(Int(2),Int(3)) : " .. exprToString(clt)) print("eval(clt, env) = " .. tostring(eval(clt))) print("\nTry If") local eif = If(Lt(two,three), Var("x"), Var("y") ) print('eif = If(Lt(two,three), Var("x"), Var("y")) ' .. exprToString(eif)) print("eval(eif,env) = " .. tostring(eval(eif,env))) print("\nTry Set") local xx = Set("xx",Add( Var("x"), Int(3) ) ) print('Set("xx",Add(Var("x"),Int(5)) :' .. eval(xx,env)) print("xx = " .. eval(xx,env)) print("\nTry Write") local wrxx = Write(Var("xx")) print("Eval --> xx = " .. eval(xx,env)) print('Write --> Write(Var("xx")) ' .. eval(wrxx,env)) local wreif = Write(eif) print("Write(eif)) = " .. eval(wreif,env)) print("\nTry Block") local bl = Block( Set("c",Int(6)), Set("d",Add(Var("c"),Int(3)))) print("input: " .. exprToString(bl)) print("output: " .. eval(bl,env)) print("c --> " .. eval(Var("c"),env)) print("d --> " .. eval(Var("d"),env)) print("\nEND")