From 4570d75ffcfc091b1a6b68d42a475d49d0047fa9 Mon Sep 17 00:00:00 2001 From: Nathanael Sensfelder Date: Fri, 3 Jul 2020 00:11:22 +0200 Subject: Reorganizing a bit... --- src/core/src/tonkadur/Main.java | 4 +- src/core/src/tonkadur/fate/v1/Utils.java | 34 +++ .../src/tonkadur/fate/v1/error/InputException.java | 52 ++++ .../v1/error/TypeAlreadyDeclaredException.java | 34 +++ src/core/src/tonkadur/fate/v1/lang/World.java | 99 ++++++ src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 | 67 ++++ src/core/src/tonkadur/fate/v1/parser/FateParser.g4 | 337 +++++++++++++++++++++ src/core/src/tonkadur/parser/Fate.java | 25 -- src/core/src/tonkadur/parser/LangLexer.g4 | 65 ---- src/core/src/tonkadur/parser/LangParser.g4 | 315 ------------------- 10 files changed, 625 insertions(+), 407 deletions(-) create mode 100644 src/core/src/tonkadur/fate/v1/Utils.java create mode 100644 src/core/src/tonkadur/fate/v1/error/InputException.java create mode 100644 src/core/src/tonkadur/fate/v1/error/TypeAlreadyDeclaredException.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/World.java create mode 100644 src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 create mode 100644 src/core/src/tonkadur/fate/v1/parser/FateParser.g4 delete mode 100644 src/core/src/tonkadur/parser/Fate.java delete mode 100644 src/core/src/tonkadur/parser/LangLexer.g4 delete mode 100644 src/core/src/tonkadur/parser/LangParser.g4 diff --git a/src/core/src/tonkadur/Main.java b/src/core/src/tonkadur/Main.java index 3d90395..76790e9 100644 --- a/src/core/src/tonkadur/Main.java +++ b/src/core/src/tonkadur/Main.java @@ -2,7 +2,7 @@ package tonkadur; import java.io.IOException; -import tonkadur.parser.Fate; +import tonkadur.fate.v1.Utils; public class Main { @@ -12,6 +12,6 @@ public class Main public static void main (final String[] args) throws IOException { - Fate.parse_file(args[0]); + Utils.parse_file(args[0]); } } diff --git a/src/core/src/tonkadur/fate/v1/Utils.java b/src/core/src/tonkadur/fate/v1/Utils.java new file mode 100644 index 0000000..048b3f2 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/Utils.java @@ -0,0 +1,34 @@ +package tonkadur.fate.v1; + +import java.io.IOException; + +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; + +import tonkadur.fate.v1.parser.FateLexer; +import tonkadur.fate.v1.parser.FateParser; + +import tonkadur.fate.v1.lang.World; + +public class Utils +{ + /* Utility class. */ + private Utils () {} + + public static void add_file_content + ( + final String filename, + final World world + ) + throws IOException + { + final CommonTokenStream tokens; + final FateLexer lexer; + final FateParser parser; + + lexer = new FateLexer(CharStreams.fromFileName(filename)); + tokens = new CommonTokenStream(lexer); + parser = new FateParser(tokens); + parser.fate_file(world); + } +} diff --git a/src/core/src/tonkadur/fate/v1/error/InputException.java b/src/core/src/tonkadur/fate/v1/error/InputException.java new file mode 100644 index 0000000..d2921cb --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/error/InputException.java @@ -0,0 +1,52 @@ +package tonkadur.fate.v1.error; + +abstract class InputException extends Throwable +{ + /***************************************************************************/ + /**** STATIC MEMBERS *******************************************************/ + /***************************************************************************/ + private static final long serialVersionUID = 42L; + + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected String filename = ""; + protected int line = -1; + protected int column = -1; + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + public InputException set_location + ( + final String filename, + final int line, + final int column + ) + { + this.filename = filename; + this.line = line; + this.column = column; + + return this; + } + + public String get_location () + { + final StringBuilder sb = new StringBuilder(); + + sb.append(filename); + sb.append(":"); + sb.append(line); + sb.append(","); + sb.append(column); + + return sb.toString(); + } + + @Override + public String toString () + { + return get_location(); + } +} diff --git a/src/core/src/tonkadur/fate/v1/error/TypeAlreadyDeclaredException.java b/src/core/src/tonkadur/fate/v1/error/TypeAlreadyDeclaredException.java new file mode 100644 index 0000000..673a3bd --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/error/TypeAlreadyDeclaredException.java @@ -0,0 +1,34 @@ +package tonkadur.fate.v1.error; + +import tonkadur.fate.v1.lang.Type; + +public class TypeAlreadyDeclaredException extends InputException +{ + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final Type original_type; + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + public TypeAlreadyDeclaredException (final Type original_type) + { + this.original_type = original_type; + } + + @Override + public String toString () + { + final StringBuilder sb = new StringBuilder(); + + sb.append(super.toString()); + sb.append(" Type '"); + sb.append(original_type.get_name()); + sb.append("' already declared in "); + sb.append(original_type.get_source().toString()); + sb.append("."); + + return sb.toString(); + } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/World.java b/src/core/src/tonkadur/fate/v1/lang/World.java new file mode 100644 index 0000000..fb0f0fe --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/World.java @@ -0,0 +1,99 @@ +package tonkadur.fate.v1.lang; + +import tonkadur.fate.v1.error.EventAlreadyDeclaredException; +import tonkadur.fate.v1.error.TypeAlreadyDeclaredException; +import tonkadur.fate.v1.error.TextEffectAlreadyDeclaredException; +import tonkadur.fate.v1.error.UnknownTypeException; + +public class World +{ + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final Collection loaded_files; + protected final Collection text_effects; + protected final Map events; + protected final Map macros; + protected final Map sequences; + protected final Map types; + protected final Map variables; + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + + /**** Constructors *********************************************************/ + public World () + { + loaded_files = new HashSet(); + text_effects = new HashSet(); + + events = new HashMap(); + macros = new HashMap(); + sequences = new HashMap(); + types = new HashMap(); + variables = new HashMap(); + + for (final Type t: Type.BASE_TYPES) + { + types.add(t.get_name(), t); + } + } + + /**** Accessors ************************************************************/ + /**** Loaded Files ****/ + public Collection get_loaded_files () + { + return loaded_files.clone(); + } + + public boolean has_loaded_file (final String name) + { + return loaded_files.contains(name); + } + + public void add_loaded_file (final String name) + { + loaded_files.add(name); + } + + /**** Text Effects ****/ + public Collection get_text_effects () + { + return text_effects.clone(); + } + + public boolean has_text_effect (final String name) + { + return text_effects.contains(name); + } + + public void add_text_effect (final String name) + throws TextEffectAlreadyDeclaredException + { + text_effects.add(name); + } + + /**** Events ****/ + public Collection get_events () + { + return events.values(); + } + + public boolean has_event (final String name) + { + return events.containsKey(name); + } + + public void add_event (final String name, final List parameter_types) + throws EventAlreadyDeclaredException, UnknownTypeException + { + + } + + /**** Misc. ****************************************************************/ + + /***************************************************************************/ + /**** PRIVATE **************************************************************/ + /***************************************************************************/ +} diff --git a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 new file mode 100644 index 0000000..80fe1fd --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 @@ -0,0 +1,67 @@ +lexer grammar FateLexer; + +@header +{ + package tonkadur.fate.v1.parser; +} + + + +fragment SEP: [ \t\r\n]+; + +WS: SEP; + +L_PAREN: WS* '('; +R_PAREN: WS* ')'; + +ADD_KW: L_PAREN 'add' WS*; +ADD_TO_ENUM_TYPE_KW: L_PAREN 'add_to_enum_type' WS*; +ADD_VARIABLE_ATTRIBUTE_KW: L_PAREN 'add_variable_attribute' WS*; +AND_KW: L_PAREN 'and' WS*; +ASSERT_KW: L_PAREN 'assert' 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_alias_type' WS*; +DECLARE_DICT_TYPE_KW: L_PAREN 'declare_dict_type' WS*; +DECLARE_ENUM_TYPE_KW: L_PAREN 'declare_enum_type' WS*; +DECLARE_EVENT_TYPE_KW: L_PAREN 'declare_event_type' WS*; +DECLARE_TEXT_EFFECT: 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*; +FATE_VERSION_KW: L_PAREN 'fate_version' 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*; +PLUS_KW: L_PAREN 'plus' WS*; +POWER_KW: L_PAREN 'power' WS*; +RANDOM_KW: L_PAREN 'random' WS*; +REMOVE_ALL_KW: L_PAREN 'remove_all' WS*; +REMOVE_ONE_KW: L_PAREN 'remove_one' 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*; +VARIABLE_KW: L_PAREN 'variable' WS*; + +WORD: (~([\t\r\n()])|'\\)'|'\\(')+; + +COMMENT: WS* ';' .*? '\n' -> channel(HIDDEN); diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 new file mode 100644 index 0000000..c0be842 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 @@ -0,0 +1,337 @@ +parser grammar FateParser; + +options +{ + tokenVocab = FateLexer; +} + +@header +{ + package tonkadur.fate.v1.parser; +} + +@members +{ + /* of the class */ +} + +/******************************************************************************/ +/******************************************************************************/ +/******************************************************************************/ +fate_file: + WS* FATE_VERSION_KW WORD L_PAREN WS* + ( + (first_level_fate_instr|general_fate_instr) + { + } + WS* + )* + EOF + { + } +; + +general_fate_sequence: + (WS* general_fate_instr WS*)* + { + } +; + +first_level_fate_instr: + DEFINE_SEQUENCE_KW WORD WS+ general_fate_sequence R_PAREN + { + } + + | DECLARE_VARIABLE_KW range=WORD WS+ type=WORD WS+ name=WORD R_PAREN + { + } + + | DECLARE_TEXT_EFFECT_KW range=WORD R_PAREN + { + } + + | ADD_VARIABLE_ATTRIBUTE_KW WORD WS+ WORD R_PAREN + { + } + + | DECLARE_ALIAS_TYPE_KW parent=WORD WS+ name=WORD R_PAREN + { + } + + | DECLARE_DICT_TYPE_KW name=WORD typed_param_list R_PAREN + { + } + + | DECLARE_ENUM_TYPE_KW name=WORD R_PAREN + { + } + + | DECLARE_EVENT_TYPE_KW name=WORD WS+ word_list R_PAREN + { + } + + | ADD_TO_ENUM_TYPE_KW entry=WORD WS+ name=WORD R_PAREN + { + } + + | REQUIRE_KW WORD R_PAREN + { + } + + | DEFINE_MACRO_KW + L_PAREN WS+ typed_param_list R_PAREN + general_fate_sequence + R_PAREN + { + } +; + +general_fate_instr: + L_PAREN general_fate_sequence R_PAREN + { + } + + | CLEAR_KW value_reference R_PAREN + { + } + + | SET_KW value WS+ value_reference R_PAREN + { + } + + | SET_EXPRESSION_KW value WS+ value_reference R_PAREN + { + } + + | EVENT_KW WORD WS+ value_list R_PAREN + { + } + + | MACRO_KW WORD WS+ value_list R_PAREN + { + } + + | SEQUENCE_KW WORD R_PAREN + { + } + + | ASSERT_KW value R_PAREN + { + } + + | IF_KW value WS+ general_fate_instr R_PAREN + { + } + + | NEWLINE_KW + { + } + + | text + { + } +; + +text: + sentence text* + { + } + + | (ENABLE_TEXT_PARAMETER_KW WORD WS+ text R_PAREN) text* + { + } + + | non_text_value text* + { + } +; + +sentence + @init + { + final StringBuilder string_builder = new StringBuilder(); + } + : + + first_word=WORD + ( + WS next_word=WORD + { + string_builder.append(" "); + string_builder.append(($next_word.text)); + } + )+ + { + string_builder.insert(0, ($first_word.text)); + } +; + +word_list: + WORD? + { + } + + | WORD (WS+ WORD)* + { + } +; + +typed_param_list: + (L_PAREN WORD WS+ WORD R_PAREN)* + { + } +; +/******************************************************************************/ +/**** VALUES ******************************************************************/ +/******************************************************************************/ +boolean_expression: + AND_KW value_list R_PAREN + { + } + + | OR_KW value_list R_PAREN + { + } + + | ONE_IN_KW value_list R_PAREN + { + } + + | NOT_KW value R_PAREN + { + } + + | IMPLIES_KW value WS+ value R_PAREN + { + } + + | LOWER_THAN_KW value WS+ value R_PAREN + { + } + + | LOWER_EQUAL_THAN_KW value WS+ value R_PAREN + { + } + + | EQUALS_KW value WS+ value R_PAREN + { + } + + | GREATER_EQUAL_THAN_KW value WS+ value R_PAREN + { + } + + | GREATER_THAN_KW value WS+ value R_PAREN + { + } + + | IS_MEMBER_KW value WS+ value_reference R_PAREN + { + } +; + +math_expression: + PLUS_KW value_list R_PAREN + { + } + + | MINUS_KW value_list R_PAREN + { + } + + | TIMES_KW value_list R_PAREN + { + } + + | DIVIDE_KW value WS+ value R_PAREN + { + } + + | POWER_KW value WS+ value R_PAREN + { + } + + | RANDOM_KW value WS+ value R_PAREN + { + } + + | COUNT_KW value WS+ value_reference R_PAREN + { + } +; + +bag_expression: + | ADD_KW value WS+ value_reference R_PAREN + { + } + + | REMOVE_ONE_KW value WS+ value_reference R_PAREN + { + } + + | REMOVE_ALL_KW value WS+ value_reference R_PAREN + { + } +; + +value: + WORD + { + } + + | L_PAREN WS* sentence R_PAREN + { + } + + | non_text_value + { + } +; + +non_text_value: + | IF_ELSE_KW value WS+ value WS+ value R_PAREN + { + } + + | COND_KW value_cond_list R_PAREN + { + } + + | boolean_expression + { + } + + | math_expression + { + } + + | value_reference + { + } + + | SET_KW value WS+ value_reference R_PAREN + { + } +; + +value_reference: + VARIABLE_KW WORD R_PAREN + { + } + + | PARAMETER_KW WORD R_PAREN + { + } +; + +value_cond_list: + (L_PAREN value WS value R_PAREN)+ + { + } +; + +value_list: + value* + { + } +; diff --git a/src/core/src/tonkadur/parser/Fate.java b/src/core/src/tonkadur/parser/Fate.java deleted file mode 100644 index 9169975..0000000 --- a/src/core/src/tonkadur/parser/Fate.java +++ /dev/null @@ -1,25 +0,0 @@ -package tonkadur.parser; - -import java.io.IOException; - -import org.antlr.v4.runtime.CharStreams; -import org.antlr.v4.runtime.CommonTokenStream; - -public class Fate -{ - /* Utility class. */ - private Fate () {} - - public static void parse_file (final String filename) - throws IOException - { - final CommonTokenStream tokens; - final LangLexer lexer; - final LangParser parser; - - lexer = new LangLexer(CharStreams.fromFileName(filename)); - tokens = new CommonTokenStream(lexer); - parser = new LangParser(tokens); - parser.fate_file(); - } -} diff --git a/src/core/src/tonkadur/parser/LangLexer.g4 b/src/core/src/tonkadur/parser/LangLexer.g4 deleted file mode 100644 index 9ef92b8..0000000 --- a/src/core/src/tonkadur/parser/LangLexer.g4 +++ /dev/null @@ -1,65 +0,0 @@ -lexer grammar LangLexer; - -@header -{ - package tonkadur.parser; -} - - - -fragment SEP: [ \t\r\n]+; - -WS: SEP; - -L_PAREN: WS* '('; -R_PAREN: WS* ')'; - -ADD_KW: L_PAREN 'add' WS*; -ADD_TO_ENUM_TYPE_KW: L_PAREN 'add_to_enum_type' WS*; -ADD_VARIABLE_ATTRIBUTE_KW: L_PAREN 'add_variable_attribute' WS*; -AND_KW: L_PAREN 'and' WS*; -ASSERT_KW: L_PAREN 'assert' 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_alias_type' WS*; -DECLARE_DICT_TYPE_KW: L_PAREN 'declare_dict_type' WS*; -DECLARE_ENUM_TYPE_KW: L_PAREN 'declare_enum_type' WS*; -DECLARE_EVENT_TYPE_KW: L_PAREN 'declare_event_type' 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*; -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*; -PLUS_KW: L_PAREN 'plus' WS*; -POWER_KW: L_PAREN 'power' WS*; -RANDOM_KW: L_PAREN 'random' WS*; -REMOVE_ALL_KW: L_PAREN 'remove_all' WS*; -REMOVE_ONE_KW: L_PAREN 'remove_one' 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*; -VARIABLE_KW: L_PAREN 'variable' WS*; - -WORD: (~([\t\r\n()])|'\\)'|'\\(')+; - -COMMENT: WS* ';' .*? '\n' -> channel(HIDDEN); diff --git a/src/core/src/tonkadur/parser/LangParser.g4 b/src/core/src/tonkadur/parser/LangParser.g4 deleted file mode 100644 index c44acfe..0000000 --- a/src/core/src/tonkadur/parser/LangParser.g4 +++ /dev/null @@ -1,315 +0,0 @@ -parser grammar LangParser; - -options -{ - tokenVocab = LangLexer; -} - -@header -{ - package tonkadur.parser; -} - -@members -{ - /* of the class */ -} - -/******************************************************************************/ -/******************************************************************************/ -/******************************************************************************/ -fate_file: - (WS* - (first_level_fate_instr|general_fate_instr) - { - } - WS*)* - EOF - { - } -; - -general_fate_sequence: - (WS* general_fate_instr WS*)* - { - } -; - -first_level_fate_instr: - DEFINE_SEQUENCE_KW WORD WS+ general_fate_sequence R_PAREN - { - } - - | DECLARE_VARIABLE_KW range=WORD WS+ type=WORD WS+ name=WORD R_PAREN - { - } - - | ADD_VARIABLE_ATTRIBUTE_KW WORD WS+ WORD R_PAREN - { - } - - | DECLARE_ALIAS_TYPE_KW parent=WORD WS+ name=WORD R_PAREN - { - } - - | DECLARE_DICT_TYPE_KW name=WORD typed_param_list R_PAREN - { - } - - | DECLARE_ENUM_TYPE_KW name=WORD R_PAREN - { - } - - | DECLARE_EVENT_TYPE_KW name=WORD WS+ word_list R_PAREN - { - } - - | ADD_TO_ENUM_TYPE_KW entry=WORD WS+ name=WORD R_PAREN - { - } - - | REQUIRE_KW WORD R_PAREN - { - } - - | DEFINE_MACRO_KW - L_PAREN WS+ typed_param_list R_PAREN - general_fate_sequence - R_PAREN - { - } -; - -general_fate_instr: - L_PAREN general_fate_sequence R_PAREN - { - } - - | CLEAR_KW value_reference R_PAREN - { - } - - | SET_KW value WS+ value_reference R_PAREN - { - } - - | SET_EXPRESSION_KW value WS+ value_reference R_PAREN - { - } - - | EVENT_KW WORD WS+ value_list R_PAREN - { - } - - | MACRO_KW WORD WS+ value_list R_PAREN - { - } - - | SEQUENCE_KW WORD R_PAREN - { - } - - | ENABLE_TEXT_PARAMETER_KW value WS+ sentence R_PAREN - { - } - - | ASSERT_KW value R_PAREN - { - } - - | IF_KW value WS+ general_fate_instr R_PAREN - { - } - - | NEWLINE_KW - { - } - - | sentence - { - } -; - -sentence - @init - { - final StringBuilder string_builder = new StringBuilder(); - } - : - - first_word=WORD - ( - WS next_word=WORD - { - string_builder.append(" "); - string_builder.append(($next_word.text)); - } - )+ - { - string_builder.insert(0, ($first_word.text)); - } -; - -word_list: - WORD? - { - } - - | WORD (WS+ WORD)* - { - } -; - -typed_param_list: - (L_PAREN WORD WS+ WORD R_PAREN)* - { - } -; -/******************************************************************************/ -/**** VALUES ******************************************************************/ -/******************************************************************************/ -boolean_expression: - AND_KW value_list R_PAREN - { - } - - | OR_KW value_list R_PAREN - { - } - - | ONE_IN_KW value_list R_PAREN - { - } - - | NOT_KW value R_PAREN - { - } - - | IMPLIES_KW value WS+ value R_PAREN - { - } - - | LOWER_THAN_KW value WS+ value R_PAREN - { - } - - | LOWER_EQUAL_THAN_KW value WS+ value R_PAREN - { - } - - | EQUALS_KW value WS+ value R_PAREN - { - } - - | GREATER_EQUAL_THAN_KW value WS+ value R_PAREN - { - } - - | GREATER_THAN_KW value WS+ value R_PAREN - { - } - - | IS_MEMBER_KW value WS+ value_reference R_PAREN - { - } -; - -math_expression: - PLUS_KW value_list R_PAREN - { - } - - | MINUS_KW value_list R_PAREN - { - } - - | TIMES_KW value_list R_PAREN - { - } - - | DIVIDE_KW value WS+ value R_PAREN - { - } - - | POWER_KW value WS+ value R_PAREN - { - } - - | RANDOM_KW value WS+ value R_PAREN - { - } - - | COUNT_KW value WS+ value_reference R_PAREN - { - } -; - -bag_expression: - | ADD_KW value WS+ value_reference R_PAREN - { - } - - | REMOVE_ONE_KW value WS+ value_reference R_PAREN - { - } - - | REMOVE_ALL_KW value WS+ value_reference R_PAREN - { - } -; - -value: - WORD - { - } - - | L_PAREN WS+ sentence WS+ R_PAREN - { - } - - | IF_ELSE_KW value WS+ value WS+ value R_PAREN - { - } - - | COND_KW value_cond_list R_PAREN - { - } - - | boolean_expression - { - } - - | math_expression - { - } - - | value_reference - { - } - - | SET_KW value WS+ value_reference R_PAREN - { - } -; - -value_reference: - VARIABLE_KW WORD R_PAREN - { - } - - | PARAMETER_KW WORD R_PAREN - { - } -; - -value_cond_list: - (L_PAREN value WS value R_PAREN)+ - { - } -; - -value_list: - value* - { - } -; -- cgit v1.2.3-70-g09d2