grammar ANF; aexp : IDENT #var | NUMBER #num | '(' aexp '+' aexp ')' #add | '(' aexp '-' aexp ')' #sub | '(' aexp '*' aexp ')' #mul | '(' aexp '/' aexp ')' #div | '(' IDENT ':' cexp ')' #lam ; funcall : IDENT '(' aexp (',' aexp)* ')' #call | aexp #atom ; cexp : 'let' IDENT '=' funcall 'in' cexp #let | funcall #fc ; IDENT: Letter (Letter | Digit)*; NUMBER: Digit+; fragment Letter: 'A' .. 'Z' | 'a' .. 'z'; fragment Digit: '0'..'9'; WS: [ \t\n\r]+ -> skip;