summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2020-03-22 22:51:35 +0100
committerGustav Sörnäs <gustav@sornas.net>2020-03-22 22:51:35 +0100
commita392679ee7ac642a0ba8c919d694425158741ca3 (patch)
tree3a302d943f905ab09111c26770dd2c678365f545
parent128c3cd58244201ef58c0d727c87eec7b361b251 (diff)
downloadtdde24-a392679ee7ac642a0ba8c919d694425158741ca3.tar.gz
refactorHEADmaster
-rw-r--r--l6/kod.py74
1 files changed, 27 insertions, 47 deletions
diff --git a/l6/kod.py b/l6/kod.py
index 1bf5ea3..6f1c33a 100644
--- a/l6/kod.py
+++ b/l6/kod.py
@@ -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)