Move process_precedence_element from the Evaluator to the precedence module.

This commit is contained in:
Dave Halter
2014-08-20 15:59:37 +02:00
parent 9abc8a19e7
commit d6dd7cd55e
4 changed files with 20 additions and 18 deletions

View File

@@ -169,22 +169,7 @@ class Evaluator(object):
""" """
debug.dbg('eval_expression_list: %s', expression_list) debug.dbg('eval_expression_list: %s', expression_list)
p = precedence.create_precedence(expression_list) p = precedence.create_precedence(expression_list)
return self.process_precedence_element(p) or [] return precedence.process_precedence_element(self, p) or []
def process_precedence_element(self, el):
if el is None:
return None
else:
if isinstance(el, precedence.Precedence):
return self._eval_precedence(el)
else:
# normal element, no operators
return self.eval_statement_element(el)
def _eval_precedence(self, _precedence):
left = self.process_precedence_element(_precedence.left)
right = self.process_precedence_element(_precedence.right)
return precedence.calculate(self, left, _precedence.operator, right)
def eval_statement_element(self, element): def eval_statement_element(self, element):
if pr.Array.is_type(element, pr.Array.NOARRAY): if pr.Array.is_type(element, pr.Array.NOARRAY):

View File

@@ -490,7 +490,7 @@ class Slice(object):
if element is None: if element is None:
return None return None
result = self._evaluator.process_precedence_element(element) result = precedence.process_precedence_element(self._evaluator, element)
if len(result) != 1: if len(result) != 1:
# We want slices to be clear defined with just one type. # We want slices to be clear defined with just one type.
# Otherwise we will return an empty slice object. # Otherwise we will return an empty slice object.
@@ -528,4 +528,4 @@ def create_indexes_or_slices(evaluator, index_array):
step = None step = None
return (Slice(evaluator, start, stop, step),) return (Slice(evaluator, start, stop, step),)
else: else:
return tuple(evaluator.process_precedence_element(prec)) return tuple(precedence.process_precedence_element(evaluator, prec))

View File

@@ -214,6 +214,19 @@ def _literals_to_types(evaluator, result):
return list(set(result)) return list(set(result))
def process_precedence_element(evaluator, precedence):
if precedence is None:
return None
else:
if isinstance(precedence, Precedence):
left = process_precedence_element(evaluator, precedence.left)
right = process_precedence_element(evaluator, precedence.right)
return calculate(evaluator, left, precedence.operator, right)
else:
# normal element, no operators
return evaluator.eval_statement_element(precedence)
def calculate(evaluator, left_result, operator, right_result): def calculate(evaluator, left_result, operator, right_result):
result = [] result = []
if left_result is None and right_result: if left_result is None and right_result:

View File

@@ -172,6 +172,10 @@ def isinst(x):
isinst(A()) isinst(A())
#? set #? set
isinst(True) isinst(True)
#? set
isinst(1)
#? int
isinst(2)
#? list #? list
isinst(1.0) isinst(1.0)
#? list #? list