| summaryrefslogtreecommitdiff |
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2021-09-13 22:39:01 +0200 |
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2021-09-13 22:39:01 +0200 |
| commit | 7add9cd5954df2b7d039b5097fd3621253a85bda (patch) | |
| tree | 947b157c2471ad3c297bfb55fba5e78df357b0b6 /src | |
| parent | 5320374c4e1340cc0cbfa6b2ec12523f38ace254 (diff) | |
...
Diffstat (limited to 'src')
17 files changed, 784 insertions, 600 deletions
diff --git a/src/core/src/tonkadur/fate/v1/lang/World.java b/src/core/src/tonkadur/fate/v1/lang/World.java index 8355a2e..846ead8 100644 --- a/src/core/src/tonkadur/fate/v1/lang/World.java +++ b/src/core/src/tonkadur/fate/v1/lang/World.java @@ -20,8 +20,6 @@ import tonkadur.fate.v1.error.UnknownSequenceException; import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.DeclarationCollection; -import tonkadur.fate.v1.lang.meta.ExtraInstruction; -import tonkadur.fate.v1.lang.meta.ExtraComputation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; import tonkadur.fate.v1.lang.meta.Instruction; @@ -47,8 +45,6 @@ public class World sequence_uses; protected final Map<String, List<SequenceReference>> sequence_variables; - protected final DeclarationCollection<ExtraInstruction> ei_collection; - protected final DeclarationCollection<ExtraComputation> ec_collection; protected final DeclarationCollection<Event> event_collection; protected final DeclarationCollection<Sequence> sequence_collection; protected final DeclarationCollection<TextEffect> text_effect_collection; @@ -72,17 +68,6 @@ public class World sequence_variables = new HashMap<String, List<SequenceReference>>(); - ei_collection = - new DeclarationCollection<ExtraInstruction> - ( - ExtraInstruction.value_on_missing() - ); - ec_collection = - new DeclarationCollection<ExtraComputation> - ( - ExtraComputation.value_on_missing() - ); - event_collection = new DeclarationCollection<Event>(Event.value_on_missing()); sequence_collection = new DeclarationCollection<Sequence>(null); @@ -171,16 +156,6 @@ public class World } /**** Collections ****/ - public DeclarationCollection<ExtraInstruction> extra_instructions () - { - return ei_collection; - } - - public DeclarationCollection<ExtraComputation> extra_computations () - { - return ec_collection; - } - public DeclarationCollection<Event> events () { return event_collection; @@ -260,20 +235,6 @@ public class World } sb.append(System.lineSeparator()); - sb.append("Extra Instructions:"); - sb.append(System.lineSeparator()); - sb.append(ei_collection.toString()); - sb.append(System.lineSeparator()); - sb.append(System.lineSeparator()); - - sb.append(System.lineSeparator()); - sb.append("Extra Computations:"); - sb.append(System.lineSeparator()); - sb.append(ec_collection.toString()); - sb.append(System.lineSeparator()); - sb.append(System.lineSeparator()); - - sb.append(System.lineSeparator()); sb.append("Events:"); sb.append(System.lineSeparator()); sb.append(event_collection.toString()); diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/ExtraComputationInstance.java b/src/core/src/tonkadur/fate/v1/lang/computation/ExtraComputationInstance.java deleted file mode 100644 index 83960b7..0000000 --- a/src/core/src/tonkadur/fate/v1/lang/computation/ExtraComputationInstance.java +++ /dev/null @@ -1,97 +0,0 @@ -package tonkadur.fate.v1.lang.computation; - -import java.util.List; - -import tonkadur.parser.Context; -import tonkadur.parser.Origin; -import tonkadur.parser.ParsingError; - -import tonkadur.fate.v1.lang.meta.Computation; -import tonkadur.fate.v1.lang.meta.ComputationVisitor; -import tonkadur.fate.v1.lang.meta.ExtraComputation; -import tonkadur.fate.v1.lang.meta.RecurrentChecks; - -public class ExtraComputationInstance extends Computation -{ - protected final ExtraComputation computation; - protected final List<Computation> parameters; - - /***************************************************************************/ - /**** PROTECTED ************************************************************/ - /***************************************************************************/ - /**** Constructors *********************************************************/ - protected ExtraComputationInstance - ( - final Origin origin, - final ExtraComputation computation, - final List<Computation> parameters - ) - { - super(origin, computation.get_returned_type()); - - this.computation = computation; - this.parameters = parameters; - } - - /***************************************************************************/ - /**** PUBLIC ***************************************************************/ - /***************************************************************************/ - /**** Constructors *********************************************************/ - public static ExtraComputationInstance build - ( - final Origin origin, - final ExtraComputation computation, - final List<Computation> parameters - ) - throws ParsingError - { - RecurrentChecks.propagate_expected_types_and_assert_computations_matches_signature - ( - origin, - parameters, - computation.get_signature() - ); - - return new ExtraComputationInstance(origin, computation, parameters); - } - - /**** Accessors ************************************************************/ - public ExtraComputation get_computation_type () - { - return computation; - } - - public List<Computation> get_parameters () - { - return parameters; - } - - @Override - public void get_visited_by (final ComputationVisitor cv) - throws Throwable - { - cv.visit_extra_computation(this); - } - - /**** Misc. ****************************************************************/ - @Override - public String toString () - { - final StringBuilder sb; - - sb = new StringBuilder(); - - sb.append("("); - sb.append(computation.get_name()); - - for (final Computation p: parameters) - { - sb.append(" "); - sb.append(p.toString()); - } - - sb.append(")"); - - return sb.toString(); - } -} diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/GenericComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/GenericComputation.java index 4f50166..25e541b 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/GenericComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/GenericComputation.java @@ -86,6 +86,50 @@ public abstract class GenericComputation extends Computation } } + public static void register (final String alias, final Class c) + { + try + { + final Class previous_entry; + + previous_entry = REGISTERED.get(alias); + + if (previous_entry != null) + { + ErrorManager.handle + ( + new BasicError + ( + ErrorLevel.FATAL, + ErrorCategory.PROGRAMMING_ERROR, + ( + "Unable to add alias for Generic Fate Computation '" + + alias + + "' from class '" + + c.getName() + + "': it has already been claimed by class '" + + previous_entry.getName() + + "'." + ) + ) + ); + } + + REGISTERED.put(alias, c); + } + catch (final Throwable t) + { + System.err.println + ( + "Could not register Generic Fate Computation class '" + + c.getName() + + "': " + ); + + t.printStackTrace(); + } + } + public static Computation build ( final Origin origin, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/ExtraComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/ExtraComputation.java new file mode 100644 index 0000000..578200b --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/ExtraComputation.java @@ -0,0 +1,151 @@ +package tonkadur.fate.v1.lang.computation.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import tonkadur.functional.Cons; + +import tonkadur.parser.Context; +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.ComputationVisitor; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; + +import tonkadur.fate.v1.lang.computation.GenericComputation; + +import tonkadur.fate.v1.lang.type.Type; + +public class ExtraComputation extends GenericComputation +{ + protected static final Map<String, Cons<Type, List<Type>>> SIGNATURES; + + static + { + SIGNATURES = new HashMap<String, Cons<Type, List<Type>>>(); + } + + public static Collection<String> get_aliases () + { + // These are added individually later. + return new ArrayList<String>(); + } + + public static void register + ( + final Type return_type, + final String name, + final List<Type> signature + ) + { + GenericComputation.register(name, ExtraComputation.class); + + SIGNATURES.put(name, new Cons(return_type, signature)); + } + + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final String computation_name; + protected final List<Computation> parameters; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + protected ExtraComputation + ( + final Origin origin, + final Type return_type, + final String computation_name, + final List<Computation> parameters + ) + { + super(origin, return_type); + + this.computation_name = computation_name; + this.parameters = parameters; + } + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + public static Computation build + ( + final Origin origin, + final String alias, + final List<Computation> call_parameters + ) + throws Throwable + { + final Cons<Type, List<Type>> signature; + + signature = SIGNATURES.get(alias); + + if (signature == null) + { + System.err.println(origin.toString()); + System.err.println + ( + "[F] Programming error: the Extra Computation'" + + alias + + "' was registered without a signature." + ); + System.exit(-1); + } + + RecurrentChecks.propagate_expected_types_and_assert_computations_matches_signature + ( + origin, + call_parameters, + signature.get_cdr() + ); + + return + new ExtraComputation + ( + origin, + signature.get_car(), + alias, + call_parameters + ); + } + + /**** Accessors ************************************************************/ + public String get_computation_name () + { + return computation_name; + } + + public List<Computation> get_parameters () + { + return parameters; + } + + /**** Misc. ****************************************************************/ + @Override + public String toString () + { + final StringBuilder sb; + + sb = new StringBuilder(); + + sb.append("("); + sb.append(get_computation_name()); + + for (final Computation p: parameters) + { + sb.append(" "); + sb.append(p.toString()); + } + + sb.append(")"); + + return sb.toString(); + } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/ExtraInstructionInstance.java b/src/core/src/tonkadur/fate/v1/lang/instruction/ExtraInstructionInstance.java deleted file mode 100644 index efeafaa..0000000 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/ExtraInstructionInstance.java +++ /dev/null @@ -1,98 +0,0 @@ -package tonkadur.fate.v1.lang.instruction; - -import java.util.List; - -import tonkadur.parser.Context; -import tonkadur.parser.Origin; -import tonkadur.parser.ParsingError; - -import tonkadur.fate.v1.lang.meta.Computation; -import tonkadur.fate.v1.lang.meta.Instruction; -import tonkadur.fate.v1.lang.meta.InstructionVisitor; -import tonkadur.fate.v1.lang.meta.ExtraInstruction; -import tonkadur.fate.v1.lang.meta.RecurrentChecks; - -public class ExtraInstructionInstance extends Instruction -{ - protected final ExtraInstruction instruction; - protected final List<Computation> parameters; - - /***************************************************************************/ - /**** PROTECTED ************************************************************/ - /***************************************************************************/ - /**** Constructors *********************************************************/ - protected ExtraInstructionInstance - ( - final Origin origin, - final ExtraInstruction instruction, - final List<Computation> parameters - ) - { - super(origin); - - this.instruction = instruction; - this.parameters = parameters; - } - - /***************************************************************************/ - /**** PUBLIC ***************************************************************/ - /***************************************************************************/ - /**** Constructors *********************************************************/ - public static ExtraInstructionInstance build - ( - final Origin origin, - final ExtraInstruction instruction, - final List<Computation> parameters - ) - throws ParsingError - { - RecurrentChecks.propagate_expected_types_and_assert_computations_matches_signature - ( - origin, - parameters, - instruction.get_signature() - ); - - return new ExtraInstructionInstance(origin, instruction, parameters); - } - - /**** Accessors ************************************************************/ - @Override - public void get_visited_by (final InstructionVisitor iv) - throws Throwable - { - iv.visit_extra_instruction(this); - } - - public ExtraInstruction get_instruction_type () - { - return instruction; - } - - public List<Computation> get_parameters () - { - return parameters; - } - - /**** Misc. ****************************************************************/ - @Override - public String toString () - { - final StringBuilder sb; - - sb = new StringBuilder(); - - sb.append("("); - sb.append(instruction.get_name()); - - for (final Computation p: parameters) - { - sb.append(" "); - sb.append(p.toString()); - } - - sb.append(")"); - - return sb.toString(); - } -} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/GenericInstruction.java b/src/core/src/tonkadur/fate/v1/lang/instruction/GenericInstruction.java index 8c2b77e..ce75974 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/GenericInstruction.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/GenericInstruction.java @@ -87,6 +87,50 @@ public abstract class GenericInstruction extends Instruction } } + public static void register (final String alias, final Class c) + { + try + { + final Class previous_entry; + + previous_entry = REGISTERED.get(alias); + + if (previous_entry != null) + { + ErrorManager.handle + ( + new BasicError + ( + ErrorLevel.FATAL, + ErrorCategory.PROGRAMMING_ERROR, + ( + "Unable to add alias for Generic Fate Instruction '" + + alias + + "' from class '" + + c.getName() + + "': it has already been claimed by class '" + + previous_entry.getName() + + "'." + ) + ) + ); + } + + REGISTERED.put(alias, c); + } + catch (final Throwable t) + { + System.err.println + ( + "Could not register Generic Fate Instruction class '" + + c.getName() + + "': " + ); + + t.printStackTrace(); + } + } + public static Instruction build ( final Origin origin, diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/ExtraInstruction.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/ExtraInstruction.java new file mode 100644 index 0000000..1ed6f1b --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/ExtraInstruction.java @@ -0,0 +1,137 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import tonkadur.parser.Context; +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.InstructionVisitor; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; + +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + +import tonkadur.fate.v1.lang.type.Type; + +public class ExtraInstruction extends GenericInstruction +{ + protected static final Map<String, List<Type>> SIGNATURES; + + static + { + SIGNATURES = new HashMap<String, List<Type>>(); + } + + public static Collection<String> get_aliases () + { + // These are added individually later. + return new ArrayList<String>(); + } + + public static void register (final String name, final List<Type> signature) + { + GenericInstruction.register(name, ExtraInstruction.class); + + SIGNATURES.put(name, signature); + } + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + protected ExtraInstruction + ( + final Origin origin, + final String instruction_name, + final List<Computation> parameters + ) + { + super(origin); + + this.instruction_name = instruction_name; + this.parameters = parameters; + } + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + public static Instruction build + ( + final Origin origin, + final String alias, + final List<Computation> call_parameters + ) + throws Throwable + { + final List<Type> signature; + + signature = SIGNATURES.get(alias); + + if (signature == null) + { + System.err.println(origin.toString()); + System.err.println + ( + "[F] Programming error: the Extra Instruction '" + + alias + + "' was registered without a signature." + ); + System.exit(-1); + } + + RecurrentChecks.propagate_expected_types_and_assert_computations_matches_signature + ( + origin, + call_parameters, + signature + ); + + return new ExtraInstruction(origin, alias, call_parameters); + } + + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final String instruction_name; + protected final List<Computation> parameters; + + /**** Accessors ************************************************************/ + public String get_instruction_name () + { + return instruction_name; + } + + public List<Computation> get_parameters () + { + return parameters; + } + + /**** Misc. ****************************************************************/ + @Override + public String toString () + { + final StringBuilder sb; + + sb = new StringBuilder(); + + sb.append("("); + sb.append(get_instruction_name()); + + for (final Computation p: get_parameters()) + { + sb.append(" "); + sb.append(p.toString()); + } + + sb.append(")"); + + return sb.toString(); + } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/UserInstruction.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/UserInstruction.java new file mode 100644 index 0000000..9c32c20 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/UserInstruction.java @@ -0,0 +1,135 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import tonkadur.parser.Origin; + +import tonkadur.fate.v1.lang.Sequence; + +import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.Computation; + +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + +public class UserInstruction extends GenericInstruction +{ + protected static final Map<String, Sequence> DEFINITIONS; + + static + { + DEFINITIONS = new HashMap<String, Sequence>(); + } + + public static Collection<String> get_aliases () + { + // Will be added individually later. + return new ArrayList<String>(); + } + + public static void register (final Sequence sequence) + { + GenericInstruction.register(sequence.get_name(), UserInstruction.class); + + DEFINITIONS.put(sequence.get_name(), sequence); + } + + public static Collection<Sequence> get_all_definitions () + { + return DEFINITIONS.values(); + } + + public static Instruction build + ( + final Origin origin, + final String alias, + final List<Computation> call_parameters + ) + throws Throwable + { + final Sequence definition; + + definition = DEFINITIONS.get(alias); + + if (definition == null) + { + System.err.println(origin.toString()); + System.err.println + ( + "[F] Programming error: the User Instruction '" + + alias + + "' was registered without an associated Sequence." + ); + System.exit(-1); + } + + definition.propagate_expected_types_and_assert_can_take_parameters + ( + origin, + call_parameters + ); + + return new UserInstruction(origin, definition, call_parameters); + } + + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final Sequence definition; + protected final List<Computation> parameters; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + protected UserInstruction + ( + final Origin origin, + final Sequence definition, + final List<Computation> parameters + ) + { + super(origin); + + this.definition = definition; + this.parameters = parameters; + } + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + + /**** Accessors ************************************************************/ + public Sequence get_definition () + { + return definition; + } + + public List<Computation> get_parameters () + { + return parameters; + } + + /**** Misc. ****************************************************************/ + @Override + public String toString () + { + final StringBuilder sb = new StringBuilder(); + + sb.append("("); + sb.append(definition.get_name()); + + for (final Computation param: parameters) + { + sb.append(" "); + sb.append(param.toString()); + } + + sb.append(")"); + + return sb.toString(); + } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java b/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java index 7f93acf..feb63ff 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java @@ -2,6 +2,8 @@ package tonkadur.fate.v1.lang.meta; import tonkadur.fate.v1.lang.computation.*; +import tonkadur.fate.v1.lang.computation.generic.ExtraComputation; + public interface ComputationVisitor { public void visit_field_access (final FieldAccess n) @@ -46,9 +48,6 @@ public interface ComputationVisitor public void visit_set_fields (final SetFieldsComputation n) throws Throwable; - public void visit_extra_computation (final ExtraComputationInstance n) - throws Throwable; - public void visit_generic_computation (final GenericComputation n) throws Throwable; } diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/ExtraComputation.java b/src/core/src/tonkadur/fate/v1/lang/meta/ExtraComputation.java deleted file mode 100644 index f3a913e..0000000 --- a/src/core/src/tonkadur/fate/v1/lang/meta/ExtraComputation.java +++ /dev/null @@ -1,134 +0,0 @@ -package tonkadur.fate.v1.lang.meta; - -import java.util.ArrayList; -import java.util.List; - -import tonkadur.parser.Context; -import tonkadur.parser.Origin; -import tonkadur.parser.ParsingError; - -import tonkadur.fate.v1.lang.World; - -import tonkadur.fate.v1.lang.type.Type; - -import tonkadur.fate.v1.lang.computation.ExtraComputationInstance; - - -// This is for computations that are not compiled to Wyrd, but simply declared -// in Fate and implemented by the wyrd interpreter. -// This class should become something like a sub-GenericComputation thing. -// Declaring an ExtraComputation should register an ExtraComputation object as a -// GenericComputation, thus making it seamless from the user's point of view. -public class ExtraComputation extends DeclaredEntity -{ - protected static final ExtraComputation ANY; - - static - { - ANY = - new ExtraComputation - ( - Origin.BASE_LANGUAGE, - Type.ANY, - /* - * Use of a space necessary to avoid conflicting with a user created - * type. - */ - "undetermined extra_computation", - new ArrayList<Type>() - ); - } - - public static ExtraComputation value_on_missing () - { - return ANY; - } - - @Override - public /* static */ String get_type_name () - { - return "ExtraComputation"; - } - - /***************************************************************************/ - /**** MEMBERS **************************************************************/ - /***************************************************************************/ - protected final Type returned_type; - protected final List<Type> signature; - - /***************************************************************************/ - /**** PUBLIC ***************************************************************/ - /***************************************************************************/ - /**** Constructors *********************************************************/ - public ExtraComputation - ( - final Origin origin, - final Type returned_type, - final String name, - final List<Type> signature - ) - { - super(origin, name); - - this.returned_type = returned_type; - this.signature = signature; - } - - public ExtraComputation - ( - final Type returned_type, - final String name, - final List<Type> signature - ) - { - super(Origin.BASE_LANGUAGE, name); - - this.returned_type = returned_type; - this.signature = signature; - } - - /**** Accessors ************************************************************/ - public Type get_returned_type () - { - return returned_type; - } - - public List<Type> get_signature () - { - return signature; - } - - /**** Instantiating ********************************************************/ - public ExtraComputationInstance instantiate - ( - final World world, - final Context context, - final Origin origin, - final List<Computation> parameters - ) - throws ParsingError - { - return ExtraComputationInstance.build(origin, this, parameters); - } - - /**** Misc. ****************************************************************/ - @Override - public String toString () - { - final StringBuilder sb; - - sb = new StringBuilder(); - - sb.append(returned_type.toString()); - sb.append(" "); - sb.append(name); - - for (final Type t: signature) - { - sb.append(" "); - sb.append(t.toString()); - } - - return name; - } -} diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/ExtraInstruction.java b/src/core/src/tonkadur/fate/v1/lang/meta/ExtraInstruction.java deleted file mode 100644 index cd056dd..0000000 --- a/src/core/src/tonkadur/fate/v1/lang/meta/ExtraInstruction.java +++ /dev/null @@ -1,115 +0,0 @@ -package tonkadur.fate.v1.lang.meta; - -import java.util.ArrayList; -import java.util.List; - -import tonkadur.parser.Context; -import tonkadur.parser.Origin; -import tonkadur.parser.ParsingError; - -import tonkadur.fate.v1.lang.World; - -import tonkadur.fate.v1.lang.type.Type; - -import tonkadur.fate.v1.lang.instruction.ExtraInstructionInstance; - -public class ExtraInstruction extends DeclaredEntity -{ - protected static final ExtraInstruction ANY; - - static - { - ANY = - new ExtraInstruction - ( - Origin.BASE_LANGUAGE, - /* - * Use of a space necessary to avoid conflicting with a user created - * type. - */ - "undetermined extra_instruction", - new ArrayList<Type>() - ); - } - - public static ExtraInstruction value_on_missing () - { - return ANY; - } - - @Override - public /* static */ String get_type_name () - { - return "ExtraInstruction"; - } - - /***************************************************************************/ - /**** MEMBERS **************************************************************/ - /***************************************************************************/ - protected final List<Type> signature; - - /***************************************************************************/ - /**** PUBLIC ***************************************************************/ - /***************************************************************************/ - /**** Constructors *********************************************************/ - public ExtraInstruction - ( - final Origin origin, - final String name, - final List<Type> signature - ) - { - super(origin, name); - - this.signature = signature; - } - - public ExtraInstruction - ( - final String name, - final List<Type> signature - ) - { - super(Origin.BASE_LANGUAGE, name); - - this.signature = signature; - } - - /**** Accessors ************************************************************/ - public List<Type> get_signature () - { - return signature; - } - - /**** Instantiating ********************************************************/ - public ExtraInstructionInstance instantiate - ( - final World world, - final Context context, - final Origin origin, - final List<Computation> parameters - ) - throws ParsingError - { - return ExtraInstructionInstance.build(origin, this, parameters); - } - - /**** Misc. ****************************************************************/ - @Override - public String toString () - { - final StringBuilder sb; - - sb = new StringBuilder(); - - sb.append(name); - - for (final Type t: signature) - { - sb.append(" "); - sb.append(t.toString()); - } - - return name; - } -} diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java b/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java index 521e850..33fae6b 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java @@ -2,6 +2,8 @@ package tonkadur.fate.v1.lang.meta; import tonkadur.fate.v1.lang.instruction.*; +import tonkadur.fate.v1.lang.instruction.generic.ExtraInstruction; + public interface InstructionVisitor { /* Instruction Nodes */ @@ -65,9 +67,6 @@ public interface InstructionVisitor public void visit_set_fields (final SetFields n) throws Throwable; - public void visit_extra_instruction (final ExtraInstructionInstance n) - throws Throwable; - public void visit_generic_instruction (final GenericInstruction n) throws Throwable; } diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 index 62de7e0..a06487b 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 @@ -47,7 +47,10 @@ options import tonkadur.fate.v1.lang.type.*; import tonkadur.fate.v1.lang.computation.*; + import tonkadur.fate.v1.lang.computation.generic.ExtraComputation; + import tonkadur.fate.v1.lang.instruction.generic.SetValue; + import tonkadur.fate.v1.lang.instruction.generic.ExtraInstruction; } @members @@ -185,15 +188,11 @@ first_level_instruction ($DECLARE_EXTRA_INSTRUCTION_KW.getCharPositionInLine()) ); - extra_instruction = - new ExtraInstruction - ( - start_origin, - ($identifier.result), - ($maybe_type_list.result) - ); - - PARSER.get_world().extra_instructions().add(extra_instruction); + ExtraInstruction.register + ( + ($identifier.result), + ($maybe_type_list.result) + ); RecurrentChecks.assert_has_user_content_prefix ( @@ -218,16 +217,12 @@ first_level_instruction ($DECLARE_EXTRA_COMPUTATION_KW.getCharPositionInLine()) ); - extra_computation = - new ExtraComputation - ( - start_origin, - ($type.result), - ($identifier.result), - ($maybe_type_list.result) - ); - - PARSER.get_world().extra_computations().add(extra_computation); + ExtraComputation.register + ( + ($type.result), + ($identifier.result), + ($maybe_type_list.result) + ); RecurrentChecks.assert_has_user_content_prefix ( @@ -517,6 +512,114 @@ first_level_instruction PARSER.restore_local_variables_stack(previous_local_variables_stack); } + | DECLARE_INSTRUCTION_KW + { + previous_local_variables_stack = PARSER.get_local_variables_stack(); + PARSER.discard_local_variables_stack(); + PARSER.increase_local_variables_hierarchy(); + } + identifier + WS* + ( + L_PAREN WS* variable_list WS* R_PAREN + { + PARSER.add_local_variables(($variable_list.result).as_map()); + PARSER.increase_local_variables_hierarchy(); + } + ) + pre_sequence_point=WS+ + maybe_instruction_list + WS* + R_PAREN + { + final Origin start_origin, sequence_origin; + final Sequence new_sequence; + + start_origin = + PARSER.get_origin_at + ( + ($DECLARE_INSTRUCTION_KW.getLine()), + ($DECLARE_INSTRUCTION_KW.getCharPositionInLine()) + ); + + sequence_origin = + PARSER.get_origin_at + ( + ($pre_sequence_point.getLine()), + ($pre_sequence_point.getCharPositionInLine()) + ); + + new_sequence = + new Sequence + ( + start_origin, + new InstructionList + ( + sequence_origin, + ($maybe_instruction_list.result) + ), + ($identifier.result), + ($variable_list.result).get_entries() + ); + + //PARSER.get_world().user_defined_instructions().add(new_sequence); + PARSER.restore_local_variables_stack(previous_local_variables_stack); + + RecurrentChecks.assert_has_user_content_prefix + ( + start_origin, + ($identifier.result) + ); + } + + | DECLARE_COMPUTATION_KW + { + previous_local_variables_stack = PARSER.get_local_variables_stack(); + PARSER.discard_local_variables_stack(); + PARSER.increase_local_variables_hierarchy(); + } + identifier WS* + L_PAREN WS* variable_list WS* R_PAREN + { + PARSER.add_local_variables(($variable_list.result).as_map()); + } + WS* + computation + WS* + R_PAREN + { + final Origin start_origin; + final LambdaExpression computation; + + PARSER.restore_local_variables_stack(previous_local_variables_stack); + + start_origin = + PARSER.get_origin_at + ( + ($DECLARE_COMPUTATION_KW.getLine()), + ($DECLARE_COMPUTATION_KW.getCharPositionInLine()) + ); + + computation = + LambdaExpression.build + ( + start_origin, + ($variable_list.result).get_entries(), + ($computation.result) + ); + /* + PARSER.get_world().user_defined_computations().add + ( + ($identifier.result), + new_sequence + ); + */ + RecurrentChecks.assert_has_user_content_prefix + ( + start_origin, + ($identifier.result) + ); + } | IMP_IGNORE_ERROR_KW word WS+ first_level_instruction WS* R_PAREN { diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java index b9f62e9..721f6d8 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java @@ -382,43 +382,6 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor } @Override - public void visit_extra_computation - ( - final tonkadur.fate.v1.lang.computation.ExtraComputationInstance n - ) - throws Throwable - { - final List<Computation> parameters; - - parameters = new ArrayList<Computation>(); - - for (final tonkadur.fate.v1.lang.meta.Computation p: n.get_parameters()) - { - final ComputationCompiler cc; - - cc = new ComputationCompiler(compiler); - - p.get_visited_by(cc); - - assimilate(cc); - - parameters.add(cc.get_computation()); - } - - result_as_computation = - new ExtraComputation - ( - TypeCompiler.compile - ( - compiler, - n.get_computation_type().get_returned_type() - ), - n.get_computation_type().get_name(), - parameters - ); - } - - @Override public void visit_default ( final tonkadur.fate.v1.lang.computation.Default n diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java index cc30524..22767f0 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java @@ -34,7 +34,6 @@ import tonkadur.wyrd.v1.lang.instruction.AddEventOption; import tonkadur.wyrd.v1.lang.instruction.Assert; import tonkadur.wyrd.v1.lang.instruction.Display; import tonkadur.wyrd.v1.lang.instruction.End; -import tonkadur.wyrd.v1.lang.instruction.ExtraInstruction; import tonkadur.wyrd.v1.lang.instruction.Initialize; import tonkadur.wyrd.v1.lang.instruction.PromptInteger; import tonkadur.wyrd.v1.lang.instruction.PromptString; @@ -786,60 +785,6 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor } @Override - public void visit_extra_instruction - ( - final tonkadur.fate.v1.lang.instruction.ExtraInstructionInstance n - ) - throws Throwable - { - /* - * Fate: (event_call <string> c0 ... cn) - * - * Wyrd (event_call <string> c0 ... cn) - */ - final List<ComputationCompiler> cc_list; - final List<Computation> parameters; - - cc_list = new ArrayList<ComputationCompiler>(); - parameters = new ArrayList<Computation>(); - - for - ( - final tonkadur.fate.v1.lang.meta.Computation fate_computation: - n.get_parameters() - ) - { - final ComputationCompiler cc; - - cc = new ComputationCompiler(compiler); - - fate_computation.get_visited_by(cc); - - if (cc.has_init()) - { - result.add(cc.get_init()); - } - - cc_list.add(cc); - parameters.add(cc.get_computation()); - } - - result.add - ( - new ExtraInstruction - ( - n.get_instruction_type().get_name(), - parameters - ) - ); - - for (final ComputationCompiler cc: cc_list) - { - cc.release_registers(result); - } - } - - @Override public void visit_if_else_instruction ( final tonkadur.fate.v1.lang.instruction.IfElseInstruction n diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/ExtraComputationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/ExtraComputationCompiler.java new file mode 100644 index 0000000..660120a --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/ExtraComputationCompiler.java @@ -0,0 +1,65 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.computation.generic; + +import java.util.ArrayList; +import java.util.List; + +import tonkadur.fate.v1.lang.computation.generic.ExtraComputation; + +import tonkadur.wyrd.v1.lang.meta.Computation; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.TypeCompiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.compiler.fate.v1.computation.GenericComputationCompiler; + +public class ExtraComputationCompiler extends GenericComputationCompiler +{ + public static Class get_target_class () + { + return ExtraComputation.class; + } + + public ExtraComputationCompiler (final Compiler compiler) + { + super(compiler); + } + + public void compile + ( + final tonkadur.fate.v1.lang.computation.GenericComputation computation + ) + throws Throwable + { + final ExtraComputation source; + final List<Computation> parameters; + + source = (ExtraComputation) computation; + + parameters = new ArrayList<Computation>(); + + for + ( + final tonkadur.fate.v1.lang.meta.Computation p: source.get_parameters() + ) + { + final ComputationCompiler cc; + + cc = new ComputationCompiler(compiler); + + p.get_visited_by(cc); + + assimilate(cc); + + parameters.add(cc.get_computation()); + } + + result_as_computation = + new tonkadur.wyrd.v1.lang.computation.ExtraComputation + ( + TypeCompiler.compile(compiler, source.get_type()), + source.get_computation_name(), + parameters + ); + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/ExtraInstructionCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/ExtraInstructionCompiler.java new file mode 100644 index 0000000..7d87068 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/ExtraInstructionCompiler.java @@ -0,0 +1,82 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import java.util.List; +import java.util.ArrayList; + +import tonkadur.fate.v1.lang.instruction.generic.ExtraInstruction; + +import tonkadur.wyrd.v1.lang.meta.Computation; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class ExtraInstructionCompiler extends GenericInstructionCompiler +{ + public static Class get_target_class () + { + return ExtraInstruction.class; + } + + public ExtraInstructionCompiler (final Compiler compiler) + { + super(compiler); + } + + /* + * Fate: (event_call <string> c0 ... cn) + * + * Wyrd (event_call <string> c0 ... cn) + */ + public void compile + ( + final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction + ) + throws Throwable + { + final ExtraInstruction source; + final List<ComputationCompiler> cc_list; + final List<Computation> parameters; + + source = (ExtraInstruction) instruction; + + cc_list = new ArrayList<ComputationCompiler>(); + parameters = new ArrayList<Computation>(); + + for + ( + final tonkadur.fate.v1.lang.meta.Computation fate_computation: + source.get_parameters() + ) + { + final ComputationCompiler cc; + + cc = new ComputationCompiler(compiler); + + fate_computation.get_visited_by(cc); + + if (cc.has_init()) + { + result.add(cc.get_init()); + } + + cc_list.add(cc); + parameters.add(cc.get_computation()); + } + + result.add + ( + new tonkadur.wyrd.v1.lang.instruction.ExtraInstruction + ( + source.get_instruction_name(), + parameters + ) + ); + + for (final ComputationCompiler cc: cc_list) + { + cc.release_registers(result); + } + } +} |


