From: Robert Bradshaw Date: Wed, 28 May 2008 08:58:32 +0000 (-0700) Subject: Accept new for-from syntax. X-Git-Tag: 0.9.8rc1~11^2~10^2~10^2~3^2~4 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=d3e1ddfc54d7ee4c060f3ec3babed51eb9ffef3e;p=cython.git Accept new for-from syntax. --- diff --git a/Cython/Compiler/Parsing.py b/Cython/Compiler/Parsing.py index 4b4c9107..b7b2a88c 100644 --- a/Cython/Compiler/Parsing.py +++ b/Cython/Compiler/Parsing.py @@ -1080,9 +1080,13 @@ def p_for_bounds(s): s.next() iterator = p_for_iterator(s) return { 'target': target, 'iterator': iterator } - elif s.sy == 'from': - s.next() - bound1 = p_bit_expr(s) + else: + if s.sy == 'from': + s.next() + bound1 = p_bit_expr(s) + else: + # Support shorter "for a <= x < b" syntax + bound1, target = target, None rel1 = p_for_from_relation(s) name2_pos = s.position() name2 = p_ident(s) @@ -1090,12 +1094,15 @@ def p_for_bounds(s): rel2 = p_for_from_relation(s) bound2 = p_bit_expr(s) step = p_for_from_step(s) - if not target.is_name: - error(target.pos, - "Target of for-from statement must be a variable name") - elif name2 != target.name: - error(name2_pos, - "Variable name in for-from range does not match target") + if target is None: + target = ExprNodes.NameNode(name2_pos, name = name2) + else: + if not target.is_name: + error(target.pos, + "Target of for-from statement must be a variable name") + elif name2 != target.name: + error(name2_pos, + "Variable name in for-from range does not match target") if rel1[0] != rel2[0]: error(rel2_pos, "Relation directions in for-from do not match") @@ -1105,8 +1112,6 @@ def p_for_bounds(s): 'relation2': rel2, 'bound2': bound2, 'step': step } - else: - s.error("Expected 'in' or 'from'") def p_for_from_relation(s): if s.sy in inequality_relations: diff --git a/tests/compile/forfromelse.pyx b/tests/compile/forfromelse.pyx index 014f42b5..11cad88b 100644 --- a/tests/compile/forfromelse.pyx +++ b/tests/compile/forfromelse.pyx @@ -5,3 +5,8 @@ cdef void spam(): else: k = j + # new syntax + for 0 <= i < 10: + j = i + else: + j = k