summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateLexer.g4108
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g4169
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]
{
}
;
-
-