| summaryrefslogtreecommitdiff |
diff options
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 | 108 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/parser/FateParser.g4 | 169 |
2 files changed, 160 insertions, 117 deletions
diff --git a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 index 4240c1b..9e30322 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 @@ -9,62 +9,64 @@ fragment SEP: [ \t\r\n]+; WS: SEP; -L_PAREN: WS* '('; -R_PAREN: WS* ')'; +L_PAREN: '('; +R_PAREN: ')'; -ADD_KW: L_PAREN 'add' WS*; -ADD_VARIABLE_ATTRIBUTE_KW: L_PAREN 'add_variable_attribute' WS*; -AND_KW: L_PAREN ('and'|'/\\') WS*; -ASSERT_KW: L_PAREN 'assert' WS*; -CAST_KW: L_PAREN 'cast' WS*; -CLEAR_KW: L_PAREN 'clear' WS*; -COND_KW: L_PAREN 'cond' WS*; -COUNT_KW: L_PAREN 'count' WS*; -DECLARE_ALIAS_TYPE_KW: L_PAREN 'declare_subtype' WS*; -DECLARE_DICT_TYPE_KW: L_PAREN 'declare_dict_type' WS*; -DECLARE_EVENT_TYPE_KW: L_PAREN 'declare_event_type' WS*; -DECLARE_TEXT_EFFECT: L_PAREN 'declare_text_effect' WS*; -DECLARE_TEXT_EFFECT_KW: L_PAREN 'declare_text_effect' WS*; -DECLARE_VARIABLE_KW: L_PAREN 'declare_variable' WS*; -DEFINE_MACRO_KW: L_PAREN 'define_macro' WS*; -DEFINE_SEQUENCE_KW: L_PAREN 'define_sequence' WS*; -DIVIDE_KW: L_PAREN ('divide'|'/') WS*; -ENABLE_TEXT_PARAMETER_KW: L_PAREN 'enable_text_parameter' WS*; -EQUALS_KW: L_PAREN ('equals'|'='|'==') WS*; -EVENT_KW: L_PAREN 'event' WS*; +ADD_KW: L_PAREN 'add'; +ADD_VARIABLE_ATTRIBUTE_KW: L_PAREN 'add_variable_attribute'; +AND_KW: L_PAREN ('and'|'/\\'); +ASSERT_KW: L_PAREN 'assert'; +CAST_KW: L_PAREN 'cast'; +CLEAR_KW: L_PAREN 'clear'; +COND_KW: L_PAREN 'cond'; +COUNT_KW: L_PAREN 'count'; +DECLARE_ALIAS_TYPE_KW: L_PAREN 'declare_subtype'; +DECLARE_DICT_TYPE_KW: L_PAREN 'declare_dict_type'; +DECLARE_EVENT_TYPE_KW: L_PAREN 'declare_event_type'; +DECLARE_TEXT_EFFECT: L_PAREN 'declare_text_effect'; +DECLARE_TEXT_EFFECT_KW: L_PAREN 'declare_text_effect'; +DECLARE_VARIABLE_KW: L_PAREN 'declare_variable'; +DEFINE_MACRO_KW: L_PAREN 'define_macro'; +DEFINE_SEQUENCE_KW: L_PAREN 'define_sequence'; +DIVIDE_KW: L_PAREN ('divide'|'/'); +ENABLE_TEXT_PARAMETER_KW: L_PAREN 'enable_text_parameter'; +EQUALS_KW: L_PAREN ('equals'|'='|'=='); +EVENT_KW: L_PAREN 'event'; +EXTENSION_INSTRUCTION_KW: L_PAREN '#'; +EXTENSION_VALUE_KW: L_PAREN '$'; FALSE_KW: L_PAREN 'false)'; -FATE_VERSION_KW: L_PAREN 'fate_version' WS*; -GET_KW: L_PAREN 'get' WS*; -SET_FIELD_KW: L_PAREN 'set_field' WS*; -GREATER_EQUAL_THAN_KW: L_PAREN ('greater_equal_than'|'>=') WS*; -GREATER_THAN_KW: L_PAREN ('greater_than'|'>') WS*; -IF_ELSE_KW: L_PAREN 'if_else' WS*; -IF_KW: L_PAREN 'if' WS*; -IMPLIES_KW: L_PAREN ('implies'|'=>') WS*; -IS_MEMBER_KW: L_PAREN 'is_member' WS*; -LOWER_EQUAL_THAN_KW: L_PAREN ('lower_equal_than'|'=<'|'<=') WS*; -LOWER_THAN_KW: L_PAREN ('lower_than'|'<') WS*; -MACRO_KW: L_PAREN 'macro' WS*; -MINUS_KW: L_PAREN ('minus'|'-') WS*; -NEWLINE_KW: L_PAREN 'newline' WS*; -NOT_KW: L_PAREN ('not'|'~'|'!') WS*; -ONE_IN_KW: L_PAREN 'one_in' WS*; -OR_KW: L_PAREN ('or'|'\\/') WS*; -PARAMETER_KW: L_PAREN 'parameter' WS*; -PLAYER_CHOICE_KW: L_PAREN 'player_choice' WS*; -PLUS_KW: L_PAREN ('plus'|'+') WS*; -POWER_KW: L_PAREN ('power'|'^'|'**') WS*; -RANDOM_KW: L_PAREN ('random'|'rand') WS*; -REMOVE_ALL_KW: L_PAREN 'remove_all' WS*; -REMOVE_ONE_KW: L_PAREN 'remove_one' WS*; -REQUIRE_EXTENSION_KW: L_PAREN 'require_extension' WS*; -REQUIRE_KW: L_PAREN 'require' WS*; -SEQUENCE_KW: L_PAREN 'sequence' WS*; -SET_EXPRESSION_KW: L_PAREN 'set_expression' WS*; -SET_KW: L_PAREN 'set' WS*; -TIMES_KW: L_PAREN ('times'|'*') WS*; +FATE_VERSION_KW: L_PAREN 'fate_version'; +GET_KW: L_PAREN 'get'; +GREATER_EQUAL_THAN_KW: L_PAREN ('greater_equal_than'|'>='); +GREATER_THAN_KW: L_PAREN ('greater_than'|'>'); +IF_ELSE_KW: L_PAREN 'if_else'; +IF_KW: L_PAREN 'if'; +IMPLIES_KW: L_PAREN ('implies'|'=>'); +IS_MEMBER_KW: L_PAREN 'is_member'; +LOWER_EQUAL_THAN_KW: L_PAREN ('lower_equal_than'|'=<'|'<='); +LOWER_THAN_KW: L_PAREN ('lower_than'|'<'); +MACRO_KW: L_PAREN 'macro'; +MINUS_KW: L_PAREN ('minus'|'-'); +NEWLINE_KW: L_PAREN 'newline'; +NOT_KW: L_PAREN ('not'|'~'|'!'); +ONE_IN_KW: L_PAREN 'one_in'; +OR_KW: L_PAREN ('or'|'\\/'); +PARAMETER_KW: L_PAREN ('param'|'parameter'); +PLAYER_CHOICE_KW: L_PAREN ('choice'|'user_choice'|'player_choice'); +PLUS_KW: L_PAREN ('plus'|'+'); +POWER_KW: L_PAREN ('power'|'^'|'**'); +RANDOM_KW: L_PAREN ('random'|'rand'); +REMOVE_ALL_KW: L_PAREN 'remove_all'; +REMOVE_ONE_KW: L_PAREN 'remove_one'; +REQUIRE_EXTENSION_KW: L_PAREN 'require_extension'; +REQUIRE_KW: L_PAREN 'require'; +SEQUENCE_KW: L_PAREN 'sequence'; +SET_EXPRESSION_KW: L_PAREN 'set_expression'; +SET_FIELD_KW: L_PAREN 'set_field'; +SET_KW: L_PAREN 'set'; +TIMES_KW: L_PAREN ('times'|'*'); TRUE_KW: L_PAREN 'true)'; -VARIABLE_KW: L_PAREN 'variable' WS*; +VARIABLE_KW: L_PAREN 'variable'; WORD: (~([ \t\r\n()])|'\\)'|'\\(')+; diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 index aa20ad6..b0276ec 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 @@ -40,7 +40,7 @@ fate_file [Context context, World world] WORLD = world; } : - WS* FATE_VERSION_KW WORD R_PAREN WS* + WS* FATE_VERSION_KW WS+ WORD WS* R_PAREN WS* ( (first_level_fate_instr|general_fate_instr) { @@ -60,9 +60,11 @@ general_fate_sequence: first_level_fate_instr: DEFINE_SEQUENCE_KW + WS+ new_reference_name WS+ first_node=general_fate_sequence + WS* R_PAREN { /* @@ -79,7 +81,15 @@ first_level_fate_instr: */ } - | DECLARE_VARIABLE_KW scope=WORD WS+ type WS+ name=new_reference_name R_PAREN + | DECLARE_VARIABLE_KW + WS+ + scope=WORD + WS+ + type + WS+ + name=new_reference_name + WS* + R_PAREN { final Origin start_origin, scope_origin, type_origin; final Variable new_variable; @@ -123,7 +133,13 @@ first_level_fate_instr: WORLD.variables().add(new_variable); } - | DECLARE_TEXT_EFFECT_KW params=type_list new_reference_name R_PAREN + | DECLARE_TEXT_EFFECT_KW + WS+ + params=type_list + WS* + new_reference_name + WS* + R_PAREN { final Origin start_origin; final TextEffect new_text_effect; @@ -146,12 +162,12 @@ first_level_fate_instr: WORLD.text_effects().add(new_text_effect); } - | REQUIRE_EXTENSION_KW WORD R_PAREN + | REQUIRE_EXTENSION_KW WS+ WORD WS* R_PAREN { WORLD.add_required_extension(($WORD.text)); } - | DECLARE_ALIAS_TYPE_KW parent=type WS+ new_reference_name R_PAREN + | DECLARE_ALIAS_TYPE_KW WS+ parent=type WS+ new_reference_name WS* R_PAREN { final Origin start_origin; final Type new_type; @@ -174,7 +190,13 @@ first_level_fate_instr: WORLD.types().add(new_type); } - | DECLARE_DICT_TYPE_KW new_reference_name WS* typed_entry_list R_PAREN + | DECLARE_DICT_TYPE_KW + WS+ + new_reference_name + WS* + typed_entry_list + WS* + R_PAREN { final Origin start_origin; final Type new_type; @@ -209,19 +231,19 @@ first_level_fate_instr: WORLD.types().add(new_type); } - | ADD_KW value WS+ value_reference R_PAREN + | ADD_KW WS+ value WS+ value_reference WS* R_PAREN { } - | REMOVE_ONE_KW value WS+ value_reference R_PAREN + | REMOVE_ONE_KW WS+ value WS+ value_reference WS* R_PAREN { } - | REMOVE_ALL_KW value WS+ value_reference R_PAREN + | REMOVE_ALL_KW WS+ value WS+ value_reference WS* R_PAREN { } - | DECLARE_EVENT_TYPE_KW new_reference_name WS+ type_list R_PAREN + | DECLARE_EVENT_TYPE_KW WS+ new_reference_name WS+ type_list WS* R_PAREN { final Origin start_origin; final Event new_event; @@ -244,14 +266,18 @@ first_level_fate_instr: WORLD.events().add(new_event); } - | REQUIRE_KW WORD R_PAREN + | REQUIRE_KW WS+ WORD WS* R_PAREN { } | DEFINE_MACRO_KW - new_reference_name WS* - L_PAREN WS+ typed_entry_list R_PAREN + WS+ + new_reference_name + WS* + L_PAREN WS+ typed_entry_list WS* R_PAREN + WS* general_fate_sequence + WS* R_PAREN { } @@ -262,57 +288,67 @@ catch [final Throwable e] } general_fate_instr: - L_PAREN WS+ general_fate_sequence R_PAREN + L_PAREN WS+ general_fate_sequence WS* R_PAREN { } - | CLEAR_KW value_reference R_PAREN + | CLEAR_KW WS+ value_reference WS* R_PAREN { } - | SET_KW value WS+ value_reference R_PAREN + | SET_KW WS+ value WS+ value_reference WS* R_PAREN { } - | SET_FIELD_KW WORD WS+ value WS+ value_reference R_PAREN + | SET_FIELD_KW WS+ WORD WS+ value WS+ value_reference WS* R_PAREN { } - | SET_EXPRESSION_KW value WS+ value_reference R_PAREN + | SET_EXPRESSION_KW WS+ value WS+ value_reference WS* R_PAREN { /* that one isn't resolved until the value is referenced */ } - | EVENT_KW WORD WS+ value_list R_PAREN + | EVENT_KW WS+ WORD WS+ value_list WS* R_PAREN + { + } + + | MACRO_KW WS+ WORD WS+ value_list WS* R_PAREN { } - | MACRO_KW WORD WS+ value_list R_PAREN + | SEQUENCE_KW WS+ WORD WS* R_PAREN { } - | SEQUENCE_KW WORD R_PAREN + | ASSERT_KW WS+ value WS* R_PAREN { } - | ASSERT_KW value R_PAREN + | IF_KW WS+ value WS* general_fate_instr WS* R_PAREN { } - | IF_KW value WS+ general_fate_instr R_PAREN + | IF_ELSE_KW + WS+ value + WS+ general_fate_instr + WS+ general_fate_instr + WS* R_PAREN { } - | IF_ELSE_KW value WS+ general_fate_instr WS+ general_fate_instr R_PAREN + | COND_KW WS+ instr_cond_list WS* R_PAREN { } - | COND_KW instr_cond_list R_PAREN + | PLAYER_CHOICE_KW WS+ player_choice+ WS* R_PAREN { } - | PLAYER_CHOICE_KW player_choice* R_PAREN + | EXTENSION_INSTRUCTION_KW WORD WS+ general_fate_sequence WS* R_PAREN { + /* Extension stuff */ + System.out.println("Using extension instruction " + ($WORD.text)); } | text+ @@ -321,31 +357,31 @@ general_fate_instr: ; instr_cond_list: - (L_PAREN value WS+ general_fate_instr R_PAREN)+ + (L_PAREN WS* value WS+ general_fate_instr WS* R_PAREN)+ { } ; player_choice: - L_PAREN L_PAREN text+ R_PAREN WS+ general_fate_instr R_PAREN + L_PAREN WS* L_PAREN text+ R_PAREN WS+ general_fate_sequence WS* R_PAREN { } - | IF_KW value WS+ player_choice R_PAREN + | IF_KW WS+ value WS+ player_choice WS* R_PAREN { } - | IF_ELSE_KW value WS+ player_choice WS+ player_choice R_PAREN + | IF_ELSE_KW WS+ value WS+ player_choice WS+ player_choice WS* R_PAREN { } - | COND_KW player_choice_cond_list R_PAREN + | COND_KW WS+ player_choice_cond_list WS* R_PAREN { } ; player_choice_cond_list: - (L_PAREN value WS+ player_choice R_PAREN)+ + (L_PAREN WS* value WS+ player_choice WS* R_PAREN)+ { } ; @@ -355,7 +391,7 @@ text: { } - | ENABLE_TEXT_PARAMETER_KW WORD WS+ text+ R_PAREN + | ENABLE_TEXT_PARAMETER_KW WS+ WORD WS+ text+ WS* R_PAREN { } @@ -377,12 +413,12 @@ sentence first_word=WORD ( - WS next_word=WORD + WS+ next_word=WORD { string_builder.append(" "); string_builder.append(($next_word.text)); } - )+ + )* { string_builder.insert(0, ($first_word.text)); } @@ -441,7 +477,7 @@ returns [TypedEntryList result] } : ( - L_PAREN type WS+ new_reference_name R_PAREN + L_PAREN WS* type WS+ new_reference_name WS* R_PAREN { $result.add ( @@ -525,7 +561,7 @@ returns [ValueNode result]: ); } - | AND_KW value_list R_PAREN + | AND_KW WS+ value_list WS* R_PAREN { $result = Operation.build @@ -540,7 +576,7 @@ returns [ValueNode result]: ); } - | OR_KW value_list R_PAREN + | OR_KW WS+ value_list WS* R_PAREN { $result = Operation.build @@ -555,7 +591,7 @@ returns [ValueNode result]: ); } - | ONE_IN_KW value_list R_PAREN + | ONE_IN_KW WS+ value_list WS* R_PAREN { $result = Operation.build @@ -570,7 +606,7 @@ returns [ValueNode result]: ); } - | NOT_KW value_list R_PAREN + | NOT_KW WS+ value_list WS* R_PAREN { $result = Operation.build @@ -585,7 +621,7 @@ returns [ValueNode result]: ); } - | IMPLIES_KW value_list R_PAREN + | IMPLIES_KW WS+ value_list WS* R_PAREN { $result = Operation.build @@ -600,7 +636,7 @@ returns [ValueNode result]: ); } - | LOWER_THAN_KW value_list R_PAREN + | LOWER_THAN_KW WS+ value_list WS* R_PAREN { $result = Operation.build @@ -615,7 +651,7 @@ returns [ValueNode result]: ); } - | LOWER_EQUAL_THAN_KW value_list R_PAREN + | LOWER_EQUAL_THAN_KW WS+ value_list WS* R_PAREN { $result = Operation.build @@ -630,7 +666,7 @@ returns [ValueNode result]: ); } - | EQUALS_KW value_list R_PAREN + | EQUALS_KW WS+ value_list WS* R_PAREN { $result = Operation.build @@ -645,7 +681,7 @@ returns [ValueNode result]: ); } - | GREATER_EQUAL_THAN_KW value_list R_PAREN + | GREATER_EQUAL_THAN_KW WS+ value_list WS* R_PAREN { $result = Operation.build @@ -660,7 +696,7 @@ returns [ValueNode result]: ); } - | GREATER_THAN_KW value_list R_PAREN + | GREATER_THAN_KW WS+ value_list WS* R_PAREN { $result = Operation.build @@ -675,7 +711,7 @@ returns [ValueNode result]: ); } - | IS_MEMBER_KW value WS+ value_reference R_PAREN + | IS_MEMBER_KW WS+ value WS+ value_reference WS* R_PAREN { /* TODO */ $result = null; @@ -688,7 +724,7 @@ catch [final Throwable e] math_expression returns [ValueNode result]: - PLUS_KW value_list R_PAREN + PLUS_KW WS+ value_list WS* R_PAREN { $result = Operation.build @@ -703,7 +739,7 @@ returns [ValueNode result]: ); } - | MINUS_KW value_list R_PAREN + | MINUS_KW WS+ value_list WS* R_PAREN { $result = Operation.build @@ -718,7 +754,7 @@ returns [ValueNode result]: ); } - | TIMES_KW value_list R_PAREN + | TIMES_KW WS+ value_list WS* R_PAREN { $result = Operation.build @@ -733,7 +769,7 @@ returns [ValueNode result]: ); } - | DIVIDE_KW value_list R_PAREN + | DIVIDE_KW WS+ value_list WS* R_PAREN { $result = Operation.build @@ -748,7 +784,7 @@ returns [ValueNode result]: ); } - | POWER_KW value_list R_PAREN + | POWER_KW WS+ value_list WS* R_PAREN { $result = Operation.build @@ -763,7 +799,7 @@ returns [ValueNode result]: ); } - | RANDOM_KW value_list R_PAREN + | RANDOM_KW WS+ value_list WS* R_PAREN { $result = Operation.build @@ -778,7 +814,7 @@ returns [ValueNode result]: ); } - | COUNT_KW value WS+ value_reference R_PAREN + | COUNT_KW WS+ value WS+ value_reference WS* R_PAREN { /* TODO */ $result= null; @@ -806,7 +842,7 @@ returns [ValueNode result] ); } - | L_PAREN WS+ sentence R_PAREN + | L_PAREN WS+ sentence WS* R_PAREN { /* TODO */ $result = null; @@ -821,7 +857,7 @@ returns [ValueNode result] non_text_value returns [ValueNode result] : - IF_ELSE_KW cond=value WS+ if_true=value WS+ if_false=value R_PAREN + IF_ELSE_KW WS+ cond=value WS+ if_true=value WS+ if_false=value WS* R_PAREN { $result = IfElseValue.build @@ -837,7 +873,7 @@ returns [ValueNode result] ); } - | COND_KW value_cond_list R_PAREN + | COND_KW WS+ value_cond_list WS* R_PAREN { /* TODO */ $result = null; @@ -853,7 +889,7 @@ returns [ValueNode result] $result = ($math_expression.result); } - | CAST_KW WORD value R_PAREN + | CAST_KW WS+ WORD WS+ value WS* R_PAREN { final Origin target_type_origin; final Type target_type; @@ -880,6 +916,13 @@ returns [ValueNode result] ); } + | EXTENSION_VALUE_KW WORD WS+ general_fate_sequence WS* R_PAREN + { + /* TODO: no param alternative. */ + /* Extension stuff */ + System.out.println("Using extension value " + ($WORD.text)); + } + | value_reference { /* TODO */ @@ -892,21 +935,21 @@ catch [final Throwable e] } value_reference: - VARIABLE_KW WORD R_PAREN + VARIABLE_KW WS+ WORD WS* R_PAREN { } - | PARAMETER_KW WORD R_PAREN + | PARAMETER_KW WS+ WORD WS* R_PAREN { } - | GET_KW value_reference R_PAREN + | GET_KW WS+ value_reference WS* R_PAREN { } ; value_cond_list: - (L_PAREN value WS+ value R_PAREN)+ + (L_PAREN WS* value WS+ value WS* R_PAREN)+ { } ; @@ -933,5 +976,3 @@ returns [List<ValueNode> result] { } ; - - |


