start using precedences, working good with only a few test fails

This commit is contained in:
Dave Halter
2014-03-09 02:10:59 +01:00
parent 48dd8f9cb0
commit 61fa9b7fb4
3 changed files with 22 additions and 4 deletions

View File

@@ -142,13 +142,27 @@ class Evaluator(object):
""" """
debug.dbg('eval_expression_list: %s', expression_list) debug.dbg('eval_expression_list: %s', expression_list)
result = [] result = []
p = precedence.create_precedence(expression_list)
return self._process_precedence_element(p)
calls_iterator = iter(expression_list) calls_iterator = iter(expression_list)
for each in calls_iterator: for each in calls_iterator:
result += self.eval_element(each) result += self.eval_element(each)
return set(result) return set(result)
def _eval_precedence(evaluator, precedence): def _process_precedence_element(self, el):
evaluator 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_element(el)
def _eval_precedence(self, _precedence):
left = self._process_precedence_element(_precedence.left)
right = self._process_precedence_element(_precedence.right)
return precedence.calculate(left, _precedence.operator, right)
def eval_element(self, element): def eval_element(self, element):
if pr.Array.is_type(element, pr.Array.NOARRAY): if pr.Array.is_type(element, pr.Array.NOARRAY):

View File

@@ -73,7 +73,7 @@ class Precedence(object):
def create_precedence(expression_list): def create_precedence(expression_list):
iterator = PushBackIterator(expression_list) iterator = PushBackIterator(iter(expression_list))
return _check_operator(iterator) return _check_operator(iterator)
@@ -149,3 +149,7 @@ def _check_operator(iterator, priority=PythonGrammar.LOWEST_PRIORITY):
else: else:
left = Precedence(left, str(operator), right) left = Precedence(left, str(operator), right)
return left return left
def calculate(left, operator, right):
return left + right

View File

@@ -8,7 +8,7 @@ def parse_tree(statement_string, is_slice=False):
if is_slice: if is_slice:
# get the part of the execution that is the slice # get the part of the execution that is the slice
stmt = stmt.expression_list()[0].execution[0] stmt = stmt.expression_list()[0].execution[0]
iterable = iter(stmt.expression_list()) iterable = stmt.expression_list()
pr = precedence.create_precedence(iterable) pr = precedence.create_precedence(iterable)
if isinstance(pr, precedence.Precedence): if isinstance(pr, precedence.Precedence):
return pr.parse_tree(strip_literals=True) return pr.parse_tree(strip_literals=True)