--[[ Expression Language 1, Evaluator Module CSci 450: Organization of Programming Languages, Fall 2016 H. Conrad Cunningham, Professor Computer and Information Science University of Mississippi 1234567890123456789012345678901234567890123456789012345678901234567890 2016-09-13: Separated as module from Assignment #1 code, added Nop 2016-09-16: Changed message on NOP 2016-09-21: Removed Min, Max, Set, Let for new base after HW1 This module encapsulates the Expression Evaluator. --]] --[[ Module names now global local UTILITIES = "utilities" local ABS_SYN = "abs_syn_01" local ENVIRONMENT = "environment" local 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 Nop, isNop = absyn.Nop, absyn.isNop 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 -- 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 local valToString = values.valToString -- 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 -- Public function "eval" evaluates Expression "e" in environment -- "env" and returns the resulting value. local function eval(e, env) print("DEBUG: Calling eval with " .. exprToString(e)) if isInt(e) then return getArg(e,1) elseif isVar(e) then return getVal(getArg(e,1), env) elseif isNeg(e) then return - eval(getArg(e,1), env) elseif isAdd(e) then return eval(getArg(e,1), env) + eval(getArg(e,2), env) elseif isSub(e) then return eval(getArg(e,1), env) - eval(getArg(e,2), env) elseif isMul(e) then -- implement for HW1 return eval(getArg(e,1), env) * eval(getArg(e,2), env) elseif isDiv(e) then -- implement for HW1 return eval(getArg(e,1), env) / eval(getArg(e,2), env) elseif isEq(e) then local left = eval(getArg(e,1), env) local right = eval(getArg(e,2), env) return asBoolVal(left == right) elseif isNe(e) then -- implement for HW1 local left = eval(getArg(e,1), env) local right = eval(getArg(e,2), env) return asBoolVal(left ~= right) elseif isLt(e) then -- implement for HW1 local left = eval(getArg(e,1), env) local right = eval(getArg(e,2), env) return asBoolVal(left < right) elseif isGt(e) then -- implement for HW1 local left = eval(getArg(e,1), env) local right = eval(getArg(e,2), env) return asBoolVal(left > right) elseif isLe(e) then -- implement for HW1 local left = eval(getArg(e,1), env) local right = eval(getArg(e,2), env) return asBoolVal(left <= right) elseif isGe(e) then -- implement for HW1 local left = eval(getArg(e,1), env) local right = eval(getArg(e,2), env) return asBoolVal(left >= right) elseif isIf(e) then -- implement for HW1 local cond = eval(getArg(e,1), env) if isTrue(cond) then return eval(getArg(e,2), env) elseif isFalse(cond) then return eval(getArg(e,3), env) else error("If condition neither true nor false for " .. show_data(e)) end elseif isNop(e) then local str = exprToString(e) print("Warning: Evaluating no operation " .. str) return 0, str else error("Invalid expression in eval: " .. show_data(e)) end end -- MODULE EXPORT LIST return { eval = eval }