| summaryrefslogtreecommitdiff | 
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-07-06 19:50:25 +0200 | 
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-07-06 19:50:25 +0200 | 
| commit | cc613464c9cf9bf1fe0a08a5192a9607e98b6543 (patch) | |
| tree | 27ae8d1438f60fadd22ea06228020721e5e15eb2 /src/core | |
| parent | 6cb1bae5db929432a76c884408af4b8d28184699 (diff) | |
Moved implicit Lexer WS to Parser.
Diffstat (limited to 'src/core')
| -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]     {     }  ; - - | 


