import sys import calc def eval_binary(frame, statement): op = calc.condition_operator(statement) left = eval_expression(frame, calc.condition_left(statement)) right = eval_expression(frame, calc.condition_right(statement)) if op == "+": return left + right elif op == "-": return left - right elif op == "*": return left * right elif op == "/": return left / right def eval_expression(frame, statement): if calc.isconstant(statement): if not (type(statement) is int or type(statement) is float): print("{} is not a valid constant, need to be either int or float" .format(statement)) sys.exit(-1) return statement elif calc.isvariable(statement): if statement not in frame: print("variable {} not declared".format(statement)) sys.exit(-1) return frame[statement] elif calc.isbinary(statement): return eval_binary(frame, statement) else: print("{} is not valid syntax".format(statement)) sys.exit(-1) def eval_assignment(frame, statement): new_frame = frame.copy() new_frame[calc.assignment_variable(statement)] = \ eval_expression(frame, calc.assignment_expression(statement)) return new_frame def eval_condition(frame, statement): op = calc.condition_operator(statement) left = eval_expression(frame, calc.condition_left(statement)) right = eval_expression(frame, calc.condition_right(statement)) if op == ">": return left > right elif op == "<": return left < right elif op == "=": return left == right else: print("{} is not valid syntax".format(statement)) sys.exit(-1) def eval_repetition(frame, statement): while eval_condition(frame, calc.repetition_condition(statement)): frame = eval_statements(frame, calc.repetition_statements(statement)) return frame def eval_selection(frame, statement): if eval_condition(frame, calc.selection_condition): frame = eval_statement(frame, calc.selection_true(statement)) elif calc.hasfalse(statement): frame = eval_statement(frame, calc.selection_false(statement)) return frame def eval_input(frame, statement): new_frame = frame.copy() var = calc.input_variable(statement) val = input("Enter value for {}: ".format(var)) try: new_frame[var] = int(val) except ValueError: try: new_frame[var] = float(val) except ValueError: pass #TODO return new_frame def eval_output(frame, statement): var = calc.output_variable(statement) val = frame[var] print("{} = {}".format(var, val)) def eval_statement(frame, statement): if calc.isassignment(statement): frame = eval_assignment(frame, statement) elif calc.isrepetition(statement): frame = eval_repetition(frame, statement) elif calc.isselection(statement): frame = eval_selection(frame, statement) elif calc.isinput(statement): frame = eval_input(frame, statement) elif calc.isoutput(statement): eval_output(frame, statement) else: print("{} is not valid syntax".format(statement)) sys.exit(-1) return frame def eval_statements(frame, statements): frame = eval_statement(frame, calc.first_statement(statements)) if calc.empty_statements(calc.rest_statements(statements)): return frame else: return eval_statements(frame, calc.rest_statements(statements)) def eval_program(program, frame={}): if not calc.isprogram(program): return statements = calc.program_statements(program) return eval_statements(frame, statements)