Context-Free Grammar for .fey Format:

script					: block

block					: statement block
						| statement
			
statement				: directive
						| annotation
						| COMMENT
						| line
					
directive				: scene_directive
						| enter_directive
						| action_directive
						| exit_directive
						| music_directive
						| gfx_directive
						| sfx_directive
						| fmv_directive
						| camera_directive
						| choice_directive
					
annotation				: description_annotation
						| section_annotation
						| flagset_annotation
						| varset_annotation
						| dialog_annotation
						| goto_annotation
						| execute_annotation
						| end_annotation
						| while_annotation
						| if_annotation
						| include_annotation
                        | characters_annotation
						| PYTHON_BLOCK
						
line					: ID ':' STRING
						| STRING ':' STRING
						| ':' STRING
						| ID '(' actor_states ')' ':' STRING
						| STRING '(' actor_states ')' ':' STRING
						| '(' actor_states ')' ':' STRING
						
scene_directive			: DIRECTIVEOPEN_SCENE ':' ID ']'
						| DIRECTIVEOPEN_SCENE ':' transition_to ID ']'
						
enter_directive			: DIRECTIVEOPEN_ENTER ':' ID ']'
						| DIRECTIVEOPEN_ENTER ':' ID '(' actor_states ')' ']'
						| DIRECTIVEOPEN_ENTER ':' ID transition_in ']'
						| DIRECTIVEOPEN_ENTER ':' ID '(' actor_states ')' transition_in ']'
						| DIRECTIVEOPEN_ENTER ':' ID motion_geometry ']'
						| DIRECTIVEOPEN_ENTER ':' ID '(' actor_states ')' motion_geometry ']'
						| DIRECTIVEOPEN_ENTER ':' ID transition_in motion_geometry ']'
						| DIRECTIVEOPEN_ENTER ':' ID '(' actor_states ')' transition_in motion_geometry ']'
	
action_directive		: DIRECTIVEOPEN_ACTION ID ':' actor_states ']'
						| DIRECTIVEOPEN_ACTION ID ':' GO destination ']'
						| DIRECTIVEOPEN_ACTION ID ':' GO destination duration ']'
						| DIRECTIVEOPEN_ACTION ID ':' actor_states , GO destination ']'
						| DIRECTIVEOPEN_ACTION ID ':' actor_states , GO destination duration ']'
						
exit_directive			: DIRECTIVEOPEN_EXIT ':' ID ']'
						| DIRECTIVEOPEN_EXIT ':' ID transition_out ']'
						| DIRECTIVEOPEN_EXIT ':' ID motion_geometry ']'
						| DIRECTIVEOPEN_EXIT ':' ID transition_out motion_geometry ']'

music_directive			: DIRECTIVEOPEN_MUSIC ':' STOP ']'
						| DIRECTIVEOPEN_MUSIC ':' STOP duration ']'
						| DIRECTIVEOPEN_MUSIC ':' STOP any_element_id ']'
						| DIRECTIVEOPEN_MUSIC ':' STOP any_element_id duration ']'
						| DIRECTIVEOPEN_MUSIC ':' element_id ']'
						| DIRECTIVEOPEN_MUSIC ':' element_id ',' FADEOUT_OLD ']'
						| DIRECTIVEOPEN_MUSIC ':' element_id ',' FADEOUT_OLD duration ']'
					
gfx_directive			: DIRECTIVEOPEN_GFX ':' ID ']'
						| DIRECTIVEOPEN_GFX ':' LOOP ID ']'
						| DIRECTIVEOPEN_GFX ':' STOP id_or_all']'
						| DIRECTIVEOPEN_GFX ':' STOP id_or_all duration ']'
						| DIRECTIVEOPEN_GFX ':' STOP ']'
						| DIRECTIVEOPEN_GFX ':' STOP duration ']'
						
sfx_directive			: DIRECTIVEOPEN_SFX ':' element_id ']'
						| DIRECTIVEOPEN_SFX ':' LOOP element_id ']'
						| DIRECTIVEOPEN_SFX ':' STOP any_element_id ']'
						| DIRECTIVEOPEN_SFX ':' STOP any_element_id duration ']'
						| DIRECTIVEOPEN_SFX ':' STOP ']'
						| DIRECTIVEOPEN_SFX ':' STOP duration ']'
						
fmv_directive			: DIRECTIVEOPEN_FMV ':' element_id ']'
	
camera_directive		: DIRECTIVEOPEN_CAMERA ':' camera_actions ']'

choice_directive		: DIRECTIVEOPEN_CHOICE ']' STRING choices
						| DIRECTIVEOPEN_CHOICE ':' ID ']' STRING choices
						| DIRECTIVEOPEN_CHOICE ']' choices
						| DIRECTIVEOPEN_CHOICE ':' ID ']' choices

description_annotation	: ANNOTATIONOPEN_DESCRIPTION ':' UNQUOTED_STRING ')'
						| ANNOTATIONOPEN_DESCRIPTION ':' ':' UNQUOTED_STRING ')'
						| ANNOTATIONOPEN_DESCRIPTION ':' ID ':' UNQUOTED_STRING ')'			
					
section_annotation		: ANNOTATIONOPEN_SECTION ':' ID ')'
						| ANNOTATIONOPEN_SECTION ':' ID PARAMSOPEN params_declaration ')'

flagset_annotation		: ANNOTATIONOPEN_FLAGSET ':' ID ')'
						| ANNOTATIONOPEN_FLAGSET ':' ID bool_expression ')'
					
varset_annotation		: ANNOTATIONOPEN_VARSET ':' ID ')'
						| ANNOTATIONOPEN_VARSET ':' ID inc_dec ')'
						| ANNOTATIONOPEN_VARSET ':' ID expression ')'
					
dialog_annotation		: ANNOTATIONOPEN_DIALOG ':' HIDE ')'
						| ANNOTATIONOPEN_DIALOG ':' SHOW ')'
						| ANNOTATIONOPEN_DIALOG ':' AUTO ')'
						
goto_annotation			: ANNOTATIONOPEN_GOTO ':' ID ')'
	
execute_annotation		: ANNOTATIONOPEN_EXECUTE ':' ID ')'
						| ANNOTATIONOPEN_EXECUTE ':' ID PARAMSOPEN params_set ')'

end_annotation			: ANNOTATIONOPEN_END ')'
						| ANNOTATIONOPEN_END ':' RETURN expression ')'
					
while_annotation		: ANNOTATIONOPEN_WHILE ':' bool_expression ')' '{' block '}'

if_annotation			: ANNOTATIONOPEN_IF ':' bool_expression ')' '{' block '}'
						| ANNOTATIONOPEN_IF ':' bool_expression ')' '{' block '}' ANNOTATIONOPEN_ELSE ')' '{' block '}'
						| ANNOTATIONOPEN_IF ':' bool_expression ')' '{' block '}' else_ifs
						| ANNOTATIONOPEN_IF ':' bool_expression ')' '{' block '}' else_ifs ANNOTATIONOPEN_ELSE ')' '{' block '}'
						
include_annotation		: ANNOTATIONOPEN_INCLUDE ':' STRING ')'
						| ANNOTATIONOPEN_INCLUDE ':' STRING FOR_TARGET id_list ')'
						| ANNOTATIONOPEN_INCLUDE ':' STRING WITH_PARSING ')'
						| ANNOTATIONOPEN_INCLUDE ':' STRING WITH_PARSING bool_literal ')'
						| ANNOTATIONOPEN_INCLUDE ':' STRING FOR_TARGET id_list WITH_PARSING ')'
						| ANNOTATIONOPEN_INCLUDE ':' STRING FOR_TARGET id_list WITH_PARSING bool_literal ')'

characters_annotation   : ANNOTATIONOPEN_CHARACTERS ':' STRING ')'
					
transition_to			: ID TO
	
actor_states			: ID
						| actor_states ',' ID
					
transition_in			: ID IN
						| WITH_PREVIOUS

motion_geometry			: destination
						| origin destination
						| destination duration
						| origin destination duration
						| origin
						| duration
						| origin duration
					
destination				: TO ID

transition_out			: ID OUT
						| WITH_PREVIOUS

any_element_id			: element_id
						| ALL
					
duration				: FOR NUMBER
						| FOR NUMBER SECONDS
						| OVER NUMBER
						| OVER NUMBER SECONDS
						| QUICKLY
						| SLOWLY
					
element_id				: STRING
						| ID

camera_actions			: camera_action
						| camera_action AND camera_actions
					
choices					: choice
						| choice choices
		
params_declaration		: ID
						| ID '=' expression
						| ID ',' params_declaration
						| ID '=' expression ',' params_declaration

bool_literal			: OFF
						| ON
						
bool_expression			: bool_literal
						| BARE_EXPRESSION
						| ID
	
inc_dec					: INC
						: INC by_amount
						: DEC
						: DEC by_amount

expression				: bool_expression
						| STRING
						| NUMBER
					
params_set				: expression
						| ID '=' expression
						| expression ',' params_set
						| ID '=' expression ',' params_set
		
else_ifs				: ANNOTATIONOPEN_ELIF ':' bool_expression ')' '{' block '}'
						| ANNOTATIONOPEN_ELIF ':' bool_expression ')' '{' block '}' else_ifs

origin					: FROM ID
						
camera_action			: SNAP_TO ID
						| PAN_TO ID
						| PAN_TO ID duration
						| ZOOM IN
						| ZOOM OUT
						| ZOOM IN duration
						| ZOOM OUT duration
					
by_amount				: BY NUMBER
					
choice					: '*' STRING ':' GO destination
						| '*' STRING ':' SHOW_IF bool_expression ',' GO destination
						| '*' STRING ':' varsets AND GO destination
						| '*' STRING ':' SHOW_IF bool_expression ',' varsets AND GO destination

varsets					: SET ID inc_dec
						| SET ID expression
						| varsets AND SET ID inc_dec
						| varsets AND SET ID expression
						
id_or_all				: ID
						| ALL
						
id_list					: ID
						| id_list AND ID