summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-12-28 01:35:33 +0100
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-12-28 01:35:33 +0100
commit22ec7b935d4fbac94ddff580b9649f6748d7444d (patch)
treeba963810b13f6d2a8e1ea62237a13517405dbd59
parent0269c0a2943e443179ae6261b265aa06998451f7 (diff)
First shot at storable procedures.
-rw-r--r--data/unit-testing/merge.fate52
-rw-r--r--src/core/src/tonkadur/fate/v1/error/UnknownSequenceException.java30
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/World.java94
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/SequenceReference.java63
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableCall.java125
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableJump.java125
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java3
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java6
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/type/SequenceType.java193
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/type/Type.java4
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateLexer.g41
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g4118
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java14
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java139
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java10
15 files changed, 974 insertions, 3 deletions
diff --git a/data/unit-testing/merge.fate b/data/unit-testing/merge.fate
index ba40724..4915ff8 100644
--- a/data/unit-testing/merge.fate
+++ b/data/unit-testing/merge.fate
@@ -516,7 +516,7 @@
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; INDEXED TEST 1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; INDEXED TEST 1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
For reference, the values found in the sets are:
(for (set i 0) (=< i 30) (set i (+ i 1))
@@ -797,10 +797,56 @@ For reference, the values found in the sets are:
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; SAFE TEST 0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; SAFE TEST 0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(global (list int) sli0)
+(global (list int) sli1)
+(global (list int) sli2)
+(global (list int) sli3)
-(assert (false) [FAILED] TODO: safe merge tests.)
+(set sli0
+ (safe_merge_to_list
+ (lambda
+ (
+ (int a)
+ (int b)
+ )
+ (- a b)
+ )
+ 999
+ (range 0 10 1)
+ 1
+ (default (list int))
+ )
+)
+
+(set sli1
+ (safe_merge_to_list
+ (lambda
+ (
+ (int a)
+ (int b)
+ )
+ (- b a)
+ )
+ 1
+ (default (list int))
+ 999
+ (range 0 10 1)
+ )
+)
+
+(for (set i 0) (=< i 10) (set i (+ i 1))
+ (assert
+ (= (access i sli0) (access i sli1) (- i 1))
+ [FAILED] (var test_name) Equality test safe 0.
+ )
+)
+
+(assert
+ (= (var sli0) (var sli1))
+ [FAILED] (var test_name) Equality test safe 0.
+)
[COMPLETED] (var test_name)
diff --git a/src/core/src/tonkadur/fate/v1/error/UnknownSequenceException.java b/src/core/src/tonkadur/fate/v1/error/UnknownSequenceException.java
index bb12260..62c6744 100644
--- a/src/core/src/tonkadur/fate/v1/error/UnknownSequenceException.java
+++ b/src/core/src/tonkadur/fate/v1/error/UnknownSequenceException.java
@@ -1,6 +1,8 @@
package tonkadur.fate.v1.error;
+import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
import java.util.List;
import tonkadur.functional.Cons;
@@ -12,6 +14,8 @@ import tonkadur.parser.ParsingError;
import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.computation.SequenceReference;
+
public class UnknownSequenceException extends ParsingError
{
/***************************************************************************/
@@ -41,6 +45,32 @@ public class UnknownSequenceException extends ParsingError
this.all_occurrences = all_occurrences;
}
+ public UnknownSequenceException
+ (
+ final String sequence_name,
+ final Collection<SequenceReference> all_occurrences
+ )
+ {
+ super
+ (
+ ErrorLevel.ERROR,
+ ErrorCategory.UNKNOWN,
+ all_occurrences.iterator().next().get_origin()
+ );
+
+ this.sequence_name = sequence_name;
+
+ this.all_occurrences = new ArrayList<Cons<Origin, List<Computation>>>();
+
+ for (final SequenceReference occ: all_occurrences)
+ {
+ this.all_occurrences.add
+ (
+ new Cons(occ.get_origin(), Collections.singleton(occ))
+ );
+ }
+ }
+
@Override
public String toString ()
{
diff --git a/src/core/src/tonkadur/fate/v1/lang/World.java b/src/core/src/tonkadur/fate/v1/lang/World.java
index c813312..d07d9b7 100644
--- a/src/core/src/tonkadur/fate/v1/lang/World.java
+++ b/src/core/src/tonkadur/fate/v1/lang/World.java
@@ -22,9 +22,13 @@ import tonkadur.fate.v1.lang.meta.Computation;
import tonkadur.fate.v1.lang.meta.DeclarationCollection;
import tonkadur.fate.v1.lang.meta.ExtensionInstruction;
import tonkadur.fate.v1.lang.meta.ExtensionComputation;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
import tonkadur.fate.v1.lang.meta.Instruction;
import tonkadur.fate.v1.lang.type.Type;
+import tonkadur.fate.v1.lang.type.SequenceType;
+
+import tonkadur.fate.v1.lang.computation.SequenceReference;
public class World
{
@@ -36,6 +40,7 @@ public class World
protected final Map<String, List<Cons<Origin, List<Computation>>>>
sequence_uses;
+ protected final Map<String, List<SequenceReference>> sequence_variables;
protected final Map<String, ExtensionComputation> extension_value_nodes;
protected final Map<String, ExtensionInstruction> extension_instructions;
protected final Map<String, ExtensionInstruction>
@@ -63,6 +68,8 @@ public class World
sequence_uses =
new HashMap<String, List<Cons<Origin, List<Computation>>>>();
+ sequence_variables = new HashMap<String, List<SequenceReference>>();
+
extension_value_nodes = new HashMap<String, ExtensionComputation>();
extension_instructions = new HashMap<String, ExtensionInstruction>();
extension_first_level_instructions =
@@ -141,6 +148,22 @@ public class World
list_of_uses.add(new Cons(origin, parameters));
}
+ public void add_sequence_variable (final SequenceReference sr)
+ {
+ List<SequenceReference> list_of_variables;
+
+ list_of_variables = sequence_variables.get(sr.get_sequence_name());
+
+ if (list_of_variables == null)
+ {
+ list_of_variables = new ArrayList<SequenceReference>();
+
+ sequence_variables.put(sr.get_sequence_name(), list_of_variables);
+ }
+
+ list_of_variables.add(sr);
+ }
+
/**** Extension Stuff ****/
public Map<String, ExtensionInstruction> extension_instructions ()
{
@@ -209,6 +232,7 @@ public class World
is_sane = true;
is_sane = assert_sane_sequence_uses() & is_sane;
+ is_sane = assert_sane_sequence_variables() & is_sane;
return is_sane;
}
@@ -365,4 +389,74 @@ public class World
return is_sane;
}
+
+ protected boolean assert_sane_sequence_variables ()
+ throws Throwable
+ {
+ Sequence seq;
+
+ boolean is_sane;
+
+ is_sane = true;
+
+ for
+ (
+ final Map.Entry<String, List<SequenceReference>> entry:
+ sequence_variables.entrySet()
+ )
+ {
+ seq = sequences().get_or_null(entry.getKey());
+
+ if (seq == null)
+ {
+ final List<SequenceReference> variables;
+
+ variables = entry.getValue();
+
+ if (variables.isEmpty())
+ {
+ continue;
+ }
+
+ is_sane = false;
+
+ ErrorManager.handle
+ (
+ new UnknownSequenceException
+ (
+ entry.getKey(),
+ ((variables.size() == 1) ? null : variables)
+ )
+ );
+ }
+ else
+ {
+ final List<Type> signature_types;
+
+ signature_types = new ArrayList<Type>();
+
+ for (final Variable v: seq.get_signature())
+ {
+ signature_types.add(v.get_type());
+ }
+
+ for (final SequenceReference sr: entry.getValue())
+ {
+ ((SequenceType) sr.get_type()).propose_signature
+ (
+ signature_types
+ );
+
+ RecurrentChecks.assert_types_matches_signature
+ (
+ sr.get_origin(),
+ ((SequenceType) sr.get_type()).get_signature(),
+ signature_types
+ );
+ }
+ }
+ }
+
+ return is_sane;
+ }
}
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/SequenceReference.java b/src/core/src/tonkadur/fate/v1/lang/computation/SequenceReference.java
new file mode 100644
index 0000000..f7984df
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/SequenceReference.java
@@ -0,0 +1,63 @@
+package tonkadur.fate.v1.lang.computation;
+
+import tonkadur.parser.Origin;
+
+import tonkadur.fate.v1.lang.type.SequenceType;
+
+import tonkadur.fate.v1.lang.meta.ComputationVisitor;
+import tonkadur.fate.v1.lang.meta.Computation;
+
+public class SequenceReference extends Computation
+{
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final String sequence_name;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ public SequenceReference
+ (
+ final Origin origin,
+ final String sequence_name
+ )
+ {
+ super(origin, new SequenceType(origin, "(seq " + sequence_name + ")"));
+
+ this.sequence_name = sequence_name;
+ }
+
+
+ /**** Accessors ************************************************************/
+ @Override
+ public void get_visited_by (final ComputationVisitor cv)
+ throws Throwable
+ {
+ cv.visit_sequence_reference(this);
+ }
+
+ public String get_sequence_name ()
+ {
+ return sequence_name;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("(SequenceReference ");
+ sb.append(sequence_name);
+
+ sb.append(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableCall.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableCall.java
new file mode 100644
index 0000000..407f430
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableCall.java
@@ -0,0 +1,125 @@
+package tonkadur.fate.v1.lang.instruction;
+
+import java.util.Collections;
+import java.util.List;
+
+import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
+
+import tonkadur.error.ErrorManager;
+
+import tonkadur.fate.v1.error.InvalidTypeException;
+
+import tonkadur.fate.v1.lang.type.SequenceType;
+import tonkadur.fate.v1.lang.type.Type;
+
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.InstructionVisitor;
+import tonkadur.fate.v1.lang.meta.Instruction;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
+
+public class SequenceVariableCall extends Instruction
+{
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final List<Computation> parameters;
+ protected final Computation sequence;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected SequenceVariableCall
+ (
+ final Origin origin,
+ final Computation sequence,
+ final List<Computation> parameters
+ )
+ {
+ super(origin);
+
+ this.sequence = sequence;
+ this.parameters = parameters;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ public static SequenceVariableCall build
+ (
+ final Origin origin,
+ final Computation sequence,
+ final List<Computation> parameters
+ )
+ throws ParsingError
+ {
+ final List<Type> signature;
+
+ ((SequenceType) sequence.get_type()).propose_signature_from_parameters
+ (
+ parameters
+ );
+
+ if (!sequence.get_type().get_act_as_type().equals(Type.SEQUENCE))
+ {
+ ErrorManager.handle
+ (
+ new InvalidTypeException
+ (
+ origin,
+ sequence.get_type(),
+ Collections.singleton(Type.SEQUENCE)
+ )
+ );
+ }
+
+ RecurrentChecks.assert_computations_matches_signature
+ (
+ origin,
+ parameters,
+ ((SequenceType) sequence.get_type()).get_signature()
+ );
+
+ return new SequenceVariableCall(origin, sequence, parameters);
+ }
+
+ /**** Accessors ************************************************************/
+ @Override
+ public void get_visited_by (final InstructionVisitor iv)
+ throws Throwable
+ {
+ iv.visit_sequence_variable_call(this);
+ }
+
+ public Computation get_sequence ()
+ {
+ return sequence;
+ }
+
+ public List<Computation> get_parameters ()
+ {
+ return parameters;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("(SequenceVariableCall ");
+ sb.append(sequence);
+
+ for (final Computation c: parameters)
+ {
+ sb.append(" ");
+ sb.append(c.toString());
+ }
+
+ sb.append(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableJump.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableJump.java
new file mode 100644
index 0000000..52aa947
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableJump.java
@@ -0,0 +1,125 @@
+package tonkadur.fate.v1.lang.instruction;
+
+import java.util.Collections;
+import java.util.List;
+
+import tonkadur.parser.Origin;
+import tonkadur.parser.ParsingError;
+
+import tonkadur.error.ErrorManager;
+
+import tonkadur.fate.v1.error.InvalidTypeException;
+
+import tonkadur.fate.v1.lang.type.SequenceType;
+import tonkadur.fate.v1.lang.type.Type;
+
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.InstructionVisitor;
+import tonkadur.fate.v1.lang.meta.Instruction;
+import tonkadur.fate.v1.lang.meta.RecurrentChecks;
+
+public class SequenceVariableJump extends Instruction
+{
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final List<Computation> parameters;
+ protected final Computation sequence;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected SequenceVariableJump
+ (
+ final Origin origin,
+ final Computation sequence,
+ final List<Computation> parameters
+ )
+ {
+ super(origin);
+
+ this.sequence = sequence;
+ this.parameters = parameters;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ public static SequenceVariableJump build
+ (
+ final Origin origin,
+ final Computation sequence,
+ final List<Computation> parameters
+ )
+ throws ParsingError
+ {
+ final List<Type> signature;
+
+ ((SequenceType) sequence.get_type()).propose_signature_from_parameters
+ (
+ parameters
+ );
+
+ if (!sequence.get_type().get_act_as_type().equals(Type.SEQUENCE))
+ {
+ ErrorManager.handle
+ (
+ new InvalidTypeException
+ (
+ origin,
+ sequence.get_type(),
+ Collections.singleton(Type.SEQUENCE)
+ )
+ );
+ }
+
+ RecurrentChecks.assert_computations_matches_signature
+ (
+ origin,
+ parameters,
+ ((SequenceType) sequence.get_type()).get_signature()
+ );
+
+ return new SequenceVariableJump(origin, sequence, parameters);
+ }
+
+ /**** Accessors ************************************************************/
+ @Override
+ public void get_visited_by (final InstructionVisitor iv)
+ throws Throwable
+ {
+ iv.visit_sequence_variable_jump(this);
+ }
+
+ public Computation get_sequence ()
+ {
+ return sequence;
+ }
+
+ public List<Computation> get_parameters ()
+ {
+ return parameters;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("(SequenceVariableJump ");
+ sb.append(sequence);
+
+ for (final Computation c: parameters)
+ {
+ sb.append(" ");
+ sb.append(c.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 4631a2f..adb3a05 100644
--- a/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java
+++ b/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java
@@ -79,6 +79,9 @@ public interface ComputationVisitor
public void visit_operation (final Operation n)
throws Throwable;
+ public void visit_sequence_reference (final SequenceReference n)
+ throws Throwable;
+
public void visit_paragraph (final Paragraph n)
throws Throwable;
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 a672f3c..406cd7f 100644
--- a/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java
+++ b/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java
@@ -140,6 +140,12 @@ public interface InstructionVisitor
public void visit_sequence_jump (final SequenceJump n)
throws Throwable;
+ public void visit_sequence_variable_call (final SequenceVariableCall n)
+ throws Throwable;
+
+ public void visit_sequence_variable_jump (final SequenceVariableJump n)
+ throws Throwable;
+
public void visit_local_variable (final LocalVariable n)
throws Throwable;
diff --git a/src/core/src/tonkadur/fate/v1/lang/type/SequenceType.java b/src/core/src/tonkadur/fate/v1/lang/type/SequenceType.java
new file mode 100644
index 0000000..c6e7ef3
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/type/SequenceType.java
@@ -0,0 +1,193 @@
+package tonkadur.fate.v1.lang.type;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import tonkadur.parser.Origin;
+
+import tonkadur.fate.v1.lang.meta.DeclaredEntity;
+import tonkadur.fate.v1.lang.meta.Computation;
+
+public class SequenceType extends Type
+{
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final List<Type> signature;
+ protected boolean signature_is_defined;
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+
+ /**** Constructors *********************************************************/
+ public SequenceType
+ (
+ final Origin origin,
+ final String name,
+ final List<Type> signature
+ )
+ {
+ super(origin, null, name);
+
+ this.signature = signature;
+ this.signature_is_defined = true;
+ }
+
+ public SequenceType
+ (
+ final Origin origin,
+ final String name
+ )
+ {
+ super(origin, null, name);
+
+ this.signature = new ArrayList<Type>();
+ this.signature_is_defined = false;
+ }
+
+ /**** Accessors ************************************************************/
+ public List<Type> get_signature ()
+ {
+ return signature;
+ }
+
+ public void propose_signature (final List<Type> signature)
+ {
+ if (signature_is_defined)
+ {
+ return;
+ }
+
+ this.signature.addAll(signature);
+
+ signature_is_defined = true;
+ }
+
+ public void propose_signature_from_parameters
+ (
+ final List<Computation> params
+ )
+ {
+ if (signature_is_defined)
+ {
+ return;
+ }
+
+ for (final Computation c: params)
+ {
+ signature.add(c.get_type());
+ }
+
+ signature_is_defined = true;
+ }
+
+ /**** Compatibility ********************************************************/
+ @Override
+ public boolean can_be_used_as (final Type t)
+ {
+ if (t instanceof SequenceType)
+ {
+ final Iterator<Type> i0, i1;
+ final SequenceType lt;
+
+ lt = (SequenceType) t;
+
+ propose_signature(lt.get_signature());
+
+ if (signature.size() != lt.signature.size())
+ {
+ return false;
+ }
+
+ i0 = signature.iterator();
+ i1 = lt.signature.iterator();
+
+ while(i0.hasNext())
+ {
+ if (!i0.next().can_be_used_as(i1.next()))
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ return false;
+ }
+
+ /*
+ * This is for the very special case where a type is used despite not being
+ * even a sub-type of the expected one. Using this rather expensive function,
+ * the most restrictive shared type will be returned. If no such type exists,
+ * the ANY time is returned.
+ */
+ @Override
+ public DeclaredEntity generate_comparable_to (final DeclaredEntity de)
+ {
+ final Iterator<Type> i0, i1;
+ final List<Type> resulting_signature;
+ final SequenceType lt;
+
+ if (!(de instanceof SequenceType))
+ {
+ return Type.ANY;
+ }
+
+ lt = (SequenceType) de;
+
+ if (lt.signature.size() != signature.size())
+ {
+ return Type.ANY;
+ }
+
+ resulting_signature = new ArrayList<Type>();
+
+ i0 = signature.iterator();
+ i1 = lt.signature.iterator();
+
+ while(i0.hasNext())
+ {
+ resulting_signature.add
+ (
+ (Type) i0.next().generate_comparable_to(i1.next())
+ );
+ }
+
+ return new SequenceType(get_origin(), name, resulting_signature);
+ }
+
+ @Override
+ public Type get_act_as_type ()
+ {
+ return Type.SEQUENCE;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public Type generate_alias (final Origin origin, final String name)
+ {
+ return new SequenceType(origin, name, signature);
+ }
+
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("(Sequence (");
+
+ for (final Type t: signature)
+ {
+ sb.append(t.get_name());
+ sb.append(" ");
+ }
+
+ sb.append("))::");
+ sb.append(name);
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/type/Type.java b/src/core/src/tonkadur/fate/v1/lang/type/Type.java
index ac4bcb3..ce93e9e 100644
--- a/src/core/src/tonkadur/fate/v1/lang/type/Type.java
+++ b/src/core/src/tonkadur/fate/v1/lang/type/Type.java
@@ -29,6 +29,7 @@ public class Type extends DeclaredEntity
public static final Type LIST;
public static final Type REF;
public static final Type RICH_TEXT;
+ public static final Type SEQUENCE;
public static final Type SET;
public static final Type STRING;
@@ -57,6 +58,7 @@ public class Type extends DeclaredEntity
LIST = new Type(base, null, "list");
REF = new Type(base, null, "ref");
RICH_TEXT = new Type(base, null, "text");
+ SEQUENCE = new Type(base, null, "sequence");
SET = new Type(base, null, "set");
STRING = new Type(base, null, "string");
@@ -71,6 +73,7 @@ public class Type extends DeclaredEntity
ALL_TYPES.add(LIST);
ALL_TYPES.add(REF);
ALL_TYPES.add(RICH_TEXT);
+ ALL_TYPES.add(SEQUENCE);
ALL_TYPES.add(SET);
ALL_TYPES.add(STRING);
@@ -83,6 +86,7 @@ public class Type extends DeclaredEntity
COMPARABLE_TYPES.add(FLOAT);
COMPARABLE_TYPES.add(INT);
+ COMPARABLE_TYPES.add(SEQUENCE);
COMPARABLE_TYPES.add(LAMBDA);
COMPARABLE_TYPES.add(STRING);
COMPARABLE_TYPES.add(BOOL);
diff --git a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4
index b7b64dd..4b6edfc 100644
--- a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4
+++ b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4
@@ -154,6 +154,7 @@ SUB_LIST_KW: L_PAREN 'sub'US'list' SEP+;
IMP_SUB_LIST_KW: L_PAREN 'sub'US'list!' SEP+;
LIST_KW: L_PAREN 'list' SEP+;
SIZE_KW: L_PAREN 'size' SEP+;
+SEQUENCE_KW: L_PAREN ('seq'|'sequence') SEP+;
SWITCH_KW: L_PAREN 'switch' SEP+;
TIMES_KW: L_PAREN ('times'|'*') SEP+;
TRUE_KW: L_PAREN 'true)';
diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
index 16a9472..8465af6 100644
--- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
+++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
@@ -1801,6 +1801,86 @@ returns [Instruction result]
$result = new SequenceJump(origin, sequence_name, params);
}
+ | VISIT_KW value WS+ value_list WS* R_PAREN
+ {
+ final Origin origin;
+
+ origin =
+ CONTEXT.get_origin_at
+ (
+ ($VISIT_KW.getLine()),
+ ($VISIT_KW.getCharPositionInLine())
+ );
+
+ $result =
+ SequenceVariableCall.build
+ (
+ origin,
+ ($value.result),
+ ($value_list.result)
+ );
+ }
+
+ | VISIT_KW value WS* R_PAREN
+ {
+ final Origin origin;
+
+ origin =
+ CONTEXT.get_origin_at
+ (
+ ($VISIT_KW.getLine()),
+ ($VISIT_KW.getCharPositionInLine())
+ );
+
+ $result =
+ SequenceVariableCall.build
+ (
+ origin,
+ ($value.result),
+ new ArrayList<Computation>()
+ );
+ }
+
+ | CONTINUE_AS_KW value WS+ value_list WS* R_PAREN
+ {
+ final Origin origin;
+
+ origin =
+ CONTEXT.get_origin_at
+ (
+ ($CONTINUE_AS_KW.getLine()),
+ ($CONTINUE_AS_KW.getCharPositionInLine())
+ );
+
+ $result =
+ SequenceVariableJump.build
+ (
+ origin,
+ ($value.result),
+ ($value_list.result)
+ );
+ }
+
+ | CONTINUE_AS_KW value WS* R_PAREN
+ {
+ final Origin origin;
+
+ origin =
+ CONTEXT.get_origin_at
+ (
+ ($CONTINUE_AS_KW.getLine()),
+ ($CONTINUE_AS_KW.getCharPositionInLine())
+ );
+
+ $result =
+ SequenceVariableJump.build
+ (
+ origin,
+ ($value.result),
+ new ArrayList<Computation>()
+ );
+ }
+
| ASSERT_KW non_text_value WS+ paragraph WS* R_PAREN
{
$result =
@@ -2798,6 +2878,26 @@ returns [Type result]
($type_list.result)
);
}
+
+ | SEQUENCE_KW type_list WS* R_PAREN
+ {
+ final Origin start_origin;
+
+ start_origin =
+ CONTEXT.get_origin_at
+ (
+ ($SEQUENCE_KW.getLine()),
+ ($SEQUENCE_KW.getCharPositionInLine())
+ );
+
+ $result =
+ new SequenceType
+ (
+ start_origin,
+ "auto_generated",
+ ($type_list.result)
+ );
+ }
;
catch [final Throwable e]
{
@@ -4092,6 +4192,24 @@ returns [Computation result]
}
}
+ | SEQUENCE_KW WORD WS* R_PAREN
+ {
+ final SequenceReference sr;
+ final Origin origin;
+
+ origin =
+ CONTEXT.get_origin_at
+ (
+ ($SEQUENCE_KW.getLine()),
+ ($SEQUENCE_KW.getCharPositionInLine())
+ );
+
+ sr = new SequenceReference(origin, ($WORD.text));
+ $result = sr;
+
+ WORLD.add_sequence_variable(sr);
+ }
+
| EVAL_KW value_reference WS* R_PAREN
{
final Origin origin;
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 2df0868..110c670 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
@@ -3955,4 +3955,18 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
cc.release_registers(init_instructions);
}
}
+
+ @Override
+ public void visit_sequence_reference
+ (
+ final tonkadur.fate.v1.lang.computation.SequenceReference n
+ )
+ throws Throwable
+ {
+ result_as_computation =
+ compiler.assembler().get_label_constant
+ (
+ n.get_sequence_name()
+ );
+ }
}
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 5986682..dda6d2e 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
@@ -3514,6 +3514,79 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
}
@Override
+ public void visit_sequence_variable_call
+ (
+ final tonkadur.fate.v1.lang.instruction.SequenceVariableCall n
+ )
+ throws Throwable
+ {
+ final ComputationCompiler sequence_cc;
+ final List<ComputationCompiler> parameter_ccs;
+ final List<Computation> parameters;
+
+ final String return_to_label;
+
+ return_to_label =
+ compiler.assembler().generate_label("<seq_call#return_to>");
+
+ sequence_cc = new ComputationCompiler(compiler);
+ parameter_ccs = new ArrayList<ComputationCompiler>();
+ parameters = new ArrayList<Computation>();
+
+ n.get_sequence().get_visited_by(sequence_cc);
+
+ if (sequence_cc.has_init())
+ {
+ result.add(sequence_cc.get_init());
+ }
+
+ for
+ (
+ final tonkadur.fate.v1.lang.meta.Computation param: n.get_parameters()
+ )
+ {
+ final ComputationCompiler cc;
+
+ cc = new ComputationCompiler(compiler);
+
+ param.get_visited_by(cc);
+
+ if (cc.has_init())
+ {
+ result.add(cc.get_init());
+ }
+
+ parameters.add(cc.get_computation());
+ parameter_ccs.add(cc);
+ }
+
+ result.addAll(compiler.registers().store_parameters(parameters));
+
+ result.add
+ (
+ compiler.assembler().mark_after
+ (
+ compiler.assembler().merge
+ (
+ compiler.registers().get_visit_context_instructions
+ (
+ sequence_cc.get_computation(),
+ compiler.assembler().get_label_constant(return_to_label)
+ )
+ ),
+ return_to_label
+ )
+ );
+
+ sequence_cc.release_registers(result);
+
+ for (final ComputationCompiler cc: parameter_ccs)
+ {
+ cc.release_registers(result);
+ }
+ }
+
+ @Override
public void visit_sequence_jump
(
final tonkadur.fate.v1.lang.instruction.SequenceJump n
@@ -3574,6 +3647,72 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
}
@Override
+ public void visit_sequence_variable_jump
+ (
+ final tonkadur.fate.v1.lang.instruction.SequenceVariableJump n
+ )
+ throws Throwable
+ {
+ final ComputationCompiler sequence_cc;
+ final List<ComputationCompiler> parameter_ccs;
+ final List<Computation> parameters;
+
+ sequence_cc = new ComputationCompiler(compiler);
+ parameter_ccs = new ArrayList<ComputationCompiler>();
+ parameters = new ArrayList<Computation>();
+
+ n.get_sequence().get_visited_by(sequence_cc);
+
+ if (sequence_cc.has_init())
+ {
+ result.add(sequence_cc.get_init());
+ }
+
+ for
+ (
+ final tonkadur.fate.v1.lang.meta.Computation param: n.get_parameters()
+ )
+ {
+ final ComputationCompiler cc;
+
+ cc = new ComputationCompiler(compiler);
+
+ param.get_visited_by(cc);
+
+ if (cc.has_init())
+ {
+ result.add(cc.get_init());
+ }
+
+ parameters.add(cc.get_computation());
+ parameter_ccs.add(cc);
+ }
+
+ result.addAll(compiler.registers().store_parameters(parameters));
+
+ for (final ComputationCompiler cc: parameter_ccs)
+ {
+ cc.release_registers(result);
+ }
+
+ /* Terminate current context */
+ result.addAll
+ (
+ compiler.registers().get_finalize_context_instructions()
+ );
+
+ result.addAll
+ (
+ compiler.registers().get_jump_to_context_instructions
+ (
+ sequence_cc.get_computation()
+ )
+ );
+
+ sequence_cc.release_registers(result);
+ }
+
+ @Override
public void visit_set_value
(
final tonkadur.fate.v1.lang.instruction.SetValue n
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java
index f820d7b..af4f703 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java
@@ -68,6 +68,11 @@ public class TypeCompiler
return Type.INT;
}
+ if (fate_type instanceof tonkadur.fate.v1.lang.type.SequenceType)
+ {
+ return Type.INT;
+ }
+
fate_type = fate_type.get_base_type();
if (fate_type.equals(tonkadur.fate.v1.lang.type.Type.BOOL))
@@ -181,6 +186,11 @@ public class TypeCompiler
return MapType.MAP_TO_INT;
}
+ if (fate_content_type instanceof tonkadur.fate.v1.lang.type.SequenceType)
+ {
+ return MapType.MAP_TO_INT;
+ }
+
return new MapType(compile(compiler, fate_content_type));
}
}