In computer science, A-normal form (abbreviated ANF, sometimes expanded as administrative normal form) is an intermediate representation of programs in functional programming language compilers. 
In ANF, all arguments to a function must be trivial (constants or variables).  That is, evaluation of each argument must halt immediately. 

ANF was introduced by Sabry and Felleisen in 1992 as a simpler alternative to continuation-passing style (CPS).  Some of the advantages of using CPS as an intermediate representation are that optimizations are easier to perform on programs in CPS than in the source language, and that it is also easier for compilers to generate machine code for programs in CPS. Flanagan et al. showed how compilers could use ANF to achieve those same benefits with one source-level transformation; in contrast, for realistic compilers the CPS transformation typically involves additional phases, for example, to simplify CPS terms.

Grammar

Consider the pure λ-calculus with weak reduction and let-expressions. The ANF restriction is enforced by
 allowing only constants, λ-terms, and variables, to serve as arguments of function applications, and
 requiring that the result of a non-trivial expression be captured by a let-bound variable or returned from a function.

The following BNF grammar describes the syntax of λ-expressions modified to support the constraints of ANF:
EXP ::= VAL 
      | let VAR = VAL in EXP
      | let VAR = VAL VAL in EXP

VAL ::= VAR
      | λ VAR . EXP
Variants of ANF used in compilers or in research often allow constants, records, tuples, multiargument functions, primitive operations and conditional expressions as well.

Examples

The expression:

 f(g(x),h(y))

is written in ANF as:

 let v0 = g(x) in
     let v1 = h(y) in
         f(v0,v1)

See also 
 Continuation-passing style
 Static single assignment form

References 

Functional programming
Implementation of functional programming languages