diff options
| author | Gustav Sörnäs <gustav@sornas.net> | 2020-03-22 22:51:35 +0100 |
|---|---|---|
| committer | Gustav Sörnäs <gustav@sornas.net> | 2020-03-22 22:51:35 +0100 |
| commit | a392679ee7ac642a0ba8c919d694425158741ca3 (patch) | |
| tree | 3a302d943f905ab09111c26770dd2c678365f545 | |
| parent | 128c3cd58244201ef58c0d727c87eec7b361b251 (diff) | |
| download | tdde24-a392679ee7ac642a0ba8c919d694425158741ca3.tar.gz | |
| -rw-r--r-- | l6/kod.py | 74 |
1 files changed, 27 insertions, 47 deletions
@@ -2,28 +2,20 @@ import sys import calc -def debug(tag, msg): - #print("[{}] {}".format(tag, msg)) - pass - def eval_binary(frame, statement): - debug("BINARY", 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 eval_expression(frame, calc.condition_left(statement)) \ - + eval_expression(frame, calc.condition_right(statement)) + return left + right elif op == "-": - return eval_expression(frame, calc.condition_left(statement)) \ - - eval_expression(frame, calc.condition_right(statement)) + return left - right elif op == "*": - return eval_expression(frame, calc.condition_left(statement)) \ - * eval_expression(frame, calc.condition_right(statement)) + return left * right elif op == "/": - return eval_expression(frame, calc.condition_left(statement)) \ - / eval_expression(frame, calc.condition_right(statement)) + return left / right def eval_expression(frame, statement): - debug("EXPRESSION", 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" @@ -42,46 +34,38 @@ def eval_expression(frame, statement): sys.exit(-1) def eval_assignment(frame, statement): - debug("ASSIGNMENT", 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): - debug("CONDITION", 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 eval_expression(frame, calc.condition_left(statement)) \ - > eval_expression(frame, calc.condition_right(statement)) + return left > right elif op == "<": - return eval_expression(frame, calc.condition_left(statement)) \ - < eval_expression(frame, calc.condition_right(statement)) + return left < right elif op == "=": - return eval_expression(frame, calc.condition_left(statement)) \ - == eval_expression(frame, calc.condition_right(statement)) + return left == right else: print("{} is not valid syntax".format(statement)) sys.exit(-1) def eval_repetition(frame, statement): - debug("REPETITION", statement) - new_frame = frame.copy() - while eval_condition(new_frame, calc.repetition_condition(statement)): - new_frame = eval_statements(new_frame, calc.repetition_statements(statement)) - return new_frame + while eval_condition(frame, calc.repetition_condition(statement)): + frame = eval_statements(frame, calc.repetition_statements(statement)) + return frame def eval_selection(frame, statement): - debug("SELECTION", statement) - new_frame = frame.copy() if eval_condition(frame, calc.selection_condition): - new_frame = eval_statement(frame, calc.selection_true(statement)) + frame = eval_statement(frame, calc.selection_true(statement)) elif calc.hasfalse(statement): - new_frame = eval_statement(frame, calc.selection_false(statement)) - return new_frame + frame = eval_statement(frame, calc.selection_false(statement)) + return frame def eval_input(frame, statement): - debug("INPUT", statement) new_frame = frame.copy() var = calc.input_variable(statement) val = input("Enter value for {}: ".format(var)) @@ -95,39 +79,35 @@ def eval_input(frame, statement): return new_frame def eval_output(frame, statement): - debug("OUTPUT", statement) var = calc.output_variable(statement) val = frame[var] print("{} = {}".format(var, val)) def eval_statement(frame, statement): - debug("STATEMENT", statement) - new_frame = frame.copy() if calc.isassignment(statement): - new_frame = eval_assignment(frame, statement) + frame = eval_assignment(frame, statement) elif calc.isrepetition(statement): - new_frame = eval_repetition(frame, statement) + frame = eval_repetition(frame, statement) elif calc.isselection(statement): - new_frame = eval_selection(frame, statement) + frame = eval_selection(frame, statement) elif calc.isinput(statement): - new_frame = eval_input(frame, 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 new_frame + return frame def eval_statements(frame, statements): - debug("STATEMENTS", statements) - new_frame = eval_statement(frame, calc.first_statement(statements)) + frame = eval_statement(frame, calc.first_statement(statements)) if calc.empty_statements(calc.rest_statements(statements)): - return new_frame + return frame else: - return eval_statements(new_frame, calc.rest_statements(statements)) + return eval_statements(frame, calc.rest_statements(statements)) -def eval_program(program): +def eval_program(program, frame={}): if not calc.isprogram(program): return statements = calc.program_statements(program) - return eval_statements({}, statements) + return eval_statements(frame, statements) |
