BNF --- program = definitions expression definitions = definition definitions | e definition = identifier identifiers = expression ; identifiers = identifier identifiers | e expression = identifier atomicExpressions | atomicExpression atomicExpressions = atomicExpression atomicExpressions | e atomicExpression = number | ( expression ) Abstract Syntax --------------- module Syntax where data Program = Program [Definition] Expression data Definition = Definition Identifier [Identifier] Expression data Expression = Number Int | Application Identifier [Expression] type Identifier = String