precedence stuff is not working yet, but need to merge first because of potential parser changes

This commit is contained in:
Dave Halter
2014-02-12 11:08:48 +01:00
parent cd1660dc53
commit 32ccec8447
3 changed files with 58 additions and 10 deletions

View File

@@ -142,8 +142,6 @@ class Evaluator(object):
debug.dbg('eval_expression_list: %s', expression_list)
result = []
calls_iterator = iter(expression_list)
if len(expression_list) > 1:
print expression_list
for call in calls_iterator:
if pr.Array.is_type(call, pr.Array.NOARRAY):
r = list(itertools.chain.from_iterable(self.eval_statement(s)

View File

@@ -3,6 +3,8 @@ Handles operator precedence.
"""
from jedi.parser import representation as pr
from jedi import debug
from jedi.common import PushBackIterator
class PythonGrammar(object):
@@ -44,14 +46,49 @@ class PythonGrammar(object):
class Precedence(object):
def __init__(self, left, operator, right=None):
def __init__(self, left, operator, right):
self.left = left
self.operator = operator
self.right = right
def create_precedence(expression_list, previous=None):
element = next(expression_list, None)
def create_precedence(expression_list):
def get_op(current, expression_list):
for element in expression_list:
return
if not isinstance(obj, str):
debug.warning('normal element in place of operator: %s', element)
continue
def is_operator(obj):
if isinstance(obj, pr.Call):
element = str(obj.name)
for term in PythonGrammar.order:
pass
return element
def tokenize():
pass
new
current = None
exp_iterator = PushBackIterator(expression_list)
for element in expression_list:
op_name = element
if isinstance(element, pr.Call):
op_name = str(element.name)
current = s
if isinstance(element, pr.Call):
x = str(element.name)
new = _process_element(element, expression_list)
if current is None:
current = new
else:
current = _process_element(element, expression_list)
return current
def _process_element(element, expression_list, previous=None):
if element is None:
return previous
@@ -60,11 +97,11 @@ def create_precedence(expression_list, previous=None):
elif not isinstance(element, str):
if previous is None:
previous = element
return create_precedence(expression_list, previous=previous)
return _process_element(expression_list, previous=previous)
for term in PythonGrammar.order:
if element in term:
right = create_precedence(expression_list)
right = _process_element(expression_list)
if right is None:
return previous
else:

View File

@@ -1,13 +1,26 @@
import pytest
from jedi.evaluate import precedence
cp = lambda *args: precedence.create_precedence(iter(args))
@pytest.skip('sorry precedence stuff is still not implemented yet')
def test_simple():
p = precedence.create_precedence(iter([1, '+', 2]))
p = cp(1, '+', 2)
assert p.left == 1
assert p.operator == '+'
assert p.right == 2
p = cp('+', 2)
assert p.left is None
assert p.operator == '+'
assert p.right == 2
@pytest.skip('sorry precedence stuff is still not implemented yet')
def test_invalid():
"""Should just return a simple operation"""
assert precedence.create_precedence(iter([1, '+'])) == 1
"""Should just return a simple operation."""
assert cp(1, '+') == 1
assert cp('+') is None
assert cp('*', 1) == 1