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)
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")
'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: