summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2021-09-13 22:39:01 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2021-09-13 22:39:01 +0200
commit7add9cd5954df2b7d039b5097fd3621253a85bda (patch)
tree947b157c2471ad3c297bfb55fba5e78df357b0b6
parent5320374c4e1340cc0cbfa6b2ec12523f38ace254 (diff)
...
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/World.java39
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/ExtraComputationInstance.java97
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/GenericComputation.java44
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/ExtraComputation.java151
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/ExtraInstructionInstance.java98
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/GenericInstruction.java44
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/ExtraInstruction.java137
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/generic/UserInstruction.java135
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java5
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/meta/ExtraComputation.java134
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/meta/ExtraInstruction.java115
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java5
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g4141
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java37
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java55
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/ExtraComputationCompiler.java65
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/ExtraInstructionCompiler.java82
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);
+ }
+ }
+}