source 
 prog 
 defn 
 FUN 
 1:1-1:3 
 fun 
 ID 
 1:5-1:9 
 funny 
 LBRACKET 
 1:10-1:10 
 ( 
 RBRACKET 
 1:11-1:11 
 ) 
 COLON 
 1:13-1:13 
 : 
 type 
 VOID 
 1:15-1:18 
 void 
 EQUALS 
 1:20-1:20 
 = 
 expr 
 expr 
 HAT 
 1:22-1:22 
 ^ 
 expr 
 expr 
 expr 
 expr 
 ID 
 1:23-1:23 
 a 
 LSQUARE 
 1:24-1:24 
 [ 
 expr 
 ID 
 1:25-1:25 
 b 
 RSQUARE 
 1:26-1:26 
 ] 
 DOT 
 1:27-1:27 
 . 
 ID 
 1:28-1:28 
 c 
 HAT 
 1:29-1:29 
 ^ 
 AS 
 1:31-1:32 
 as 
 type 
 LCURLY 
 1:34-1:34 
 { 
 ID 
 1:36-1:36 
 a 
 COLON 
 1:37-1:37 
 : 
 type 
 LCURLY 
 1:39-1:39 
 { 
 RCURLY 
 1:40-1:40 
 } 
 COMMA 
 1:41-1:41 
 , 
 ID 
 1:43-1:43 
 b 
 COLON 
 1:44-1:44 
 : 
 type 
 LBRACKET 
 1:46-1:46 
 ( 
 COLON 
 1:47-1:47 
 : 
 type 
 LCURLY 
 1:48-1:48 
 { 
 ID 
 1:49-1:49 
 a 
 COLON 
 1:50-1:50 
 : 
 type 
 LBRACKET 
 1:52-1:52 
 ( 
 ID 
 1:54-1:54 
 g 
 COLON 
 1:56-1:56 
 : 
 type 
 INT 
 1:58-1:60 
 int 
 RBRACKET 
 1:61-1:61 
 ) 
 RCURLY 
 1:62-1:62 
 } 
 COLON 
 1:63-1:63 
 : 
 type 
 BOOL 
 1:64-1:67 
 bool 
 RBRACKET 
 1:68-1:68 
 ) 
 RCURLY 
 1:69-1:69 
 } 
 COMMA 
 1:70-1:70 
 , 
 expr 
 SIZEOF 
 1:72-1:77 
 sizeof 
 type 
 LCURLY 
 1:79-1:79 
 { 
 ID 
 1:81-1:81 
 a 
 COLON 
 1:82-1:82 
 : 
 type 
 LCURLY 
 1:84-1:84 
 { 
 RCURLY 
 1:85-1:85 
 } 
 COMMA 
 1:86-1:86 
 , 
 ID 
 1:88-1:88 
 b 
 COLON 
 1:89-1:89 
 : 
 type 
 LBRACKET 
 1:91-1:91 
 ( 
 COLON 
 1:92-1:92 
 : 
 type 
 LCURLY 
 1:93-1:93 
 { 
 ID 
 1:94-1:94 
 a 
 COLON 
 1:95-1:95 
 : 
 type 
 LBRACKET 
 1:97-1:97 
 ( 
 ID 
 1:99-1:99 
 g 
 COLON 
 1:101-1:101 
 : 
 type 
 INT 
 1:103-1:105 
 int 
 RBRACKET 
 1:106-1:106 
 ) 
 RCURLY 
 1:107-1:107 
 } 
 COLON 
 1:108-1:108 
 : 
 type 
 BOOL 
 1:109-1:112 
 bool 
 RBRACKET 
 1:113-1:113 
 ) 
 RCURLY 
 1:114-1:114 
 } 
 defn 
 TYP 
 4:1-4:3 
 typ 
 ID 
 4:5-4:5 
 t 
 EQUALS 
 4:7-4:7 
 = 
 type 
 LBRACKET 
 4:9-4:9 
 ( 
 COLON 
 4:10-4:10 
 : 
 COLON 
 4:11-4:11 
 : 
 type 
 ID 
 4:12-4:12 
 t 
 RBRACKET 
 4:13-4:13 
 ) 
 EOF