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)
result = []
p = precedence.create_precedence(expression_list)
return self._process_precedence_element(p)
calls_iterator = iter(expression_list)
for each in calls_iterator:
result += self.eval_element(each)
return set(result)
def _eval_precedence(evaluator, precedence):
evaluator
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_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):
if pr.Array.is_type(element, pr.Array.NOARRAY):

View File

@@ -73,7 +73,7 @@ class Precedence(object):
def create_precedence(expression_list):
iterator = PushBackIterator(expression_list)
iterator = PushBackIterator(iter(expression_list))
return _check_operator(iterator)
@@ -149,3 +149,7 @@ def _check_operator(iterator, priority=PythonGrammar.LOWEST_PRIORITY):
else:
left = Precedence(left, str(operator), right)
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:
# get the part of the execution that is the slice
stmt = stmt.expression_list()[0].execution[0]
iterable = iter(stmt.expression_list())
iterable = stmt.expression_list()
pr = precedence.create_precedence(iterable)
if isinstance(pr, precedence.Precedence):
return pr.parse_tree(strip_literals=True)