source 
 prog 
 defn 
 TYP 
 1:1-1:3 
 typ 
 ID 
 1:5-1:5 
 T 
 EQUALS 
 1:7-1:7 
 = 
 type 
 INT 
 1:9-1:11 
 int 
 defn 
 TYP 
 3:1-3:3 
 typ 
 ID 
 3:5-3:9 
 idtyp 
 EQUALS 
 3:11-3:11 
 = 
 type 
 ID 
 3:13-3:13 
 T 
 defn 
 VAR 
 5:1-5:3 
 var 
 ID 
 5:5-5:9 
 idvar 
 COLON 
 5:11-5:11 
 : 
 type 
 ID 
 5:13-5:13 
 T 
 defn 
 FUN 
 7:1-7:3 
 fun 
 ID 
 7:5-7:10 
 idfun1 
 LBRACKET 
 7:12-7:12 
 ( 
 ID 
 7:13-7:16 
 par1 
 COLON 
 7:18-7:18 
 : 
 type 
 LCURLY 
 7:20-7:20 
 { 
 ID 
 7:22-7:22 
 a 
 COLON 
 7:23-7:23 
 : 
 type 
 LCURLY 
 7:25-7:25 
 { 
 ID 
 7:26-7:26 
 a 
 COLON 
 7:27-7:27 
 : 
 type 
 ID 
 7:29-7:29 
 T 
 RCURLY 
 7:30-7:30 
 } 
 COMMA 
 7:31-7:31 
 , 
 ID 
 7:33-7:33 
 b 
 COLON 
 7:34-7:34 
 : 
 type 
 LBRACKET 
 7:36-7:36 
 ( 
 COLON 
 7:37-7:37 
 : 
 type 
 LCURLY 
 7:38-7:38 
 { 
 ID 
 7:39-7:39 
 a 
 COLON 
 7:40-7:40 
 : 
 type 
 LBRACKET 
 7:42-7:42 
 ( 
 ID 
 7:44-7:44 
 g 
 COLON 
 7:46-7:46 
 : 
 type 
 INT 
 7:48-7:50 
 int 
 RBRACKET 
 7:51-7:51 
 ) 
 RCURLY 
 7:52-7:52 
 } 
 COLON 
 7:53-7:53 
 : 
 type 
 BOOL 
 7:54-7:57 
 bool 
 RBRACKET 
 7:58-7:58 
 ) 
 RCURLY 
 7:59-7:59 
 } 
 RBRACKET 
 7:60-7:60 
 ) 
 COLON 
 7:62-7:62 
 : 
 type 
 LCURLY 
 7:64-7:64 
 { 
 ID 
 7:65-7:65 
 a 
 COLON 
 7:66-7:66 
 : 
 type 
 INT 
 7:68-7:70 
 int 
 RCURLY 
 7:71-7:71 
 } 
 defn 
 FUN 
 9:1-9:3 
 fun 
 ID 
 9:5-9:10 
 idfun2 
 LBRACKET 
 9:12-9:12 
 ( 
 RBRACKET 
 9:13-9:13 
 ) 
 COLON 
 9:15-9:15 
 : 
 type 
 VOID 
 9:17-9:20 
 void 
 EQUALS 
 9:22-9:22 
 = 
 expr 
 NOT 
 9:24-9:26 
 not 
 expr 
 TRUE 
 9:28-9:31 
 true 
 COMMA 
 9:32-9:32 
 , 
 expr 
 PLUS 
 9:34-9:34 
 + 
 expr 
 NUM 
 9:35-9:37 
 100 
 COMMA 
 9:38-9:38 
 , 
 expr 
 MINUS 
 9:40-9:40 
 - 
 expr 
 NUM 
 9:41-9:43 
 100 
 COMMA 
 9:44-9:44 
 , 
 expr 
 expr 
 NUM 
 9:46-9:46 
 1 
 PLUS 
 9:47-9:47 
 + 
 expr 
 NUM 
 9:48-9:48 
 2 
 COMMA 
 9:49-9:49 
 , 
 expr 
 expr 
 NUM 
 9:51-9:51 
 1 
 MINUS 
 9:52-9:52 
 - 
 expr 
 NUM 
 9:53-9:53 
 3 
 COMMA 
 9:54-9:54 
 , 
 expr 
 expr 
 NUM 
 9:56-9:56 
 1 
 ASTERISK 
 9:57-9:57 
 * 
 expr 
 NUM 
 9:58-9:58 
 3 
 COMMA 
 9:59-9:59 
 , 
 expr 
 expr 
 NUM 
 9:61-9:61 
 4 
 ASTERISK 
 9:62-9:62 
 * 
 expr 
 NUM 
 9:63-9:64 
 22 
 COMMA 
 9:65-9:65 
 , 
 expr 
 expr 
 NUM 
 9:67-9:67 
 5 
 SLASH 
 9:68-9:68 
 / 
 expr 
 NUM 
 9:69-9:69 
 2 
 COMMA 
 9:70-9:70 
 , 
 expr 
 expr 
 NUM 
 9:72-9:73 
 35 
 PERCENT 
 9:74-9:74 
 % 
 expr 
 NUM 
 9:75-9:76 
 23 
 COMMA 
 9:77-9:77 
 , 
 expr 
 expr 
 TRUE 
 9:79-9:82 
 true 
 AND 
 9:84-9:86 
 and 
 expr 
 FALSE 
 9:88-9:92 
 false 
 COMMA 
 9:93-9:93 
 , 
 expr 
 expr 
 FALSE 
 9:95-9:99 
 false 
 OR 
 9:101-9:102 
 or 
 expr 
 TRUE 
 9:104-9:107 
 true 
 COMMA 
 9:108-9:108 
 , 
 expr 
 LET 
 9:110-9:112 
 let 
 defn 
 VAR 
 9:114-9:116 
 var 
 ID 
 9:118-9:125 
 assignme 
 COLON 
 9:127-9:127 
 : 
 type 
 INT 
 9:129-9:131 
 int 
 defn 
 VAR 
 9:133-9:135 
 var 
 ID 
 9:137-9:137 
 a 
 COLON 
 9:139-9:139 
 : 
 type 
 BOOL 
 9:141-9:144 
 bool 
 defn 
 VAR 
 9:146-9:148 
 var 
 ID 
 9:150-9:150 
 b 
 COLON 
 9:152-9:152 
 : 
 type 
 BOOL 
 9:154-9:157 
 bool 
 IN 
 9:159-9:160 
 in 
 expr 
 expr 
 ID 
 9:162-9:169 
 assignme 
 EQUALS 
 9:171-9:171 
 = 
 expr 
 NUM 
 9:173-9:173 
 1 
 COMMA 
 9:174-9:174 
 , 
 expr 
 expr 
 ID 
 9:177-9:177 
 a 
 EEQUALS 
 9:179-9:180 
 == 
 expr 
 ID 
 9:182-9:182 
 b 
 END 
 9:184-9:186 
 end 
 COMMA 
 9:187-9:187 
 , 
 expr 
 expr 
 NUM 
 9:189-9:191 
 234 
 GEQ 
 9:193-9:194 
 >= 
 expr 
 NUM 
 9:196-9:198 
 123 
 COMMA 
 9:199-9:199 
 , 
 expr 
 expr 
 NUM 
 9:201-9:202 
 23 
 LT 
 9:203-9:203 
 < 
 expr 
 NUM 
 9:204-9:206 
 235 
 COMMA 
 9:207-9:207 
 , 
 expr 
 expr 
 NUM 
 9:209-9:210 
 34 
 GT 
 9:211-9:211 
 > 
 expr 
 NUM 
 9:212-9:212 
 2 
 COMMA 
 9:214-9:214 
 , 
 expr 
 expr 
 NUM 
 9:216-9:216 
 3 
 LT 
 9:217-9:217 
 < 
 expr 
 NUM 
 9:218-9:218 
 5 
 COMMA 
 9:219-9:219 
 , 
 expr 
 expr 
 NUM 
 9:221-9:221 
 2 
 LEQ 
 9:222-9:223 
 <= 
 expr 
 NUM 
 9:224-9:224 
 2 
 EOF