<MODEL_FILE> ::= <RESOURCE_BLOCK> | <RESOURCE_BLOCK> <MODEL>

<RESOURCE_BLOCK> ::= resources { <RESOURCE_LIST> }

<RESOURCE_LIST> ::= <RESOURCE> | <RESOURCE> <RESOURCE_LIST>

<RESOURCE> ::= <RESOURCE_IMAGE> | <RESOURCE_SOUND>

<RESOURCE_IMAGE> ::= gfx( <IDENTIFIER>, <FILENAME> )
                 | global gfx( <IDENTIFIER>, <FILENAME> )

<RESOURCE_SOUND> ::= sound( <IDENTIFIER>, <FILENAME> )
                 | global gfx( <IDENTIFIER>, <FILENAME> )

<MODEL> ::= model { <MODEL_DESCRIPTION> }

<MODEL_DESCRIPTION> ::= <MODEL_ATOM_LIST>

<MODEL_ATOM_LIST> ::= <MODEL_ATOM> ; | <MODEL_ATOM> ; <MODEL_ATOM_LIST>

<MODEL_ATOM> ::= <CONST_DECLARATION> | <ACTION>

<CONST_DECLARATION> ::= let <IDENTIFIER> = <ANY_TYPE> ;

<ACTION> ::= action <IDENTIFIER> ( <ANIMATION>, <IDENTIFIER> )

<ANY_TYPE> ::= <IDENTIFIER> | <U_INTEGER> | <REAL> | <BOOLEAN> | <IMAGE>
           |   <ANIMATION>

<U_INTEGER> ::= integer( <U_INTEGER> ) | <DIGIT_LIST>

<REAL> ::= real( <REAL> ) | <SIGNED_REAL> | <UNSIGNED_REAL>

<BOOLEAN> ::= bool( <BOOLEAN> ) | true | false

<IMAGE> ::= image( <IDENTIFIER>, <U_INTEGER>, <U_INTEGER>, <U_INTEGER>,
                   <U_INTEGER> ) <IMAGE_BODY>

<ANIMATION> ::= animation( <FRAME_LIST> ) <ANIMATION_BODY>

<FRAME_LIST> ::= [ <IMAGE_LIST> ]

<IMAGE_LIST> ::= <IMAGE> | <IDENTIFIER> | <IMAGE> , <IMAGE_LIST>
             |   <IDENTIFIER> , <IMAGE_LIST>

<DIGIT_LIST> ::= <DIGIT> | <DIGIT> <DIGIT_LIST>

<DIGIT> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

<SIGNED_REAL> ::= <SIGN> <UNSIGNED_REAL>

<SIGN> ::= + | -

<UNSIGNED_REAL> ::= . <DIGIT_LIST> | <DIGIT_LIST> . <DIGIT_LIST>

<IMAGE_BODY> ::= { <IMAGE_BODY_ITEM_LIST> } | { }

<IMAGE_BODY_ITEM_LIST> ::= <IMAGE_BODY_ITEM>
                       |   <IMAGE_BODY_ITEM> <IMAGE_BODY_ITEM_LIST>

<IMAGE_BODY_ITEM> ::= <IDENTIFIER> = <ANY_TYPE> ;

<ANIMATION_BODY> ::= <IMAGE_BODY>