<PROGRAM> ::= <DEFINITIONS>
<DEFINITIONS> ::= ε
| <DEF> <DEFINITIONS>
<DEF> ::= function <IDENTIFIER> ( <FORMALS> ) : <TYPE>
<BODY>
<FORMALS> ::= ε
| <NONEMPTYFORMALS>
<NONEMPTYFORMALS> ::= <FORMAL>
| <FORMAL> , <NONEMPTYFORMALS>
<FORMAL> ::= <IDENTIFIER> : <TYPE>
<BODY> ::= <PRINT-STATEMENT> <BODY>
| <EXPR>
<TYPE> ::= integer
| boolean
<EXPR> ::= <EXPR> < <SIMPLE-EXPR>
| <EXPR> = <SIMPLE-EXPR>
| <SIMPLE-EXPR>
<SIMPLE-EXPR> ::= <SIMPLE-EXPR> or <TERM>
| <SIMPLE-EXPR> + <TERM>
| <SIMPLE-EXPR> - <TERM>
| <TERM>
<TERM> ::= <TERM> and <FACTOR>
| <TERM> * <FACTOR>
| <TERM> / <FACTOR>
| <FACTOR>
<FACTOR> ::= if <EXPR> then <EXPR> else <EXPR>
| not <FACTOR>
| <IDENTIFIER> ( <ACTUALS> )
| <IDENTIFIER>
| <LITERAL>
| - <FACTOR>
| ( <EXPR> )
<ACTUALS> ::= ε
| <NONEMPTYACTUALS>
<NONEMPTYACTUALS> ::= <EXPR>
| <EXPR> , <NONEMPTYACTUALS>
<LITERAL> ::= <NUMBER>
| <BOOLEAN>
<PRINT-STATEMENT> ::= print ( <EXPR> )