source 
 prog 
 defn 
 TYP 
 1:1-1:3 
 typ 
 ID 
 1:5-1:5 
 i 
 EQUALS 
 1:7-1:7 
 = 
 type 
 INT 
 1:9-1:11 
 int 
 defn 
 TYP 
 2:1-2:3 
 typ 
 ID 
 2:5-2:5 
 c 
 EQUALS 
 2:7-2:7 
 = 
 type 
 CHAR 
 2:9-2:12 
 char 
 defn 
 TYP 
 3:1-3:3 
 typ 
 ID 
 3:5-3:5 
 b 
 EQUALS 
 3:7-3:7 
 = 
 type 
 BOOL 
 3:9-3:12 
 bool 
 defn 
 VAR 
 5:1-5:3 
 var 
 ID 
 5:5-5:6 
 g1 
 COLON 
 5:8-5:8 
 : 
 type 
 ID 
 5:10-5:10 
 i 
 defn 
 VAR 
 6:1-6:3 
 var 
 ID 
 6:5-6:6 
 g2 
 COLON 
 6:8-6:8 
 : 
 type 
 ID 
 6:10-6:10 
 i 
 defn 
 FUN 
 8:1-8:3 
 fun 
 ID 
 8:5-8:7 
 ext 
 LBRACKET 
 8:8-8:8 
 ( 
 ID 
 8:9-8:9 
 a 
 COLON 
 8:11-8:11 
 : 
 type 
 ID 
 8:13-8:13 
 i 
 COMMA 
 8:14-8:14 
 , 
 ID 
 8:16-8:17 
 bb 
 COLON 
 8:19-8:19 
 : 
 type 
 ID 
 8:21-8:21 
 i 
 RBRACKET 
 8:22-8:22 
 ) 
 COLON 
 8:24-8:24 
 : 
 type 
 ID 
 8:26-8:26 
 i 
 defn 
 FUN 
 10:1-10:3 
 fun 
 ID 
 10:5-10:10 
 helper 
 LBRACKET 
 10:11-10:11 
 ( 
 ID 
 10:12-10:12 
 x 
 COLON 
 10:14-10:14 
 : 
 type 
 ID 
 10:16-10:16 
 i 
 RBRACKET 
 10:17-10:17 
 ) 
 COLON 
 10:19-10:19 
 : 
 type 
 ID 
 10:21-10:21 
 b 
 EQUALS 
 10:23-10:23 
 = 
 expr 
 expr 
 ID 
 11:5-11:5 
 x 
 EEQUALS 
 11:7-11:8 
 == 
 expr 
 NUM 
 11:10-11:10 
 0 
 defn 
 FUN 
 13:1-13:3 
 fun 
 ID 
 13:5-13:7 
 fib 
 LBRACKET 
 13:8-13:8 
 ( 
 ID 
 13:9-13:9 
 n 
 COLON 
 13:11-13:11 
 : 
 type 
 ID 
 13:13-13:13 
 i 
 RBRACKET 
 13:14-13:14 
 ) 
 COLON 
 13:16-13:16 
 : 
 type 
 ID 
 13:18-13:18 
 i 
 EQUALS 
 13:20-13:20 
 = 
 expr 
 IF 
 14:5-14:6 
 if 
 expr 
 expr 
 ID 
 14:8-14:8 
 n 
 EEQUALS 
 14:10-14:11 
 == 
 expr 
 NUM 
 14:13-14:13 
 0 
 THEN 
 14:15-14:18 
 then 
 expr 
 NUM 
 15:9-15:9 
 0 
 ELSE 
 16:5-16:8 
 else 
 expr 
 IF 
 17:9-17:10 
 if 
 expr 
 expr 
 ID 
 17:12-17:12 
 n 
 EEQUALS 
 17:14-17:15 
 == 
 expr 
 NUM 
 17:17-17:17 
 1 
 THEN 
 17:19-17:22 
 then 
 expr 
 NUM 
 18:13-18:13 
 1 
 ELSE 
 19:9-19:12 
 else 
 expr 
 expr 
 expr 
 ID 
 20:13-20:15 
 fib 
 LBRACKET 
 20:16-20:16 
 ( 
 expr 
 expr 
 ID 
 20:17-20:17 
 n 
 MINUS 
 20:19-20:19 
 - 
 expr 
 NUM 
 20:21-20:21 
 1 
 RBRACKET 
 20:22-20:22 
 ) 
 PLUS 
 20:24-20:24 
 + 
 expr 
 expr 
 ID 
 20:26-20:28 
 fib 
 LBRACKET 
 20:29-20:29 
 ( 
 expr 
 expr 
 ID 
 20:30-20:30 
 n 
 MINUS 
 20:32-20:32 
 - 
 expr 
 NUM 
 20:34-20:34 
 2 
 RBRACKET 
 20:35-20:35 
 ) 
 END 
 21:9-21:11 
 end 
 END 
 22:5-22:7 
 end 
 defn 
 FUN 
 24:1-24:3 
 fun 
 ID 
 24:5-24:8 
 main 
 LBRACKET 
 24:9-24:9 
 ( 
 RBRACKET 
 24:10-24:10 
 ) 
 COLON 
 24:12-24:12 
 : 
 type 
 ID 
 24:14-24:14 
 i 
 EQUALS 
 24:16-24:16 
 = 
 expr 
 LET 
 25:5-25:7 
 let 
 defn 
 VAR 
 26:9-26:11 
 var 
 ID 
 26:13-26:18 
 local1 
 COLON 
 26:20-26:20 
 : 
 type 
 ID 
 26:22-26:22 
 i 
 defn 
 VAR 
 27:9-27:11 
 var 
 ID 
 27:13-27:18 
 local2 
 COLON 
 27:20-27:20 
 : 
 type 
 ID 
 27:22-27:22 
 i 
 defn 
 TYP 
 28:9-28:11 
 typ 
 ID 
 28:13-28:14 
 li 
 EQUALS 
 28:16-28:16 
 = 
 type 
 ID 
 28:18-28:18 
 i 
 defn 
 FUN 
 29:9-29:11 
 fun 
 ID 
 29:13-29:17 
 inner 
 LBRACKET 
 29:18-29:18 
 ( 
 ID 
 29:19-29:19 
 a 
 COLON 
 29:21-29:21 
 : 
 type 
 ID 
 29:23-29:24 
 li 
 COMMA 
 29:25-29:25 
 , 
 ID 
 29:27-29:28 
 bb 
 COLON 
 29:30-29:30 
 : 
 type 
 ID 
 29:32-29:33 
 li 
 RBRACKET 
 29:34-29:34 
 ) 
 COLON 
 29:36-29:36 
 : 
 type 
 ID 
 29:38-29:39 
 li 
 EQUALS 
 29:41-29:41 
 = 
 expr 
 LET 
 30:13-30:15 
 let 
 defn 
 VAR 
 31:17-31:19 
 var 
 ID 
 31:21-31:23 
 tmp 
 COLON 
 31:25-31:25 
 : 
 type 
 ID 
 31:27-31:28 
 li 
 IN 
 32:13-32:14 
 in 
 expr 
 expr 
 ID 
 33:17-33:19 
 tmp 
 EQUALS 
 33:21-33:21 
 = 
 expr 
 expr 
 ID 
 33:23-33:23 
 a 
 PLUS 
 33:25-33:25 
 + 
 expr 
 ID 
 33:27-33:28 
 bb 
 COMMA 
 33:29-33:29 
 , 
 expr 
 expr 
 ID 
 34:17-34:19 
 tmp 
 ASTERISK 
 34:21-34:21 
 * 
 expr 
 NUM 
 34:23-34:23 
 2 
 END 
 35:13-35:15 
 end 
 IN 
 36:5-36:6 
 in 
 expr 
 expr 
 ID 
 37:9-37:10 
 g1 
 EQUALS 
 37:12-37:12 
 = 
 expr 
 NUM 
 37:14-37:15 
 10 
 COMMA 
 37:16-37:16 
 , 
 expr 
 expr 
 ID 
 38:9-38:10 
 g2 
 EQUALS 
 38:12-38:12 
 = 
 expr 
 NUM 
 38:14-38:15 
 20 
 COMMA 
 38:16-38:16 
 , 
 expr 
 expr 
 ID 
 39:9-39:14 
 local1 
 EQUALS 
 39:16-39:16 
 = 
 expr 
 expr 
 ID 
 39:18-39:20 
 fib 
 LBRACKET 
 39:21-39:21 
 ( 
 expr 
 ID 
 39:22-39:23 
 g1 
 RBRACKET 
 39:24-39:24 
 ) 
 COMMA 
 39:25-39:25 
 , 
 expr 
 expr 
 ID 
 40:9-40:14 
 local2 
 EQUALS 
 40:16-40:16 
 = 
 expr 
 expr 
 ID 
 40:18-40:22 
 inner 
 LBRACKET 
 40:23-40:23 
 ( 
 expr 
 ID 
 40:24-40:25 
 g1 
 COMMA 
 40:26-40:26 
 , 
 expr 
 ID 
 40:28-40:29 
 g2 
 RBRACKET 
 40:30-40:30 
 ) 
 COMMA 
 40:31-40:31 
 , 
 expr 
 LET 
 41:9-41:11 
 let 
 defn 
 VAR 
 42:13-42:15 
 var 
 ID 
 42:17-42:22 
 shadow 
 COLON 
 42:24-42:24 
 : 
 type 
 ID 
 42:26-42:26 
 b 
 defn 
 VAR 
 43:13-43:15 
 var 
 ID 
 43:17-43:18 
 g1 
 COLON 
 43:20-43:20 
 : 
 type 
 ID 
 43:22-43:22 
 b 
 IN 
 44:9-44:10 
 in 
 expr 
 expr 
 ID 
 45:13-45:18 
 shadow 
 EQUALS 
 45:20-45:20 
 = 
 expr 
 expr 
 ID 
 45:22-45:27 
 helper 
 LBRACKET 
 45:28-45:28 
 ( 
 expr 
 ID 
 45:29-45:34 
 local1 
 RBRACKET 
 45:35-45:35 
 ) 
 COMMA 
 45:36-45:36 
 , 
 expr 
 expr 
 ID 
 46:13-46:14 
 g1 
 EQUALS 
 46:16-46:16 
 = 
 expr 
 expr 
 expr 
 ID 
 46:18-46:23 
 shadow 
 AND 
 46:25-46:27 
 and 
 expr 
 TRUE 
 46:29-46:32 
 true 
 OR 
 46:34-46:35 
 or 
 expr 
 FALSE 
 46:37-46:41 
 false 
 COMMA 
 46:42-46:42 
 , 
 expr 
 LET 
 47:13-47:15 
 let 
 defn 
 VAR 
 48:17-48:19 
 var 
 ID 
 48:21-48:24 
 deep 
 COLON 
 48:26-48:26 
 : 
 type 
 ID 
 48:28-48:28 
 i 
 IN 
 49:13-49:14 
 in 
 expr 
 expr 
 ID 
 50:17-50:20 
 deep 
 EQUALS 
 50:22-50:22 
 = 
 expr 
 expr 
 ID 
 50:24-50:26 
 ext 
 LBRACKET 
 50:27-50:27 
 ( 
 expr 
 ID 
 50:28-50:33 
 local1 
 COMMA 
 50:34-50:34 
 , 
 expr 
 ID 
 50:36-50:41 
 local2 
 RBRACKET 
 50:42-50:42 
 ) 
 COMMA 
 50:43-50:43 
 , 
 expr 
 IF 
 51:17-51:18 
 if 
 expr 
 expr 
 ID 
 51:20-51:25 
 helper 
 LBRACKET 
 51:26-51:26 
 ( 
 expr 
 ID 
 51:27-51:30 
 deep 
 RBRACKET 
 51:31-51:31 
 ) 
 THEN 
 51:33-51:36 
 then 
 expr 
 expr 
 ID 
 52:21-52:22 
 g2 
 EQUALS 
 52:24-52:24 
 = 
 expr 
 expr 
 ID 
 52:26-52:29 
 deep 
 PLUS 
 52:31-52:31 
 + 
 expr 
 NUM 
 52:33-52:33 
 1 
 ELSE 
 53:17-53:20 
 else 
 expr 
 expr 
 ID 
 54:21-54:22 
 g2 
 EQUALS 
 54:24-54:24 
 = 
 expr 
 expr 
 ID 
 54:26-54:29 
 deep 
 MINUS 
 54:31-54:31 
 - 
 expr 
 NUM 
 54:33-54:33 
 1 
 END 
 55:17-55:19 
 end 
 COMMA 
 55:20-55:20 
 , 
 expr 
 WHILE 
 56:17-56:21 
 while 
 expr 
 expr 
 ID 
 56:23-56:24 
 g2 
 GT 
 56:26-56:26 
 > 
 expr 
 NUM 
 56:28-56:28 
 0 
 DO 
 56:30-56:31 
 do 
 expr 
 IF 
 57:21-57:22 
 if 
 expr 
 expr 
 expr 
 ID 
 57:24-57:25 
 g2 
 PERCENT 
 57:27-57:27 
 % 
 expr 
 NUM 
 57:29-57:29 
 2 
 EEQUALS 
 57:31-57:32 
 == 
 expr 
 NUM 
 57:34-57:34 
 0 
 THEN 
 57:36-57:39 
 then 
 expr 
 expr 
 ID 
 58:25-58:26 
 g2 
 EQUALS 
 58:28-58:28 
 = 
 expr 
 expr 
 ID 
 58:30-58:31 
 g2 
 MINUS 
 58:33-58:33 
 - 
 expr 
 NUM 
 58:35-58:35 
 1 
 ELSE 
 59:21-59:24 
 else 
 expr 
 expr 
 ID 
 60:25-60:26 
 g2 
 EQUALS 
 60:28-60:28 
 = 
 expr 
 expr 
 expr 
 ID 
 60:30-60:31 
 g2 
 ASTERISK 
 60:33-60:33 
 * 
 expr 
 NUM 
 60:35-60:35 
 2 
 MINUS 
 60:37-60:37 
 - 
 expr 
 NUM 
 60:39-60:39 
 3 
 END 
 61:21-61:23 
 end 
 END 
 62:17-62:19 
 end 
 COMMA 
 62:20-62:20 
 , 
 expr 
 ID 
 63:17-63:20 
 deep 
 END 
 64:13-64:15 
 end 
 END 
 65:9-65:11 
 end 
 END 
 66:5-66:7 
 end 
 EOF