Format for loops (#197)

diff --git a/build/lex.go b/build/lex.go
index 7c13dbe..7685188 100644
--- a/build/lex.go
+++ b/build/lex.go
@@ -796,6 +796,14 @@
 		for _, x := range v.Body.Statements {
 			in.order(x)
 		}
+	case *ForLoop:
+		for _, x := range v.LoopVars {
+			in.order(x)
+		}
+		in.order(v.Iterable)
+		for _, x := range v.Body.Statements {
+			in.order(x)
+		}
 	}
 	if v != nil {
 		in.post = append(in.post, v)
diff --git a/build/parse.y b/build/parse.y
index 05dd342..669b3ce 100644
--- a/build/parse.y
+++ b/build/parse.y
@@ -266,6 +266,16 @@
 			ForceMultiLine: forceMultiLine($3, $4, $5),
 		}
 	}
+| _FOR primary_exprs _IN expr ':' suite
+	{
+		$$ = &ForLoop{
+			Start: $1,
+			LoopVars: $2,
+			Iterable: $4,
+			Body: $6,
+			End: $6.End,
+		}
+	}
 
 simple_stmt:
 	small_stmt small_stmts_continuation semi_opt '\n'
diff --git a/build/parse.y.go b/build/parse.y.go
index 69e4cb3..a3a1b56 100755
--- a/build/parse.y.go
+++ b/build/parse.y.go
@@ -112,7 +112,7 @@
 const yyErrCode = 2
 const yyInitialStackSize = 16
 
-//line build/parse.y:672
+//line build/parse.y:682
 
 // Go helper code.
 
@@ -245,161 +245,169 @@
 	-2, 0,
 }
 
-const yyNprod = 84
+const yyNprod = 85
 const yyPrivate = 57344
 
 var yyTokenNames []string
 var yyStates []string
 
-const yyLast = 571
+const yyLast = 621
 
 var yyAct = [...]int{
 
-	11, 2, 95, 7, 63, 99, 58, 100, 9, 70,
-	112, 27, 151, 49, 26, 86, 54, 55, 56, 138,
-	91, 59, 61, 66, 29, 135, 14, 102, 62, 65,
-	109, 72, 73, 74, 75, 76, 77, 78, 79, 80,
-	81, 82, 83, 84, 85, 102, 87, 88, 89, 90,
-	68, 139, 93, 94, 21, 129, 17, 123, 92, 23,
-	128, 102, 152, 108, 25, 102, 20, 105, 22, 107,
-	143, 98, 54, 140, 60, 142, 141, 24, 114, 113,
-	102, 120, 15, 51, 57, 16, 111, 115, 26, 50,
-	53, 21, 103, 17, 133, 52, 23, 121, 122, 118,
-	117, 106, 97, 20, 122, 22, 96, 124, 71, 69,
-	1, 130, 132, 124, 24, 124, 131, 134, 147, 15,
-	19, 137, 16, 136, 13, 26, 124, 12, 21, 127,
-	67, 148, 64, 23, 28, 31, 8, 4, 30, 144,
-	20, 146, 22, 32, 137, 149, 150, 21, 125, 17,
-	18, 24, 23, 153, 101, 126, 104, 0, 0, 20,
-	0, 22, 26, 0, 0, 6, 145, 0, 0, 0,
-	24, 0, 21, 0, 17, 15, 0, 23, 16, 0,
-	13, 26, 10, 12, 20, 154, 22, 5, 0, 0,
-	6, 3, 0, 31, 0, 24, 30, 33, 0, 34,
-	15, 32, 0, 16, 0, 13, 26, 10, 12, 0,
-	31, 0, 5, 30, 33, 0, 34, 0, 32, 110,
-	35, 41, 36, 0, 0, 0, 0, 42, 46, 0,
-	0, 37, 0, 40, 0, 48, 0, 43, 47, 0,
-	38, 39, 44, 45, 31, 0, 0, 30, 33, 0,
-	34, 0, 32, 0, 35, 41, 36, 0, 119, 0,
-	0, 42, 46, 0, 0, 37, 0, 40, 0, 48,
-	0, 43, 47, 0, 38, 39, 44, 45, 31, 0,
-	0, 30, 33, 0, 34, 0, 32, 0, 35, 41,
-	36, 0, 0, 0, 0, 42, 46, 0, 0, 37,
-	102, 40, 0, 48, 0, 43, 47, 0, 38, 39,
-	44, 45, 31, 0, 0, 30, 33, 0, 34, 0,
-	32, 0, 35, 41, 36, 0, 0, 0, 0, 42,
-	46, 0, 0, 37, 0, 40, 0, 48, 116, 43,
-	47, 0, 38, 39, 44, 45, 31, 0, 0, 30,
-	33, 0, 34, 0, 32, 0, 35, 41, 36, 0,
-	0, 0, 0, 42, 46, 0, 0, 37, 0, 40,
-	0, 48, 0, 43, 47, 0, 38, 39, 44, 45,
-	31, 0, 0, 30, 33, 0, 34, 0, 32, 0,
-	35, 41, 36, 0, 0, 0, 0, 42, 46, 0,
-	0, 37, 0, 40, 0, 0, 0, 43, 47, 0,
-	38, 39, 44, 45, 31, 0, 0, 30, 33, 0,
-	34, 0, 32, 0, 35, 0, 36, 0, 0, 0,
-	0, 0, 46, 0, 0, 37, 0, 40, 0, 48,
-	0, 43, 47, 0, 38, 39, 44, 45, 31, 0,
-	0, 30, 33, 0, 34, 0, 32, 0, 35, 0,
-	36, 0, 0, 0, 0, 0, 46, 0, 0, 37,
-	0, 40, 21, 0, 17, 43, 47, 23, 38, 39,
-	44, 45, 0, 0, 20, 0, 22, 0, 0, 0,
-	0, 0, 0, 0, 0, 24, 0, 0, 0, 0,
-	15, 0, 0, 16, 0, 13, 26, 31, 12, 0,
-	30, 33, 0, 34, 0, 32, 0, 35, 0, 36,
-	0, 0, 0, 31, 0, 46, 30, 33, 37, 34,
-	40, 32, 0, 35, 0, 36, 0, 38, 39, 31,
-	45, 46, 30, 33, 37, 34, 40, 32, 0, 35,
-	0, 36, 0, 38, 39, 0, 0, 0, 0, 0,
-	37, 0, 40, 0, 0, 0, 0, 0, 0, 38,
-	39,
+	12, 2, 100, 7, 148, 66, 31, 105, 61, 73,
+	9, 117, 104, 28, 52, 156, 27, 57, 58, 59,
+	91, 145, 62, 64, 69, 96, 30, 107, 114, 113,
+	159, 65, 68, 142, 77, 78, 79, 80, 81, 82,
+	83, 84, 85, 86, 87, 88, 89, 90, 15, 92,
+	93, 94, 95, 107, 134, 98, 99, 22, 130, 18,
+	32, 135, 24, 97, 76, 76, 107, 107, 26, 21,
+	147, 23, 103, 71, 107, 57, 120, 110, 102, 112,
+	25, 63, 101, 119, 118, 16, 146, 75, 17, 60,
+	14, 27, 122, 13, 152, 54, 127, 149, 56, 151,
+	116, 53, 128, 129, 108, 34, 139, 55, 33, 129,
+	124, 125, 131, 35, 133, 111, 136, 138, 131, 74,
+	131, 72, 137, 34, 141, 121, 33, 36, 144, 37,
+	143, 35, 1, 131, 20, 70, 22, 67, 18, 29,
+	8, 24, 4, 132, 150, 19, 153, 154, 21, 106,
+	23, 150, 155, 144, 6, 157, 32, 11, 158, 25,
+	109, 22, 0, 18, 16, 0, 24, 17, 0, 14,
+	27, 10, 13, 21, 160, 23, 5, 0, 0, 6,
+	3, 0, 11, 0, 25, 0, 0, 0, 0, 16,
+	0, 0, 17, 0, 14, 27, 10, 13, 0, 34,
+	0, 5, 33, 36, 0, 37, 0, 35, 115, 38,
+	44, 39, 0, 0, 0, 0, 45, 49, 0, 0,
+	40, 0, 43, 0, 51, 0, 46, 50, 0, 41,
+	42, 47, 48, 34, 0, 0, 33, 36, 0, 37,
+	0, 35, 140, 38, 44, 39, 0, 0, 0, 0,
+	45, 49, 0, 0, 40, 0, 43, 0, 51, 0,
+	46, 50, 0, 41, 42, 47, 48, 34, 0, 0,
+	33, 36, 0, 37, 0, 35, 0, 38, 44, 39,
+	0, 126, 0, 0, 45, 49, 0, 0, 40, 0,
+	43, 0, 51, 0, 46, 50, 0, 41, 42, 47,
+	48, 34, 0, 0, 33, 36, 0, 37, 0, 35,
+	0, 38, 44, 39, 0, 0, 0, 0, 45, 49,
+	0, 0, 40, 107, 43, 0, 51, 0, 46, 50,
+	0, 41, 42, 47, 48, 34, 0, 0, 33, 36,
+	0, 37, 0, 35, 0, 38, 44, 39, 0, 0,
+	0, 0, 45, 49, 0, 0, 40, 0, 43, 0,
+	51, 123, 46, 50, 0, 41, 42, 47, 48, 34,
+	0, 0, 33, 36, 0, 37, 0, 35, 0, 38,
+	44, 39, 0, 0, 0, 0, 45, 49, 0, 0,
+	40, 0, 43, 0, 51, 0, 46, 50, 0, 41,
+	42, 47, 48, 34, 0, 22, 33, 36, 0, 37,
+	24, 35, 0, 38, 44, 39, 0, 21, 0, 23,
+	45, 49, 0, 0, 40, 0, 43, 0, 25, 0,
+	46, 50, 0, 41, 42, 47, 48, 34, 0, 27,
+	33, 36, 0, 37, 0, 35, 0, 38, 0, 39,
+	0, 0, 0, 0, 0, 49, 0, 0, 40, 0,
+	43, 0, 51, 0, 46, 50, 0, 41, 42, 47,
+	48, 34, 0, 0, 33, 36, 0, 37, 0, 35,
+	0, 38, 0, 39, 0, 0, 0, 0, 0, 49,
+	0, 0, 40, 0, 43, 22, 0, 18, 46, 50,
+	24, 41, 42, 47, 48, 0, 0, 21, 0, 23,
+	0, 0, 0, 0, 0, 0, 0, 0, 25, 0,
+	0, 0, 0, 16, 0, 0, 17, 0, 14, 27,
+	34, 13, 0, 33, 36, 0, 37, 0, 35, 0,
+	38, 0, 39, 0, 22, 0, 18, 0, 49, 24,
+	0, 40, 0, 43, 0, 0, 21, 0, 23, 0,
+	41, 42, 0, 48, 0, 0, 0, 25, 0, 0,
+	0, 0, 16, 34, 0, 17, 33, 36, 27, 37,
+	0, 35, 0, 38, 0, 39, 0, 0, 0, 34,
+	0, 49, 33, 36, 40, 37, 43, 35, 0, 38,
+	0, 39, 0, 41, 42, 0, 0, 0, 0, 0,
+	40, 0, 43, 0, 0, 0, 0, 0, 0, 41,
+	42,
 }
 var yyPact = [...]int{
 
-	-1000, -1000, 167, -1000, -1000, -1000, -34, -1000, -1000, -1000,
-	-4, 342, 49, -1000, 78, 49, 49, 49, -1000, -25,
-	49, 49, 49, 123, -1000, -1000, -1000, -1000, -39, 103,
-	49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
-	49, 49, 49, 49, -16, 49, 49, 49, 49, 342,
-	-8, 49, 49, 93, 342, -1000, -1000, -1000, 53, 274,
-	83, 274, 95, 1, 43, 10, 206, 77, -1000, -35,
-	467, 49, -1000, -1000, -1000, 131, 131, 189, 189, 189,
-	189, 189, 189, 410, 410, 503, 49, 519, 535, 503,
-	308, -1000, 94, 274, 240, 68, 49, 49, -1000, 39,
-	-1000, -1000, 123, 49, -1000, 54, -1000, 35, -1000, -1000,
-	49, 49, -1000, -1000, 88, 503, 49, -1000, 19, -1000,
-	49, 444, 342, -1000, -1000, -10, 42, 78, -1000, -1000,
-	342, -1000, 206, 63, 444, -1000, 57, 342, 49, 123,
-	49, 86, -1000, 49, 376, 78, 376, -1000, -30, -1000,
-	44, -1000, -1000, 142, -1000,
+	-1000, -1000, 156, -1000, -1000, -1000, -32, -1000, -1000, -1000,
+	-2, 400, 365, 539, -1000, 90, 539, 539, 539, -1000,
+	-23, 539, 539, 539, 400, -1000, -1000, -1000, -1000, -39,
+	114, 56, 90, 539, 539, 539, 539, 539, 539, 539,
+	539, 539, 539, 539, 539, 539, 539, -11, 539, 539,
+	539, 539, 365, -3, 539, 539, 69, 365, -1000, -1000,
+	-1000, 54, 297, 95, 297, 109, 1, 9, 8, 195,
+	91, -1000, -34, 490, 539, 539, 400, -1000, -1000, -1000,
+	101, 101, 119, 119, 119, 119, 119, 119, 433, 433,
+	526, 539, 569, 585, 526, 331, -1000, 104, 297, 263,
+	83, 539, 539, -1000, 40, -1000, -1000, 400, 539, -1000,
+	48, -1000, 41, -1000, -1000, 539, 539, -1000, -1000, 100,
+	229, 90, 526, 539, -1000, 27, -1000, 539, 467, 365,
+	-1000, -1000, -8, 55, -1000, -1000, 365, -1000, 195, 57,
+	52, 467, -1000, 81, 365, 539, 539, 52, -1000, -27,
+	-1000, -1000, 539, 399, 399, -1000, -1000, 12, 131, -1000,
+	-1000,
 }
 var yyPgo = [...]int{
 
-	0, 156, 0, 2, 26, 74, 6, 155, 154, 7,
-	5, 150, 148, 1, 137, 136, 3, 8, 134, 4,
-	132, 130, 64, 120, 118, 110, 109,
+	0, 160, 0, 2, 48, 81, 8, 6, 149, 7,
+	12, 145, 143, 1, 142, 140, 3, 10, 139, 5,
+	137, 135, 68, 134, 4, 132, 121,
 }
 var yyR1 = [...]int{
 
 	0, 25, 24, 24, 13, 13, 13, 13, 14, 14,
-	15, 16, 18, 18, 17, 17, 17, 17, 26, 26,
-	4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
-	4, 4, 4, 4, 4, 4, 2, 2, 2, 2,
+	15, 15, 16, 18, 18, 17, 17, 17, 17, 26,
+	26, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+	4, 4, 4, 4, 4, 4, 4, 2, 2, 2,
 	2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-	2, 2, 2, 2, 2, 2, 2, 2, 2, 3,
-	3, 1, 1, 19, 21, 21, 20, 20, 5, 5,
-	6, 6, 7, 7, 22, 23, 23, 11, 8, 9,
-	10, 10, 12, 12,
+	2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+	3, 3, 1, 1, 19, 21, 21, 20, 20, 5,
+	5, 6, 6, 7, 7, 22, 23, 23, 11, 8,
+	9, 10, 10, 12, 12,
 }
 var yyR2 = [...]int{
 
 	0, 2, 4, 1, 0, 2, 2, 3, 1, 1,
-	7, 4, 0, 3, 1, 2, 1, 1, 0, 1,
-	1, 3, 4, 4, 6, 8, 5, 1, 3, 4,
-	4, 4, 3, 3, 3, 2, 1, 4, 2, 2,
-	3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
-	3, 3, 3, 3, 4, 3, 3, 3, 5, 0,
-	1, 0, 1, 3, 1, 3, 1, 2, 1, 3,
-	0, 2, 1, 3, 1, 1, 2, 1, 4, 2,
-	1, 2, 0, 3,
+	7, 6, 4, 0, 3, 1, 2, 1, 1, 0,
+	1, 1, 3, 4, 4, 6, 8, 5, 1, 3,
+	4, 4, 4, 3, 3, 3, 2, 1, 4, 2,
+	2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+	3, 3, 3, 3, 3, 4, 3, 3, 3, 5,
+	0, 1, 0, 1, 3, 1, 3, 1, 2, 1,
+	3, 0, 2, 1, 3, 1, 1, 2, 1, 4,
+	2, 1, 2, 0, 3,
 }
 var yyChk = [...]int{
 
 	-1000, -25, -13, 24, -14, 45, 23, -16, -15, -17,
-	40, -2, 41, 38, -4, 33, 36, 7, -11, -23,
-	17, 5, 19, 10, 28, -22, 39, 45, -18, 28,
-	7, 4, 12, 8, 10, 14, 16, 25, 34, 35,
-	27, 15, 21, 31, 36, 37, 22, 32, 29, -2,
-	11, 5, 17, -5, -2, -2, -2, -22, -6, -2,
-	-5, -2, -6, -19, -20, -6, -2, -21, -4, -26,
-	48, 5, -2, -2, -2, -2, -2, -2, -2, -2,
-	-2, -2, -2, -2, -2, -2, 31, -2, -2, -2,
-	-2, 28, -6, -2, -2, -3, 13, 9, 18, -10,
-	-9, -8, 26, 9, -1, -10, 6, -10, 20, 20,
-	13, 9, 45, -17, -6, -2, 30, 6, -10, 18,
-	13, -2, -2, 18, -9, -12, -7, -4, 6, 20,
-	-2, -19, -2, 6, -2, 6, -3, -2, 29, 9,
-	31, 13, 18, 13, -2, -4, -2, -24, 45, -16,
-	-3, 42, 18, -13, 43,
+	40, 26, -2, 41, 38, -4, 33, 36, 7, -11,
+	-23, 17, 5, 19, 10, 28, -22, 39, 45, -18,
+	28, -7, -4, 7, 4, 12, 8, 10, 14, 16,
+	25, 34, 35, 27, 15, 21, 31, 36, 37, 22,
+	32, 29, -2, 11, 5, 17, -5, -2, -2, -2,
+	-22, -6, -2, -5, -2, -6, -19, -20, -6, -2,
+	-21, -4, -26, 48, 5, 31, 9, -2, -2, -2,
+	-2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
+	-2, 31, -2, -2, -2, -2, 28, -6, -2, -2,
+	-3, 13, 9, 18, -10, -9, -8, 26, 9, -1,
+	-10, 6, -10, 20, 20, 13, 9, 45, -17, -6,
+	-2, -4, -2, 30, 6, -10, 18, 13, -2, -2,
+	18, -9, -12, -7, 6, 20, -2, -19, -2, 6,
+	13, -2, 6, -3, -2, 29, 31, 13, -24, 45,
+	-16, 18, 13, -2, -2, -24, 42, -3, -13, 18,
+	43,
 }
 var yyDef = [...]int{
 
-	4, -2, 0, 1, 5, 6, 0, 8, 9, 12,
-	0, 14, 16, 17, 36, 0, 0, 0, 20, 27,
-	70, 70, 70, 0, 77, 75, 74, 7, 18, 0,
+	4, -2, 0, 1, 5, 6, 0, 8, 9, 13,
+	0, 0, 15, 17, 18, 37, 0, 0, 0, 21,
+	28, 71, 71, 71, 0, 78, 76, 75, 7, 19,
+	0, 0, 73, 0, 0, 0, 0, 0, 0, 0,
 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 15,
-	0, 70, 59, 0, 68, 38, 39, 76, 0, 68,
-	61, 68, 0, 64, 0, 0, 68, 66, 35, 0,
-	19, 70, 40, 41, 42, 43, 44, 45, 46, 47,
-	48, 49, 50, 51, 52, 53, 0, 55, 56, 57,
-	0, 21, 0, 68, 60, 0, 0, 0, 28, 0,
-	80, 82, 0, 62, 71, 0, 34, 0, 32, 33,
-	0, 67, 11, 13, 0, 54, 0, 22, 0, 23,
-	59, 37, 69, 29, 81, 79, 0, 72, 30, 31,
-	63, 65, 0, 0, 58, 26, 0, 60, 0, 0,
-	0, 0, 24, 59, 83, 73, 78, 10, 0, 3,
-	0, 4, 25, 0, 2,
+	0, 0, 16, 0, 71, 60, 0, 69, 39, 40,
+	77, 0, 69, 62, 69, 0, 65, 0, 0, 69,
+	67, 36, 0, 20, 71, 0, 0, 41, 42, 43,
+	44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
+	54, 0, 56, 57, 58, 0, 22, 0, 69, 61,
+	0, 0, 0, 29, 0, 81, 83, 0, 63, 72,
+	0, 35, 0, 33, 34, 0, 68, 12, 14, 0,
+	0, 74, 55, 0, 23, 0, 24, 60, 38, 70,
+	30, 82, 80, 0, 31, 32, 64, 66, 0, 0,
+	0, 59, 27, 0, 61, 0, 0, 0, 11, 0,
+	3, 25, 60, 84, 79, 10, 4, 0, 0, 26,
+	2,
 }
 var yyTok1 = [...]int{
 
@@ -884,27 +892,39 @@
 			}
 		}
 	case 11:
+		yyDollar = yyS[yypt-6 : yypt+1]
+		//line build/parse.y:270
+		{
+			yyVAL.expr = &ForLoop{
+				Start:    yyDollar[1].pos,
+				LoopVars: yyDollar[2].exprs,
+				Iterable: yyDollar[4].expr,
+				Body:     yyDollar[6].block,
+				End:      yyDollar[6].block.End,
+			}
+		}
+	case 12:
 		yyDollar = yyS[yypt-4 : yypt+1]
-		//line build/parse.y:272
+		//line build/parse.y:282
 		{
 			yyVAL.exprs = append([]Expr{yyDollar[1].expr}, yyDollar[2].exprs...)
 			yyVAL.lastRule = yyVAL.exprs[len(yyVAL.exprs)-1]
 		}
-	case 12:
+	case 13:
 		yyDollar = yyS[yypt-0 : yypt+1]
-		//line build/parse.y:278
+		//line build/parse.y:288
 		{
 			yyVAL.exprs = []Expr{}
 		}
-	case 13:
+	case 14:
 		yyDollar = yyS[yypt-3 : yypt+1]
-		//line build/parse.y:282
+		//line build/parse.y:292
 		{
 			yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr)
 		}
-	case 15:
+	case 16:
 		yyDollar = yyS[yypt-2 : yypt+1]
-		//line build/parse.y:289
+		//line build/parse.y:299
 		{
 			_, end := yyDollar[2].expr.Span()
 			yyVAL.expr = &ReturnExpr{
@@ -912,21 +932,21 @@
 				End: end,
 			}
 		}
-	case 16:
+	case 17:
 		yyDollar = yyS[yypt-1 : yypt+1]
-		//line build/parse.y:297
+		//line build/parse.y:307
 		{
 			yyVAL.expr = &ReturnExpr{End: yyDollar[1].pos}
 		}
-	case 17:
+	case 18:
 		yyDollar = yyS[yypt-1 : yypt+1]
-		//line build/parse.y:301
+		//line build/parse.y:311
 		{
 			yyVAL.expr = &PythonBlock{Start: yyDollar[1].pos, Token: yyDollar[1].tok}
 		}
-	case 21:
+	case 22:
 		yyDollar = yyS[yypt-3 : yypt+1]
-		//line build/parse.y:311
+		//line build/parse.y:321
 		{
 			yyVAL.expr = &DotExpr{
 				X:       yyDollar[1].expr,
@@ -935,9 +955,9 @@
 				Name:    yyDollar[3].tok,
 			}
 		}
-	case 22:
+	case 23:
 		yyDollar = yyS[yypt-4 : yypt+1]
-		//line build/parse.y:320
+		//line build/parse.y:330
 		{
 			yyVAL.expr = &CallExpr{
 				X:              yyDollar[1].expr,
@@ -948,9 +968,9 @@
 				ForceMultiLine: forceMultiLine(yyDollar[2].pos, yyDollar[3].exprs, yyDollar[4].pos),
 			}
 		}
-	case 23:
+	case 24:
 		yyDollar = yyS[yypt-4 : yypt+1]
-		//line build/parse.y:331
+		//line build/parse.y:341
 		{
 			yyVAL.expr = &IndexExpr{
 				X:          yyDollar[1].expr,
@@ -959,9 +979,9 @@
 				End:        yyDollar[4].pos,
 			}
 		}
-	case 24:
+	case 25:
 		yyDollar = yyS[yypt-6 : yypt+1]
-		//line build/parse.y:340
+		//line build/parse.y:350
 		{
 			yyVAL.expr = &SliceExpr{
 				X:          yyDollar[1].expr,
@@ -972,9 +992,9 @@
 				End:        yyDollar[6].pos,
 			}
 		}
-	case 25:
+	case 26:
 		yyDollar = yyS[yypt-8 : yypt+1]
-		//line build/parse.y:351
+		//line build/parse.y:361
 		{
 			yyVAL.expr = &SliceExpr{
 				X:           yyDollar[1].expr,
@@ -987,9 +1007,9 @@
 				End:         yyDollar[8].pos,
 			}
 		}
-	case 26:
+	case 27:
 		yyDollar = yyS[yypt-5 : yypt+1]
-		//line build/parse.y:364
+		//line build/parse.y:374
 		{
 			yyVAL.expr = &CallExpr{
 				X:         yyDollar[1].expr,
@@ -1006,9 +1026,9 @@
 				End: End{Pos: yyDollar[5].pos},
 			}
 		}
-	case 27:
+	case 28:
 		yyDollar = yyS[yypt-1 : yypt+1]
-		//line build/parse.y:381
+		//line build/parse.y:391
 		{
 			if len(yyDollar[1].strings) == 1 {
 				yyVAL.expr = yyDollar[1].strings[0]
@@ -1020,9 +1040,9 @@
 				yyVAL.expr = binary(yyVAL.expr, end, "+", x)
 			}
 		}
-	case 28:
+	case 29:
 		yyDollar = yyS[yypt-3 : yypt+1]
-		//line build/parse.y:393
+		//line build/parse.y:403
 		{
 			yyVAL.expr = &ListExpr{
 				Start:          yyDollar[1].pos,
@@ -1032,9 +1052,9 @@
 				ForceMultiLine: forceMultiLine(yyDollar[1].pos, yyDollar[2].exprs, yyDollar[3].pos),
 			}
 		}
-	case 29:
+	case 30:
 		yyDollar = yyS[yypt-4 : yypt+1]
-		//line build/parse.y:403
+		//line build/parse.y:413
 		{
 			exprStart, _ := yyDollar[2].expr.Span()
 			yyVAL.expr = &ListForExpr{
@@ -1046,9 +1066,9 @@
 				ForceMultiLine: yyDollar[1].pos.Line != exprStart.Line,
 			}
 		}
-	case 30:
+	case 31:
 		yyDollar = yyS[yypt-4 : yypt+1]
-		//line build/parse.y:415
+		//line build/parse.y:425
 		{
 			exprStart, _ := yyDollar[2].expr.Span()
 			yyVAL.expr = &ListForExpr{
@@ -1060,9 +1080,9 @@
 				ForceMultiLine: yyDollar[1].pos.Line != exprStart.Line,
 			}
 		}
-	case 31:
+	case 32:
 		yyDollar = yyS[yypt-4 : yypt+1]
-		//line build/parse.y:427
+		//line build/parse.y:437
 		{
 			exprStart, _ := yyDollar[2].expr.Span()
 			yyVAL.expr = &ListForExpr{
@@ -1074,23 +1094,11 @@
 				ForceMultiLine: yyDollar[1].pos.Line != exprStart.Line,
 			}
 		}
-	case 32:
-		yyDollar = yyS[yypt-3 : yypt+1]
-		//line build/parse.y:439
-		{
-			yyVAL.expr = &DictExpr{
-				Start:          yyDollar[1].pos,
-				List:           yyDollar[2].exprs,
-				Comma:          yyDollar[2].comma,
-				End:            End{Pos: yyDollar[3].pos},
-				ForceMultiLine: forceMultiLine(yyDollar[1].pos, yyDollar[2].exprs, yyDollar[3].pos),
-			}
-		}
 	case 33:
 		yyDollar = yyS[yypt-3 : yypt+1]
 		//line build/parse.y:449
 		{
-			yyVAL.expr = &SetExpr{
+			yyVAL.expr = &DictExpr{
 				Start:          yyDollar[1].pos,
 				List:           yyDollar[2].exprs,
 				Comma:          yyDollar[2].comma,
@@ -1102,6 +1110,18 @@
 		yyDollar = yyS[yypt-3 : yypt+1]
 		//line build/parse.y:459
 		{
+			yyVAL.expr = &SetExpr{
+				Start:          yyDollar[1].pos,
+				List:           yyDollar[2].exprs,
+				Comma:          yyDollar[2].comma,
+				End:            End{Pos: yyDollar[3].pos},
+				ForceMultiLine: forceMultiLine(yyDollar[1].pos, yyDollar[2].exprs, yyDollar[3].pos),
+			}
+		}
+	case 35:
+		yyDollar = yyS[yypt-3 : yypt+1]
+		//line build/parse.y:469
+		{
 			if len(yyDollar[2].exprs) == 1 && yyDollar[2].comma.Line == 0 {
 				// Just a parenthesized expression, not a tuple.
 				yyVAL.expr = &ParenExpr{
@@ -1121,15 +1141,15 @@
 				}
 			}
 		}
-	case 35:
+	case 36:
 		yyDollar = yyS[yypt-2 : yypt+1]
-		//line build/parse.y:479
+		//line build/parse.y:489
 		{
 			yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr)
 		}
-	case 37:
+	case 38:
 		yyDollar = yyS[yypt-4 : yypt+1]
-		//line build/parse.y:484
+		//line build/parse.y:494
 		{
 			yyVAL.expr = &LambdaExpr{
 				Lambda: yyDollar[1].pos,
@@ -1138,133 +1158,133 @@
 				Expr:   yyDollar[4].expr,
 			}
 		}
-	case 38:
-		yyDollar = yyS[yypt-2 : yypt+1]
-		//line build/parse.y:492
-		{
-			yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr)
-		}
 	case 39:
 		yyDollar = yyS[yypt-2 : yypt+1]
-		//line build/parse.y:493
+		//line build/parse.y:502
 		{
 			yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr)
 		}
 	case 40:
-		yyDollar = yyS[yypt-3 : yypt+1]
-		//line build/parse.y:494
-		{
-			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
-		}
-	case 41:
-		yyDollar = yyS[yypt-3 : yypt+1]
-		//line build/parse.y:495
-		{
-			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
-		}
-	case 42:
-		yyDollar = yyS[yypt-3 : yypt+1]
-		//line build/parse.y:496
-		{
-			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
-		}
-	case 43:
-		yyDollar = yyS[yypt-3 : yypt+1]
-		//line build/parse.y:497
-		{
-			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
-		}
-	case 44:
-		yyDollar = yyS[yypt-3 : yypt+1]
-		//line build/parse.y:498
-		{
-			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
-		}
-	case 45:
-		yyDollar = yyS[yypt-3 : yypt+1]
-		//line build/parse.y:499
-		{
-			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
-		}
-	case 46:
-		yyDollar = yyS[yypt-3 : yypt+1]
-		//line build/parse.y:500
-		{
-			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
-		}
-	case 47:
-		yyDollar = yyS[yypt-3 : yypt+1]
-		//line build/parse.y:501
-		{
-			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
-		}
-	case 48:
-		yyDollar = yyS[yypt-3 : yypt+1]
-		//line build/parse.y:502
-		{
-			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
-		}
-	case 49:
-		yyDollar = yyS[yypt-3 : yypt+1]
+		yyDollar = yyS[yypt-2 : yypt+1]
 		//line build/parse.y:503
 		{
-			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
+			yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr)
 		}
-	case 50:
+	case 41:
 		yyDollar = yyS[yypt-3 : yypt+1]
 		//line build/parse.y:504
 		{
 			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
 		}
-	case 51:
+	case 42:
 		yyDollar = yyS[yypt-3 : yypt+1]
 		//line build/parse.y:505
 		{
 			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
 		}
-	case 52:
+	case 43:
 		yyDollar = yyS[yypt-3 : yypt+1]
 		//line build/parse.y:506
 		{
 			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
 		}
-	case 53:
+	case 44:
 		yyDollar = yyS[yypt-3 : yypt+1]
 		//line build/parse.y:507
 		{
 			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
 		}
-	case 54:
-		yyDollar = yyS[yypt-4 : yypt+1]
+	case 45:
+		yyDollar = yyS[yypt-3 : yypt+1]
 		//line build/parse.y:508
 		{
-			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, "not in", yyDollar[4].expr)
+			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
 		}
-	case 55:
+	case 46:
 		yyDollar = yyS[yypt-3 : yypt+1]
 		//line build/parse.y:509
 		{
 			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
 		}
-	case 56:
+	case 47:
 		yyDollar = yyS[yypt-3 : yypt+1]
 		//line build/parse.y:510
 		{
 			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
 		}
-	case 57:
+	case 48:
+		yyDollar = yyS[yypt-3 : yypt+1]
+		//line build/parse.y:511
+		{
+			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
+		}
+	case 49:
 		yyDollar = yyS[yypt-3 : yypt+1]
 		//line build/parse.y:512
 		{
+			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
+		}
+	case 50:
+		yyDollar = yyS[yypt-3 : yypt+1]
+		//line build/parse.y:513
+		{
+			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
+		}
+	case 51:
+		yyDollar = yyS[yypt-3 : yypt+1]
+		//line build/parse.y:514
+		{
+			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
+		}
+	case 52:
+		yyDollar = yyS[yypt-3 : yypt+1]
+		//line build/parse.y:515
+		{
+			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
+		}
+	case 53:
+		yyDollar = yyS[yypt-3 : yypt+1]
+		//line build/parse.y:516
+		{
+			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
+		}
+	case 54:
+		yyDollar = yyS[yypt-3 : yypt+1]
+		//line build/parse.y:517
+		{
+			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
+		}
+	case 55:
+		yyDollar = yyS[yypt-4 : yypt+1]
+		//line build/parse.y:518
+		{
+			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, "not in", yyDollar[4].expr)
+		}
+	case 56:
+		yyDollar = yyS[yypt-3 : yypt+1]
+		//line build/parse.y:519
+		{
+			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
+		}
+	case 57:
+		yyDollar = yyS[yypt-3 : yypt+1]
+		//line build/parse.y:520
+		{
+			yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
+		}
+	case 58:
+		yyDollar = yyS[yypt-3 : yypt+1]
+		//line build/parse.y:522
+		{
 			if b, ok := yyDollar[3].expr.(*UnaryExpr); ok && b.Op == "not" {
 				yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, "is not", b.X)
 			} else {
 				yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
 			}
 		}
-	case 58:
+	case 59:
 		yyDollar = yyS[yypt-5 : yypt+1]
-		//line build/parse.y:520
+		//line build/parse.y:530
 		{
 			yyVAL.expr = &ConditionalExpr{
 				Then:      yyDollar[1].expr,
@@ -1274,21 +1294,21 @@
 				Else:      yyDollar[5].expr,
 			}
 		}
-	case 59:
-		yyDollar = yyS[yypt-0 : yypt+1]
-		//line build/parse.y:531
-		{
-			yyVAL.expr = nil
-		}
-	case 61:
+	case 60:
 		yyDollar = yyS[yypt-0 : yypt+1]
 		//line build/parse.y:541
 		{
+			yyVAL.expr = nil
+		}
+	case 62:
+		yyDollar = yyS[yypt-0 : yypt+1]
+		//line build/parse.y:551
+		{
 			yyVAL.pos = Position{}
 		}
-	case 63:
+	case 64:
 		yyDollar = yyS[yypt-3 : yypt+1]
-		//line build/parse.y:547
+		//line build/parse.y:557
 		{
 			yyVAL.expr = &KeyValueExpr{
 				Key:   yyDollar[1].expr,
@@ -1296,69 +1316,69 @@
 				Value: yyDollar[3].expr,
 			}
 		}
-	case 64:
-		yyDollar = yyS[yypt-1 : yypt+1]
-		//line build/parse.y:557
-		{
-			yyVAL.exprs = []Expr{yyDollar[1].expr}
-		}
 	case 65:
-		yyDollar = yyS[yypt-3 : yypt+1]
-		//line build/parse.y:561
-		{
-			yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr)
-		}
-	case 66:
 		yyDollar = yyS[yypt-1 : yypt+1]
 		//line build/parse.y:567
 		{
-			yyVAL.exprs = yyDollar[1].exprs
+			yyVAL.exprs = []Expr{yyDollar[1].expr}
+		}
+	case 66:
+		yyDollar = yyS[yypt-3 : yypt+1]
+		//line build/parse.y:571
+		{
+			yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr)
 		}
 	case 67:
-		yyDollar = yyS[yypt-2 : yypt+1]
-		//line build/parse.y:571
+		yyDollar = yyS[yypt-1 : yypt+1]
+		//line build/parse.y:577
 		{
 			yyVAL.exprs = yyDollar[1].exprs
 		}
 	case 68:
+		yyDollar = yyS[yypt-2 : yypt+1]
+		//line build/parse.y:581
+		{
+			yyVAL.exprs = yyDollar[1].exprs
+		}
+	case 69:
 		yyDollar = yyS[yypt-1 : yypt+1]
-		//line build/parse.y:577
+		//line build/parse.y:587
 		{
 			yyVAL.exprs = []Expr{yyDollar[1].expr}
 		}
-	case 69:
+	case 70:
 		yyDollar = yyS[yypt-3 : yypt+1]
-		//line build/parse.y:581
+		//line build/parse.y:591
 		{
 			yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr)
 		}
-	case 70:
+	case 71:
 		yyDollar = yyS[yypt-0 : yypt+1]
-		//line build/parse.y:586
+		//line build/parse.y:596
 		{
 			yyVAL.exprs, yyVAL.comma = nil, Position{}
 		}
-	case 71:
+	case 72:
 		yyDollar = yyS[yypt-2 : yypt+1]
-		//line build/parse.y:590
+		//line build/parse.y:600
 		{
 			yyVAL.exprs, yyVAL.comma = yyDollar[1].exprs, yyDollar[2].pos
 		}
-	case 72:
+	case 73:
 		yyDollar = yyS[yypt-1 : yypt+1]
-		//line build/parse.y:596
+		//line build/parse.y:606
 		{
 			yyVAL.exprs = []Expr{yyDollar[1].expr}
 		}
-	case 73:
+	case 74:
 		yyDollar = yyS[yypt-3 : yypt+1]
-		//line build/parse.y:600
+		//line build/parse.y:610
 		{
 			yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr)
 		}
-	case 74:
+	case 75:
 		yyDollar = yyS[yypt-1 : yypt+1]
-		//line build/parse.y:606
+		//line build/parse.y:616
 		{
 			yyVAL.string = &StringExpr{
 				Start:       yyDollar[1].pos,
@@ -1368,27 +1388,27 @@
 				Token:       yyDollar[1].tok,
 			}
 		}
-	case 75:
-		yyDollar = yyS[yypt-1 : yypt+1]
-		//line build/parse.y:618
-		{
-			yyVAL.strings = []*StringExpr{yyDollar[1].string}
-		}
 	case 76:
-		yyDollar = yyS[yypt-2 : yypt+1]
-		//line build/parse.y:622
-		{
-			yyVAL.strings = append(yyDollar[1].strings, yyDollar[2].string)
-		}
-	case 77:
 		yyDollar = yyS[yypt-1 : yypt+1]
 		//line build/parse.y:628
 		{
-			yyVAL.expr = &LiteralExpr{Start: yyDollar[1].pos, Token: yyDollar[1].tok}
+			yyVAL.strings = []*StringExpr{yyDollar[1].string}
+		}
+	case 77:
+		yyDollar = yyS[yypt-2 : yypt+1]
+		//line build/parse.y:632
+		{
+			yyVAL.strings = append(yyDollar[1].strings, yyDollar[2].string)
 		}
 	case 78:
+		yyDollar = yyS[yypt-1 : yypt+1]
+		//line build/parse.y:638
+		{
+			yyVAL.expr = &LiteralExpr{Start: yyDollar[1].pos, Token: yyDollar[1].tok}
+		}
+	case 79:
 		yyDollar = yyS[yypt-4 : yypt+1]
-		//line build/parse.y:634
+		//line build/parse.y:644
 		{
 			yyVAL.forc = &ForClause{
 				For:  yyDollar[1].pos,
@@ -1397,36 +1417,36 @@
 				Expr: yyDollar[4].expr,
 			}
 		}
-	case 79:
+	case 80:
 		yyDollar = yyS[yypt-2 : yypt+1]
-		//line build/parse.y:644
+		//line build/parse.y:654
 		{
 			yyVAL.forifs = &ForClauseWithIfClausesOpt{
 				For: yyDollar[1].forc,
 				Ifs: yyDollar[2].ifs,
 			}
 		}
-	case 80:
+	case 81:
 		yyDollar = yyS[yypt-1 : yypt+1]
-		//line build/parse.y:653
+		//line build/parse.y:663
 		{
 			yyVAL.forsifs = []*ForClauseWithIfClausesOpt{yyDollar[1].forifs}
 		}
-	case 81:
+	case 82:
 		yyDollar = yyS[yypt-2 : yypt+1]
-		//line build/parse.y:656
+		//line build/parse.y:666
 		{
 			yyVAL.forsifs = append(yyDollar[1].forsifs, yyDollar[2].forifs)
 		}
-	case 82:
+	case 83:
 		yyDollar = yyS[yypt-0 : yypt+1]
-		//line build/parse.y:661
+		//line build/parse.y:671
 		{
 			yyVAL.ifs = nil
 		}
-	case 83:
+	case 84:
 		yyDollar = yyS[yypt-3 : yypt+1]
-		//line build/parse.y:665
+		//line build/parse.y:675
 		{
 			yyVAL.ifs = append(yyDollar[1].ifs, &IfClause{
 				If:   yyDollar[2].pos,
diff --git a/build/print.go b/build/print.go
index f551b0b..e22a5b2 100644
--- a/build/print.go
+++ b/build/print.go
@@ -201,6 +201,8 @@
 	switch x.(type) {
 	case *FuncDef:
 		return true
+	case *ForLoop:
+		return true
 	default:
 		return false
 	}
@@ -479,6 +481,22 @@
 		p.newline()
 		p.statements(v.Body.Statements)
 		p.margin -= nestedIndentation
+
+	case *ForLoop:
+		p.printf("for ")
+		for i, loopVar := range v.LoopVars {
+			if i > 0 {
+				p.printf(", ")
+			}
+			p.expr(loopVar, precLow)
+		}
+		p.printf(" in ")
+		p.expr(v.Iterable, precLow)
+		p.printf(":")
+		p.margin += nestedIndentation
+		p.newline()
+		p.statements(v.Body.Statements)
+		p.margin -= nestedIndentation
 	}
 
 	// Add closing parenthesis if needed.
@@ -504,6 +522,7 @@
 	modeTuple // (x,)
 	modeParen // (x)
 	modeDict  // {x:y}
+	modeSeq   // x, y
 )
 
 // seq formats a list of values inside a given bracket pair (brack = "()", "[]", "{}").
diff --git a/build/syntax.go b/build/syntax.go
index 9ef39fc..7942386 100644
--- a/build/syntax.go
+++ b/build/syntax.go
@@ -449,7 +449,7 @@
 }
 
 func (x *FuncDef) Span() (start, end Position) {
-	return x.Start, x.End.Pos.add(":")
+	return x.Start, x.End.Pos
 }
 
 // A ReturnExpr represents a return statement: return f(x).
@@ -463,3 +463,17 @@
 func (x *ReturnExpr) Span() (start, end Position) {
 	return x.Start, x.End
 }
+
+// A ForLoop represents a for loop block: for x in range(10):.
+type ForLoop struct {
+	Comments
+	Start          Position   // position of def
+	LoopVars       []Expr
+	Iterable       Expr
+	Body           CodeBlock
+	End                       // position of the end
+}
+
+func (x *ForLoop) Span() (start, end Position) {
+	return x.Start, x.End.Pos
+}
diff --git a/build/testdata/051.formatbzl.golden b/build/testdata/051.formatbzl.golden
index d56fb43..d450b05 100644
--- a/build/testdata/051.formatbzl.golden
+++ b/build/testdata/051.formatbzl.golden
@@ -34,6 +34,9 @@
       g += 1
       return g
 
+    for x in y:
+      print(y)
+
     def i():
       def j():
         return h(
@@ -43,6 +46,14 @@
 
   return u()
 
+for b in a:  # first
+  for c, d in b:  # second
+    for (
+        (e, f),
+        g,
+    ) in zip(c, d):  # third
+      pass
+
 bar
 
 def a():
diff --git a/build/testdata/051.golden b/build/testdata/051.golden
index b363ee6..133838e 100644
--- a/build/testdata/051.golden
+++ b/build/testdata/051.golden
@@ -25,6 +25,8 @@
 
     def k(g): g += 1; return g
 
+    for x in y: print(y)
+
     def i():
       def j():
         return h([1],
@@ -32,6 +34,11 @@
 
   return u()
 
+for b in a:               # first
+      for c, d in b:          # second
+        for ((e, f), g) in zip(c, d): # third
+         pass
+
 bar
 
 def a():
diff --git a/build/testdata/051.in b/build/testdata/051.in
index 8214ed4..b049cc0 100644
--- a/build/testdata/051.in
+++ b/build/testdata/051.in
@@ -20,6 +20,8 @@
 
     def k(g): g += 1; return g
 
+    for x in y: print(y)
+
     def i():
       def j():
         return h([1],
@@ -27,6 +29,14 @@
 
   return u()
 
+
+for b in a:               # first
+      for c, d in b:          # second
+        for ((e, f), g) in zip(c, d): # third
+         pass
+
+
+
 bar
 def a():
   return