| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src')
81 files changed, 3933 insertions, 558 deletions
| diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/AmbiguousWord.java b/src/core/src/tonkadur/fate/v1/lang/computation/AmbiguousWord.java index e1098bb..b29e997 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/AmbiguousWord.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/AmbiguousWord.java @@ -100,6 +100,13 @@ public class AmbiguousWord extends Computation        return as_string;     } +   @Override +   public void use_as_reference () +   throws ParsingError +   { +      result.use_as_reference(); +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/FieldAccess.java b/src/core/src/tonkadur/fate/v1/lang/computation/FieldAccess.java index 2bb24fd..0b89688 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/FieldAccess.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/FieldAccess.java @@ -140,6 +140,13 @@ public class FieldAccess extends Computation        return parent;     } +   @Override +   public void use_as_reference () +   throws ParsingError +   { +      parent.use_as_reference(); +   } +     /**** Misc. ****************************************************************/     @Override     public String 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 935e195..8bf5e8d 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/GenericComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/GenericComputation.java @@ -74,7 +74,7 @@ public abstract class GenericComputation extends Computation        }     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String name, @@ -99,7 +99,7 @@ public abstract class GenericComputation extends Computation        }        return -         (GenericComputation) computation_class.getDeclaredMethod +         (Computation) computation_class.getDeclaredMethod           (              "build",              Origin.class, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/IfElseValue.java b/src/core/src/tonkadur/fate/v1/lang/computation/IfElseValue.java deleted file mode 100644 index b1e86fb..0000000 --- a/src/core/src/tonkadur/fate/v1/lang/computation/IfElseValue.java +++ /dev/null @@ -1,149 +0,0 @@ -package tonkadur.fate.v1.lang.computation; - -import tonkadur.parser.Origin; -import tonkadur.parser.ParsingError; - -import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.type.FutureType; - -import tonkadur.fate.v1.lang.meta.ComputationVisitor; -import tonkadur.fate.v1.lang.meta.Computation; -import tonkadur.fate.v1.lang.meta.RecurrentChecks; - -public class IfElseValue extends Computation -{ -   /***************************************************************************/ -   /**** MEMBERS **************************************************************/ -   /***************************************************************************/ -   protected final Computation condition; -   protected final Computation if_true; -   protected final Computation if_false; - -   /***************************************************************************/ -   /**** PROTECTED ************************************************************/ -   /***************************************************************************/ -   /**** Constructors *********************************************************/ -   protected IfElseValue -   ( -      final Origin origin, -      final Type return_type, -      final Computation condition, -      final Computation if_true, -      final Computation if_false -   ) -   { -      super(origin, return_type); - -      this.condition = condition; -      this.if_true = if_true; -      this.if_false = if_false; -   } - -   /***************************************************************************/ -   /**** PUBLIC ***************************************************************/ -   /***************************************************************************/ -   /**** Constructors *********************************************************/ -   public static IfElseValue build -   ( -      final Origin origin, -      final Computation condition, -      final Computation if_true, -      final Computation if_false -   ) -   throws ParsingError -   { -      condition.expect_non_string(); - -      RecurrentChecks.assert_can_be_used_as(condition, Type.BOOL); - -      return -         new IfElseValue -         ( -            origin, -            new FutureType(origin), -            condition, -            if_true, -            if_false -         ); -   } - -   /**** Accessors ************************************************************/ -   @Override -   public void expect_non_string () -   throws ParsingError -   { -      if_true.expect_non_string(); -      if_false.expect_non_string(); - -      ((FutureType) get_type()).resolve_to -      ( -         RecurrentChecks.assert_can_be_used_as(if_false, if_true.get_type()) -      ); -   } - -   @Override -   public void expect_string () -   throws ParsingError -   { -      if_true.expect_string(); -      if_false.expect_string(); - -      ((FutureType) get_type()).resolve_to -      ( -         RecurrentChecks.assert_can_be_used_as(if_false, if_true.get_type()) -      ); -   } - -   @Override -   public void get_visited_by (final ComputationVisitor cv) -   throws Throwable -   { -      cv.visit_if_else_value(this); -   } - -   public Computation get_condition () -   { -      return condition; -   } - -   public Computation get_if_true () -   { -      return if_true; -   } - -   public Computation get_if_false () -   { -      return if_false; -   } - -   /**** Misc. ****************************************************************/ -   @Override -   public String toString () -   { -      final StringBuilder sb = new StringBuilder(); - -      sb.append("(IfElseValue"); -      sb.append(System.lineSeparator()); -      sb.append(System.lineSeparator()); - -      sb.append("Condition:"); -      sb.append(System.lineSeparator()); -      sb.append(condition.toString()); - -      sb.append(System.lineSeparator()); -      sb.append(System.lineSeparator()); -      sb.append("If true:"); -      sb.append(System.lineSeparator()); -      sb.append(if_true.toString()); - -      sb.append(System.lineSeparator()); -      sb.append(System.lineSeparator()); -      sb.append("If false:"); -      sb.append(System.lineSeparator()); -      sb.append(if_false.toString()); - -      sb.append(")"); - -      return sb.toString(); -   } -} diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Newline.java b/src/core/src/tonkadur/fate/v1/lang/computation/Newline.java deleted file mode 100644 index 2f70d3e..0000000 --- a/src/core/src/tonkadur/fate/v1/lang/computation/Newline.java +++ /dev/null @@ -1,35 +0,0 @@ -package tonkadur.fate.v1.lang.computation; - -import tonkadur.parser.Origin; - -import tonkadur.fate.v1.lang.meta.ComputationVisitor; -import tonkadur.fate.v1.lang.meta.Computation; - -import tonkadur.fate.v1.lang.type.Type; - -public class Newline extends Computation -{ -   /***************************************************************************/ -   /**** PUBLIC ***************************************************************/ -   /***************************************************************************/ -   /**** Constructors *********************************************************/ -   public Newline (final Origin origin) -   { -      super(origin, Type.TEXT); -   } - -   /**** Accessors ************************************************************/ -   @Override -   public void get_visited_by (final ComputationVisitor cv) -   throws Throwable -   { -      cv.visit_newline(this); -   } - -   /**** Misc. ****************************************************************/ -   @Override -   public String toString () -   { -      return "(Newline)"; -   } -} diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Paragraph.java b/src/core/src/tonkadur/fate/v1/lang/computation/Paragraph.java index 36515d1..c0392c9 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/Paragraph.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/Paragraph.java @@ -6,6 +6,7 @@ import tonkadur.parser.Origin;  import tonkadur.fate.v1.lang.meta.ComputationVisitor;  import tonkadur.fate.v1.lang.meta.Computation; +  import tonkadur.fate.v1.lang.type.Type;  public class Paragraph extends Computation @@ -31,9 +32,18 @@ public class Paragraph extends Computation     )     throws Throwable     { -      for (final Computation c: content) +      for (int i = content.size(); i > 0; i--)        { +         final Computation c; + +         c = content.get(i); +           c.expect_string(); + +         if (!c.get_type().can_be_used_as(Type.TEXT)) +         { +            content.set(i, ValueToText.build(c)); +         }        }        return new Paragraph(origin, content); diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/VariableReference.java b/src/core/src/tonkadur/fate/v1/lang/computation/VariableReference.java index 6a8e428..98f6116 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/VariableReference.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/VariableReference.java @@ -29,7 +29,6 @@ public class VariableReference extends Computation        super(origin, reported_type);        this.variable = variable;     } -   /**** Constructors *********************************************************/     /***************************************************************************/     /**** PUBLIC ***************************************************************/ @@ -58,6 +57,13 @@ public class VariableReference extends Computation        return variable;     } +   @Override +   public void use_as_reference () +   throws ParsingError +   { +      // This allows its use as reference. +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Access.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Access.java index 11ff4d1..d1527aa 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Access.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Access.java @@ -41,7 +41,7 @@ public class Access extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, @@ -135,7 +135,6 @@ public class Access extends GenericComputation     /***************************************************************************/     /**** PUBLIC ***************************************************************/     /***************************************************************************/ -     /**** Accessors ************************************************************/     public Computation get_index ()     { @@ -147,6 +146,13 @@ public class Access extends GenericComputation        return parent;     } +   @Override +   public void use_as_reference () +   throws ParsingError +   { +      parent.use_as_reference(); +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementAtComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementAtComputation.java index aa50009..e198d91 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementAtComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementAtComputation.java @@ -33,7 +33,7 @@ public class AddElementAtComputation extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String _alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementComputation.java index ef52eb4..996d9b3 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementComputation.java @@ -33,7 +33,7 @@ public class AddElementComputation extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementsOfComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementsOfComputation.java index 4458df5..5c9a9e0 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementsOfComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementsOfComputation.java @@ -74,7 +74,7 @@ public class AddElementsOfComputation extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddressOperator.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddressOperator.java index bad9e0e..c785804 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddressOperator.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddressOperator.java @@ -47,7 +47,7 @@ public class AddressOperator extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String _alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AtReference.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AtReference.java index 58711b7..19e5c0b 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AtReference.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AtReference.java @@ -37,7 +37,7 @@ public class AtReference extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String _alias, @@ -89,6 +89,7 @@ public class AtReference extends GenericComputation     /***************************************************************************/     /**** PROTECTED ************************************************************/     /***************************************************************************/ +   /**** Constructors *********************************************************/     protected AtReference     (        final Origin origin, @@ -100,19 +101,23 @@ public class AtReference extends GenericComputation        this.parent = parent;     } -   /**** Constructors *********************************************************/     /***************************************************************************/     /**** PUBLIC ***************************************************************/     /***************************************************************************/ -   /**** Constructors *********************************************************/ -     /**** Accessors ************************************************************/     public Computation get_parent ()     {        return parent;     } +   @Override +   public void use_as_reference () +   throws ParsingError +   { +      // This allows its use as reference. +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/CarCdr.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/CarCdr.java index aae1102..1400847 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/CarCdr.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/CarCdr.java @@ -33,7 +33,7 @@ public class CarCdr extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, @@ -125,6 +125,13 @@ public class CarCdr extends GenericComputation        return is_car;     } +   @Override +   public void use_as_reference () +   throws ParsingError +   { +      parent.use_as_reference(); +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/ConsComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/ConsComputation.java index 09488d4..6f569a8 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/ConsComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/ConsComputation.java @@ -26,7 +26,7 @@ public class ConsComputation extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/CountOperator.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/CountOperator.java index da473d3..82d105f 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/CountOperator.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/CountOperator.java @@ -37,7 +37,7 @@ public class CountOperator extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/FilterComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/FilterComputation.java index ec84cd0..9781e6f 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/FilterComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/FilterComputation.java @@ -33,7 +33,7 @@ public class FilterComputation extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Fold.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Fold.java index cb0f317..694bcaf 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Fold.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Fold.java @@ -47,7 +47,7 @@ public class Fold extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IfElseValue.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IfElseValue.java index 7555849..be23f7d 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IfElseValue.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IfElseValue.java @@ -31,7 +31,7 @@ public class IfElseValue extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexOfOperator.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexOfOperator.java index c042e18..4cff53e 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexOfOperator.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexOfOperator.java @@ -33,7 +33,7 @@ public class IndexOfOperator extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedFilterComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedFilterComputation.java index 1d17a99..8a2bf4f 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedFilterComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedFilterComputation.java @@ -38,7 +38,7 @@ public class IndexedFilterComputation extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMapComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMapComputation.java index 717dc53..a0adf57 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMapComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMapComputation.java @@ -38,7 +38,7 @@ public class IndexedMapComputation extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMergeComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMergeComputation.java index 021c4ce..aba8e45 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMergeComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedMergeComputation.java @@ -38,7 +38,7 @@ public class IndexedMergeComputation extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedPartitionComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedPartitionComputation.java index 46df979..d41a1e4 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedPartitionComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IndexedPartitionComputation.java @@ -39,7 +39,7 @@ public class IndexedPartitionComputation extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IsEmpty.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IsEmpty.java index 6b2d177..0f0153d 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IsEmpty.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IsEmpty.java @@ -44,7 +44,7 @@ public class IsEmpty extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IsMemberOperator.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IsMemberOperator.java index 0670d63..c82e8cf 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/IsMemberOperator.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/IsMemberOperator.java @@ -43,7 +43,7 @@ public class IsMemberOperator extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/LambdaEvaluation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/LambdaEvaluation.java index 9e1597f..4d67101 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/LambdaEvaluation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/LambdaEvaluation.java @@ -33,7 +33,7 @@ public class LambdaEvaluation extends GenericComputation     }     /**** Constructors *********************************************************/ -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String _alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/MapComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/MapComputation.java index e271285..4fcf324 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/MapComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/MapComputation.java @@ -33,7 +33,7 @@ public class MapComputation extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/MergeComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/MergeComputation.java index 2354ba3..171d448 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/MergeComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/MergeComputation.java @@ -32,7 +32,7 @@ public class MergeComputation extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Newline.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Newline.java index 664b864..5ddc742 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Newline.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Newline.java @@ -26,7 +26,7 @@ public class Newline extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Operation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Operation.java index 62dcaea..46effb9 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Operation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Operation.java @@ -151,7 +151,7 @@ public class Operation extends GenericComputation        return ALIASED_OPERATOR.keySet();     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, @@ -162,7 +162,7 @@ public class Operation extends GenericComputation        return build(origin, ALIASED_OPERATOR.get(alias), operands);     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final Operator operator, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/PartitionComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/PartitionComputation.java index 32e655d..9444bc1 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/PartitionComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/PartitionComputation.java @@ -33,7 +33,7 @@ public class PartitionComputation extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/PopElementComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/PopElementComputation.java index 667ad6b..7c1784d 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/PopElementComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/PopElementComputation.java @@ -49,7 +49,7 @@ public class PopElementComputation extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/PushElementComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/PushElementComputation.java index 69c7e7f..f25a7dc 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/PushElementComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/PushElementComputation.java @@ -37,7 +37,7 @@ public class PushElementComputation extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, @@ -59,7 +59,7 @@ public class PushElementComputation extends GenericComputation        collection = call_parameters.get(0);        element = call_parameters.get(1); -      is_from_left = alias.contains("eft"); +      is_from_left = alias.endsWith("eft");        if (alias.startsWith("set:"))        { @@ -77,6 +77,7 @@ public class PushElementComputation extends GenericComputation              element           );        } +        return           new PushElementComputation           ( @@ -86,6 +87,7 @@ public class PushElementComputation extends GenericComputation              is_from_left           );     } +     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Range.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Range.java index f58cb1c..3ac9f21 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Range.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Range.java @@ -29,7 +29,7 @@ public class Range extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveAllOfElementComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveAllOfElementComputation.java index 858aeb5..8fc9c44 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveAllOfElementComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveAllOfElementComputation.java @@ -25,14 +25,20 @@ public class RemoveAllOfElementComputation extends GenericComputation        aliases.add("list:remove_each");        aliases.add("list:removeeach");        aliases.add("list:removeEach"); +      aliases.add("list:remove_every"); +      aliases.add("list:removeevery"); +      aliases.add("list:removeEvery");        aliases.add("set:remove_each");        aliases.add("set:removeeach");        aliases.add("set:removeEach"); +      aliases.add("set:remove_every"); +      aliases.add("set:removeevery"); +      aliases.add("set:removeEvery");        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementAtComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementAtComputation.java index 781f4e1..ad8f7bd 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementAtComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementAtComputation.java @@ -34,7 +34,7 @@ public class RemoveElementAtComputation extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementComputation.java index a75f0cd..5c25edf 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementComputation.java @@ -39,7 +39,7 @@ public class RemoveElementComputation extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementsOfComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementsOfComputation.java index 66eb7a3..fdbd7ba 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementsOfComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementsOfComputation.java @@ -33,7 +33,7 @@ public class RemoveElementsOfComputation extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/ReverseListComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/ReverseListComputation.java index 5df91d0..b784352 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/ReverseListComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/ReverseListComputation.java @@ -30,7 +30,7 @@ public class ReverseListComputation extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/ShuffleComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/ShuffleComputation.java index f5ed5a6..163e446 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/ShuffleComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/ShuffleComputation.java @@ -30,7 +30,7 @@ public class ShuffleComputation extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/SizeOperator.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/SizeOperator.java index 92b71df..670e8f3 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/SizeOperator.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/SizeOperator.java @@ -31,7 +31,7 @@ public class SizeOperator extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/SortComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/SortComputation.java index 8e004d2..64999a7 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/SortComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/SortComputation.java @@ -30,7 +30,7 @@ public class SortComputation extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/SubListComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/SubListComputation.java index f9c20bf..5243f0d 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/SubListComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/SubListComputation.java @@ -34,7 +34,7 @@ public class SubListComputation extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String alias, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/TextJoin.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/TextJoin.java index 7d5d364..bc8a0b9 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/TextJoin.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/TextJoin.java @@ -32,7 +32,7 @@ public class TextJoin extends GenericComputation        return aliases;     } -   public static GenericComputation build +   public static Computation build     (        final Origin origin,        final String _alias, 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 5483f5a..850dc73 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/GenericInstruction.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/GenericInstruction.java @@ -75,7 +75,7 @@ public abstract class GenericInstruction extends Instruction        }     } -   public static GenericInstruction build +   public static Instruction build     (        final Origin origin,        final String name, @@ -100,7 +100,7 @@ public abstract class GenericInstruction extends Instruction        }        return -         (GenericInstruction) computation_class.getDeclaredMethod +         (Instruction) computation_class.getDeclaredMethod           (              "build",              Origin.class, diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableJump.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableJump.java deleted file mode 100644 index 72bb3a2..0000000 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableJump.java +++ /dev/null @@ -1,129 +0,0 @@ -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; - -      sequence.expect_non_string(); - -      // TODO: change this system, since we'd rather use the signature to tell -      // the parameters what to expect. -      ((SequenceType) sequence.get_type()).propose_signature_from_parameters -      ( -         parameters -      ); - -      if (!sequence.get_type().get_act_as_type().equals(SequenceType.ARCHETYPE)) -      { -         ErrorManager.handle -         ( -            new InvalidTypeException -            ( -               origin, -               sequence.get_type(), -               Collections.singleton(SequenceType.ARCHETYPE) -            ) -         ); -      } - -      RecurrentChecks.propagate_expected_types_and_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/instruction/generic/AddElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElement.java new file mode 100644 index 0000000..51296f4 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElement.java @@ -0,0 +1,146 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.meta.InstructionVisitor; +import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; + +public class AddElement extends GenericInstruction +{ +   public static Collection<String> get_aliases () +   { +      final List<String> aliases; + +      aliases = new ArrayList<String>(); + +      aliases.add("list:add_element"); +      aliases.add("list:addelement"); +      aliases.add("list:addElement"); +      aliases.add("list:add"); + +      aliases.add("set:add_element"); +      aliases.add("set:addelement"); +      aliases.add("set:addElement"); +      aliases.add("set:add"); + +      return aliases; +   } + +   public static Instruction build +   ( +      final Origin origin, +      final String alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   { +      final Computation element; +      final Computation collection; + +      if (call_parameters.size() != 2) +      { +         // TODO: Error. +         System.err.print +         ( +            "[E] Wrong number of arguments at " +            + origin.toString() +         ); + +         return null; +      } + +      element = call_parameters.get(0); +      collection = call_parameters.get(1); + +      if (alias.startsWith("set:")) +      { +         RecurrentChecks.propagate_expected_types_and_assert_is_a_set_of +         ( +            collection, +            element +         ); +      } +      else +      { +         RecurrentChecks.propagate_expected_types_and_assert_is_a_list_of +         ( +            collection, +            element +         ); +      } + +      collection.use_as_reference(); + +      return new AddElement(origin, element, collection); +   } + +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final Computation element; +   protected final Computation collection; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected AddElement +   ( +      final Origin origin, +      final Computation element, +      final Computation collection +   ) +   { +      super(origin); + +      this.collection = collection; +      this.element = element; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ + +   /**** Accessors ************************************************************/ +   public Computation get_collection () +   { +      return collection; +   } + +   public Computation get_element () +   { +      return element; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append("(AddElement"); +      sb.append(System.lineSeparator()); +      sb.append(System.lineSeparator()); + +      sb.append("element:"); +      sb.append(System.lineSeparator()); +      sb.append(element.toString()); +      sb.append(System.lineSeparator()); +      sb.append(System.lineSeparator()); + +      sb.append("collection:"); +      sb.append(System.lineSeparator()); +      sb.append(collection.toString()); + +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementAt.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementAt.java new file mode 100644 index 0000000..4436bea --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementAt.java @@ -0,0 +1,153 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.type.Type; + +import tonkadur.fate.v1.lang.meta.InstructionVisitor; +import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; + +public class AddElementAt extends GenericInstruction +{ +   public static Collection<String> get_aliases () +   { +      final List<String> aliases; + +      aliases = new ArrayList<String>(); + +      aliases.add("list:add_element_at"); +      aliases.add("list:addelementat"); +      aliases.add("list:addElementAt"); +      aliases.add("list:add_at"); +      aliases.add("list:addat"); +      aliases.add("list:addAt"); + +      return aliases; +   } + +   public static Instruction build +   ( +      final Origin origin, +      final String _alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   { +      final Computation index; +      final Computation element; +      final Computation collection; + +      if (call_parameters.size() != 3) +      { +         // TODO: Error. +         System.err.print +         ( +            "[E] Wrong number of arguments at " +            + origin.toString() +         ); + +         return null; +      } + +      index = call_parameters.get(0); +      element = call_parameters.get(1); +      collection = call_parameters.get(2); + +      index.expect_non_string(); +      collection.expect_non_string(); + + +      RecurrentChecks.propagate_expected_types_and_assert_is_a_list_of +      ( +         collection, +         element +      ); + +      collection.use_as_reference(); + +      return new AddElementAt(origin, index, element, collection); +   } + +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final Computation index; +   protected final Computation element; +   protected final Computation collection; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected AddElementAt +   ( +      final Origin origin, +      final Computation index, +      final Computation element, +      final Computation collection +   ) +   { +      super(origin); + +      this.index = index; +      this.collection = collection; +      this.element = element; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Accessors ************************************************************/ +   public Computation get_collection () +   { +      return collection; +   } + +   public Computation get_index () +   { +      return index; +   } + +   public Computation get_element () +   { +      return element; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append("(AddElementAt"); +      sb.append(System.lineSeparator()); +      sb.append(System.lineSeparator()); + +      sb.append("index:"); +      sb.append(System.lineSeparator()); +      sb.append(index.toString()); +      sb.append(System.lineSeparator()); +      sb.append(System.lineSeparator()); + +      sb.append("element:"); +      sb.append(System.lineSeparator()); +      sb.append(element.toString()); +      sb.append(System.lineSeparator()); +      sb.append(System.lineSeparator()); + +      sb.append("collection:"); +      sb.append(System.lineSeparator()); +      sb.append(collection.toString()); + +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementsOf.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementsOf.java new file mode 100644 index 0000000..689ae35 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementsOf.java @@ -0,0 +1,180 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.type.CollectionType; + +import tonkadur.fate.v1.lang.meta.InstructionVisitor; +import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; + +public class AddElementsOf extends GenericInstruction +{ +   public static Collection<String> get_aliases () +   { +      final List<String> aliases; + +      aliases = new ArrayList<String>(); + +      aliases.add("list:add_all"); +      aliases.add("list:addall"); +      aliases.add("list:addAll"); + +      aliases.add("list:add_all_of"); +      aliases.add("list:addallof"); +      aliases.add("list:addAllOf"); + +      aliases.add("list:add_elements"); +      aliases.add("list:addelements"); +      aliases.add("list:addElements"); + +      aliases.add("list:add_elements_of"); +      aliases.add("list:addelementsof"); +      aliases.add("list:addElementsOf"); + +      aliases.add("list:add_all_elements"); +      aliases.add("list:addallelements"); +      aliases.add("list:addAllElements"); + +      aliases.add("list:add_all_elements_of"); +      aliases.add("list:addallelementsof"); +      aliases.add("list:addAllElementsOf"); + +      aliases.add("set:add_all"); +      aliases.add("set:addall"); +      aliases.add("set:addAll"); + +      aliases.add("set:add_all_of"); +      aliases.add("set:addallof"); +      aliases.add("set:addAllOf"); + +      aliases.add("set:add_elements"); +      aliases.add("set:addelements"); +      aliases.add("set:addElements"); + +      aliases.add("set:add_elements_of"); +      aliases.add("set:addelementsof"); +      aliases.add("set:addElementsOf"); + +      aliases.add("set:add_all_elements"); +      aliases.add("set:addallelements"); +      aliases.add("set:addAllElements"); + +      aliases.add("set:add_all_elements_of"); +      aliases.add("set:addallelementsof"); +      aliases.add("set:addAllElementsOf"); + +      return aliases; +   } + +   public static Instruction build +   ( +      final Origin origin, +      final String alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   { +      final Computation other_collection; +      final Computation collection; + +      if (call_parameters.size() != 2) +      { +         // TODO: Error. +         System.err.print +         ( +            "[E] Wrong number of arguments at " +            + origin.toString() +         ); + +         return null; +      } + +      other_collection = call_parameters.get(0); +      collection = call_parameters.get(1); + +      other_collection.expect_non_string(); +      collection.expect_non_string(); + +      RecurrentChecks.assert_is_a_collection(collection); +      RecurrentChecks.assert_is_a_collection(other_collection); +      RecurrentChecks.assert_can_be_used_as +      ( +         other_collection.get_origin(), +         ((CollectionType) other_collection.get_type()).get_content_type(), +         ((CollectionType) collection.get_type()).get_content_type() +      ); + +      collection.use_as_reference(); + +      return new AddElementsOf(origin, other_collection, collection); +   } + +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final Computation other_collection; +   protected final Computation collection; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected AddElementsOf +   ( +      final Origin origin, +      final Computation other_collection, +      final Computation collection +   ) +   { +      super(origin); + +      this.collection = collection; +      this.other_collection = other_collection; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Accessors ************************************************************/ +   public Computation get_source_collection () +   { +      return other_collection; +   } + +   public Computation get_target_collection () +   { +      return collection; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append("(AddElementsOf"); +      sb.append(System.lineSeparator()); +      sb.append(System.lineSeparator()); + +      sb.append("other_collection:"); +      sb.append(System.lineSeparator()); +      sb.append(other_collection.toString()); +      sb.append(System.lineSeparator()); +      sb.append(System.lineSeparator()); + +      sb.append("collection:"); +      sb.append(System.lineSeparator()); +      sb.append(collection.toString()); + +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Allocate.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Allocate.java index feaf65b..6d42e94 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Allocate.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Allocate.java @@ -36,7 +36,7 @@ public class Allocate extends GenericInstruction        return aliases;     } -   public static GenericInstruction build +   public static Instruction build     (        final Origin origin,        final String _alias, @@ -65,6 +65,8 @@ public class Allocate extends GenericInstruction        target_type = target.get_type(); +      target.use_as_reference(); +        if (target_type instanceof PointerType)        {           return @@ -89,6 +91,7 @@ public class Allocate extends GenericInstruction           )        ); +        return new Allocate(origin, Type.ANY, target);     } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Break.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Break.java index 653061d..dd26d0e 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Break.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Break.java @@ -1,12 +1,40 @@ -package tonkadur.fate.v1.lang.instruction; +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List;  import tonkadur.parser.Origin;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Instruction; -public class Break extends Instruction +public class Break extends GenericInstruction  { +   public static Collection<String> get_aliases () +   { +      final List<String> aliases; + +      aliases = new ArrayList<String>(); + +      aliases.add("list:add_element_at"); +      aliases.add("list:addelementat"); +      aliases.add("list:addElementAt"); +      aliases.add("list:add_at"); +      aliases.add("list:addat"); +      aliases.add("list:addAt"); + +      return aliases; +   } + +   public static Instruction build +   ( +      final Origin origin, +      final String _alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   {     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Clear.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Clear.java index 12da2cb..f228174 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Clear.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Clear.java @@ -32,7 +32,7 @@ public class Clear extends GenericInstruction        return aliases;     } -   public static GenericInstruction build +   public static Instruction build     (        final Origin origin,        final String alias_, diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Done.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Done.java index ada3b7c..ec21eec 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Done.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Done.java @@ -1,12 +1,40 @@ -package tonkadur.fate.v1.lang.instruction; +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List;  import tonkadur.parser.Origin;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Instruction; -public class Done extends Instruction +public class Done extends GenericInstruction  { +   public static Collection<String> get_aliases () +   { +      final List<String> aliases; + +      aliases = new ArrayList<String>(); + +      aliases.add("list:add_element_at"); +      aliases.add("list:addelementat"); +      aliases.add("list:addElementAt"); +      aliases.add("list:add_at"); +      aliases.add("list:addat"); +      aliases.add("list:addAt"); + +      return aliases; +   } + +   public static Instruction build +   ( +      final Origin origin, +      final String _alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   {     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/End.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/End.java index e39f435..762f0ba 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/End.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/End.java @@ -1,12 +1,40 @@ -package tonkadur.fate.v1.lang.instruction; +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List;  import tonkadur.parser.Origin;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Instruction; -public class End extends Instruction +public class End extends GenericInstruction  { +   public static Collection<String> get_aliases () +   { +      final List<String> aliases; + +      aliases = new ArrayList<String>(); + +      aliases.add("list:add_element_at"); +      aliases.add("list:addelementat"); +      aliases.add("list:addElementAt"); +      aliases.add("list:add_at"); +      aliases.add("list:addat"); +      aliases.add("list:addAt"); + +      return aliases; +   } + +   public static Instruction build +   ( +      final Origin origin, +      final String _alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   {     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Filter.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Filter.java new file mode 100644 index 0000000..a86be76 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Filter.java @@ -0,0 +1,141 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import java.util.Collections; +import java.util.List; +import java.util.ArrayList; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.type.Type; +import tonkadur.fate.v1.lang.type.LambdaType; +import tonkadur.fate.v1.lang.type.CollectionType; + +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; + +public class Filter extends GenericInstruction +{ +   public static Collection<String> get_aliases () +   { +      final List<String> aliases; + +      aliases = new ArrayList<String>(); + +      aliases.add("list:filter"); +      aliases.add("set:filter"); + +      return aliases; +   } + +   public static Instruction build +   ( +      final Origin origin, +      final String _alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   { +      // TODO: implement +      final Computation lambda_function = null; +      final Computation collection = null; +      final List<Computation> extra_params = null; +      final List<Type> target_signature; + +      target_signature = new ArrayList<Type>(); + +      RecurrentChecks.assert_is_a_collection(collection); + +      target_signature.add +      ( +         ((CollectionType) collection.get_type()).get_content_type() +      ); + +      for (final Computation c: extra_params) +      { +         target_signature.add(c.get_type()); +      } +      RecurrentChecks.assert_lambda_matches_types +      ( +         lambda_function, +         Type.BOOL, +         target_signature +      ); + +      return new Filter(origin, lambda_function, collection, extra_params); + +   } + +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final List<Computation> extra_params; +   protected final Computation lambda_function; +   protected final Computation collection; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected Filter +   ( +      final Origin origin, +      final Computation lambda_function, +      final Computation collection, +      final List<Computation> extra_params +   ) +   { +      super(origin); + +      this.lambda_function = lambda_function; +      this.collection = collection; +      this.extra_params = extra_params; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Accessors ************************************************************/ +   public Computation get_lambda_function () +   { +      return lambda_function; +   } + +   public Computation get_collection () +   { +      return collection; +   } + +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append("(Filter "); +      sb.append(lambda_function.toString()); +      sb.append(" "); +      sb.append(collection.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } + +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Free.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Free.java index 4fd8241..799c47d 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Free.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Free.java @@ -32,7 +32,7 @@ public class Free extends GenericInstruction        return aliases;     } -   public static GenericInstruction build +   public static Instruction build     (        final Origin origin,        final String alias_, diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedFilter.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedFilter.java new file mode 100644 index 0000000..7477df1 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedFilter.java @@ -0,0 +1,160 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import java.util.Collections; +import java.util.List; +import java.util.ArrayList; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.type.Type; +import tonkadur.fate.v1.lang.type.LambdaType; +import tonkadur.fate.v1.lang.type.CollectionType; + +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.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; + +public class IndexedFilter extends GenericInstruction +{ +   public static Collection<String> get_aliases () +   { +      final List<String> aliases; + +      aliases = new ArrayList<String>(); + +      aliases.add("list:add_element_at"); +      aliases.add("list:addelementat"); +      aliases.add("list:addElementAt"); +      aliases.add("list:add_at"); +      aliases.add("list:addat"); +      aliases.add("list:addAt"); + +      return aliases; +   } + +   public static Instruction build +   ( +      final Origin origin, +      final String _alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   { +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final List<Computation> extra_params; +   protected final Computation lambda_function; +   protected final Computation collection; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected IndexedFilter +   ( +      final Origin origin, +      final Computation lambda_function, +      final Computation collection, +      final List<Computation> extra_params +   ) +   { +      super(origin); + +      this.lambda_function = lambda_function; +      this.collection = collection; +      this.extra_params = extra_params; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   public static IndexedFilter build +   ( +      final Origin origin, +      final Computation lambda_function, +      final Computation collection, +      final List<Computation> extra_params +   ) +   throws ParsingError +   { +      final List<Type> target_signature; + +      target_signature = new ArrayList<Type>(); + +      RecurrentChecks.assert_is_a_collection(collection); + +      target_signature.add(Type.INT); +      target_signature.add +      ( +         ((CollectionType) collection.get_type()).get_content_type() +      ); + +      for (final Computation c: extra_params) +      { +         target_signature.add(c.get_type()); +      } + +      RecurrentChecks.assert_lambda_matches_types +      ( +         lambda_function, +         Type.BOOL, +         target_signature +      ); + +      return new IndexedFilter(origin, lambda_function, collection, extra_params); +   } + +   /**** Accessors ************************************************************/ +   @Override +   public void get_visited_by (final InstructionVisitor iv) +   throws Throwable +   { +      iv.visit_indexed_filter(this); +   } + +   public Computation get_lambda_function () +   { +      return lambda_function; +   } + +   public Computation get_collection () +   { +      return collection; +   } + +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append("(IndexedFilter "); +      sb.append(lambda_function.toString()); +      sb.append(" "); +      sb.append(collection.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } + +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedMap.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedMap.java new file mode 100644 index 0000000..bbb0188 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedMap.java @@ -0,0 +1,158 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import java.util.ArrayList; +import java.util.List; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.type.Type; +import tonkadur.fate.v1.lang.type.CollectionType; + +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.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; + +public class IndexedMap extends GenericInstruction +{ +   public static Collection<String> get_aliases () +   { +      final List<String> aliases; + +      aliases = new ArrayList<String>(); + +      aliases.add("list:add_element_at"); +      aliases.add("list:addelementat"); +      aliases.add("list:addElementAt"); +      aliases.add("list:add_at"); +      aliases.add("list:addat"); +      aliases.add("list:addAt"); + +      return aliases; +   } + +   public static Instruction build +   ( +      final Origin origin, +      final String _alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   { +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final List<Computation> extra_params; +   protected final Computation lambda_function; +   protected final Computation collection; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected IndexedMap +   ( +      final Origin origin, +      final Computation lambda_function, +      final Computation collection, +      final List<Computation> extra_params +   ) +   { +      super(origin); + +      this.lambda_function = lambda_function; +      this.collection = collection; +      this.extra_params = extra_params; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   public static IndexedMap build +   ( +      final Origin origin, +      final Computation lambda_function, +      final Computation collection, +      final List<Computation> extra_params +   ) +   throws Throwable +   { +      final List<Type> in_types; + +      in_types = new ArrayList<Type>(); + +      RecurrentChecks.assert_is_a_collection(collection); + +      in_types.add(Type.INT); +      in_types.add +      ( +         ((CollectionType) collection.get_type()).get_content_type() +      ); + +      for (final Computation c: extra_params) +      { +         in_types.add(c.get_type()); +      } + +      RecurrentChecks.assert_lambda_matches_types +      ( +         lambda_function, +         ((CollectionType) collection.get_type()).get_content_type(), +         in_types +      ); + +      return new IndexedMap(origin, lambda_function, collection, extra_params); +   } + +   /**** Accessors ************************************************************/ +   @Override +   public void get_visited_by (final InstructionVisitor iv) +   throws Throwable +   { +      iv.visit_indexed_map(this); +   } + +   public Computation get_lambda_function () +   { +      return lambda_function; +   } + +   public Computation get_collection () +   { +      return collection; +   } + +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append("(IndexedMap "); +      sb.append(lambda_function.toString()); +      sb.append(" "); +      sb.append(collection.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } + +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedMerge.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedMerge.java new file mode 100644 index 0000000..f2bab19 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedMerge.java @@ -0,0 +1,244 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import java.util.ArrayList; +import java.util.List; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.type.Type; +import tonkadur.fate.v1.lang.type.CollectionType; + +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.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; + +public class IndexedMerge extends GenericInstruction +{ +   public static Collection<String> get_aliases () +   { +      final List<String> aliases; + +      aliases = new ArrayList<String>(); + +      aliases.add("list:add_element_at"); +      aliases.add("list:addelementat"); +      aliases.add("list:addElementAt"); +      aliases.add("list:add_at"); +      aliases.add("list:addat"); +      aliases.add("list:addAt"); + +      return aliases; +   } + +   public static Instruction build +   ( +      final Origin origin, +      final String _alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   { +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final List<Computation> extra_params; +   protected final Computation lambda_function; +   protected final Computation collection; +   protected final Computation default_a; +   protected final Computation collection_in_b; +   protected final Computation default_b; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected IndexedMerge +   ( +      final Origin origin, +      final Computation lambda_function, +      final Computation collection_in_b, +      final Computation default_b, +      final Computation collection, +      final Computation default_a, +      final List<Computation> extra_params +   ) +   { +      super(origin); + +      this.lambda_function = lambda_function; +      this.collection = collection; +      this.default_a = default_a; +      this.collection_in_b = collection_in_b; +      this.default_b = default_b; +      this.extra_params = extra_params; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   public static IndexedMerge build +   ( +      final Origin origin, +      final Computation lambda_function, +      final Computation collection_in_b, +      final Computation default_b, +      final Computation collection, +      final Computation default_a, +      final List<Computation> extra_params +   ) +   throws Throwable +   { +      final List<Type> types_in; + +      types_in = new ArrayList<Type>(); + +      if (default_a == null) +      { +         RecurrentChecks.assert_is_a_collection(collection); +      } +      else +      { +         RecurrentChecks.assert_is_a_collection_of(collection, default_a); +      } + +      if (default_b == null) +      { +         RecurrentChecks.assert_is_a_collection(collection_in_b); +      } +      else +      { +         RecurrentChecks.assert_is_a_collection_of(collection_in_b, default_b); +      } + +      types_in.add(Type.INT); +      types_in.add +      ( +         ((CollectionType) collection.get_type()).get_content_type() +      ); + +      if (default_b != null) +      { +         types_in.add(Type.INT); +      } + +      types_in.add +      ( +         ((CollectionType) collection_in_b.get_type()).get_content_type() +      ); + +      for (final Computation c: extra_params) +      { +         types_in.add(c.get_type()); +      } + +      RecurrentChecks.assert_lambda_matches_types +      ( +         lambda_function, +         ((CollectionType) collection.get_type()).get_content_type(), +         types_in +      ); + +      return +         new IndexedMerge +         ( +            origin, +            lambda_function, +            collection_in_b, +            default_b, +            collection, +            default_a, +            extra_params +         ); +   } + +   /**** Accessors ************************************************************/ +   @Override +   public void get_visited_by (final InstructionVisitor iv) +   throws Throwable +   { +      iv.visit_indexed_merge(this); +   } + +   public Computation get_lambda_function () +   { +      return lambda_function; +   } + +   public Computation get_main_default () +   { +      return default_a; +   } + +   public Computation get_secondary_collection () +   { +      return collection_in_b; +   } + +   public Computation get_secondary_default () +   { +      return default_b; +   } + +   public Computation get_main_collection () +   { +      return collection; +   } + +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append("(IndexedMerge "); +      sb.append(lambda_function.toString()); +      sb.append(" "); +      sb.append(collection.toString()); +      sb.append(" "); + +      if (default_a == null) +      { +         sb.append("null"); +      } +      else +      { +         sb.append(default_a.toString()); +      } + +      sb.append(" "); +      sb.append(collection_in_b.toString()); +      sb.append(" "); + +      if (default_b == null) +      { +         sb.append("null"); +      } +      else +      { +         sb.append(default_b.toString()); +      } + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } + +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedPartition.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedPartition.java new file mode 100644 index 0000000..aa049ca --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedPartition.java @@ -0,0 +1,184 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import java.util.Collections; +import java.util.List; +import java.util.ArrayList; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.type.Type; +import tonkadur.fate.v1.lang.type.CollectionType; + +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.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; + +public class IndexedPartition extends GenericInstruction +{ +   public static Collection<String> get_aliases () +   { +      final List<String> aliases; + +      aliases = new ArrayList<String>(); + +      aliases.add("list:add_element_at"); +      aliases.add("list:addelementat"); +      aliases.add("list:addElementAt"); +      aliases.add("list:add_at"); +      aliases.add("list:addat"); +      aliases.add("list:addAt"); + +      return aliases; +   } + +   public static Instruction build +   ( +      final Origin origin, +      final String _alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   { +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final List<Computation> extra_params; +   protected final Computation lambda_function; +   protected final Computation collection_in; +   protected final Computation collection_out; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected IndexedPartition +   ( +      final Origin origin, +      final Computation lambda_function, +      final Computation collection_in, +      final Computation collection_out, +      final List<Computation> extra_params +   ) +   { +      super(origin); + +      this.lambda_function = lambda_function; +      this.collection_in = collection_in; +      this.collection_out = collection_out; +      this.extra_params = extra_params; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   public static IndexedPartition build +   ( +      final Origin origin, +      final Computation lambda_function, +      final Computation collection_in, +      final Computation collection_out, +      final List<Computation> extra_params +   ) +   throws ParsingError +   { +      final List<Type> target_signature; + +      target_signature = new ArrayList<Type>(); + +      RecurrentChecks.assert_is_a_collection(collection_in); +      RecurrentChecks.assert_is_a_collection(collection_out); +      RecurrentChecks.assert_can_be_used_as +      ( +         collection_in, +         collection_out.get_type() +      ); + +      target_signature.add(Type.INT); +      target_signature.add +      ( +         ((CollectionType) collection_in.get_type()).get_content_type() +      ); + +      for (final Computation c: extra_params) +      { +         target_signature.add(c.get_type()); +      } + +      RecurrentChecks.assert_lambda_matches_types +      ( +         lambda_function, +         Type.BOOL, +         target_signature +      ); + +      return +         new IndexedPartition +         ( +            origin, +            lambda_function, +            collection_in, +            collection_out, +            extra_params +         ); +   } + +   /**** Accessors ************************************************************/ +   @Override +   public void get_visited_by (final InstructionVisitor iv) +   throws Throwable +   { +      iv.visit_indexed_partition(this); +   } + +   public Computation get_lambda_function () +   { +      return lambda_function; +   } + +   public Computation get_collection_in () +   { +      return collection_in; +   } + +   public Computation get_collection_out () +   { +      return collection_out; +   } + +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append("(IndexedPartition "); +      sb.append(lambda_function.toString()); +      sb.append(" "); +      sb.append(collection_in.toString()); +      sb.append(" "); +      sb.append(collection_out.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } + +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Map.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Map.java new file mode 100644 index 0000000..067b161 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Map.java @@ -0,0 +1,158 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import java.util.Collections; +import java.util.List; +import java.util.ArrayList; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.type.Type; +import tonkadur.fate.v1.lang.type.CollectionType; + +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.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; + +public class Map extends GenericInstruction +{ +   public static Collection<String> get_aliases () +   { +      final List<String> aliases; + +      aliases = new ArrayList<String>(); + +      aliases.add("list:add_element_at"); +      aliases.add("list:addelementat"); +      aliases.add("list:addElementAt"); +      aliases.add("list:add_at"); +      aliases.add("list:addat"); +      aliases.add("list:addAt"); + +      return aliases; +   } + +   public static Instruction build +   ( +      final Origin origin, +      final String _alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   { +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final List<Computation> extra_params; +   protected final Computation lambda_function; +   protected final Computation collection; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected Map +   ( +      final Origin origin, +      final Computation lambda_function, +      final Computation collection, +      final List<Computation> extra_params +   ) +   { +      super(origin); + +      this.lambda_function = lambda_function; +      this.collection = collection; +      this.extra_params = extra_params; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   public static Map build +   ( +      final Origin origin, +      final Computation lambda_function, +      final Computation collection, +      final List<Computation> extra_params +   ) +   throws ParsingError +   { +      final List<Type> target_signature; + +      target_signature = new ArrayList<Type>(); + +      RecurrentChecks.assert_is_a_collection(collection); + +      target_signature.add +      ( +         ((CollectionType) collection.get_type()).get_content_type() +      ); + +      for (final Computation c: extra_params) +      { +         target_signature.add(c.get_type()); +      } + +      RecurrentChecks.assert_lambda_matches_types +      ( +         lambda_function, +         ((CollectionType) collection.get_type()).get_content_type(), +         target_signature +      ); + +      return new Map(origin, lambda_function, collection, extra_params); +   } + +   /**** Accessors ************************************************************/ +   @Override +   public void get_visited_by (final InstructionVisitor iv) +   throws Throwable +   { +      iv.visit_map(this); +   } + +   public Computation get_lambda_function () +   { +      return lambda_function; +   } + +   public Computation get_collection () +   { +      return collection; +   } + +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append("(Map "); +      sb.append(lambda_function.toString()); +      sb.append(" "); +      sb.append(collection.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } + +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Merge.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Merge.java new file mode 100644 index 0000000..ddfe4b7 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Merge.java @@ -0,0 +1,238 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import java.util.ArrayList; +import java.util.List; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.type.Type; +import tonkadur.fate.v1.lang.type.CollectionType; + +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.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; + +public class Merge extends GenericInstruction +{ +   public static Collection<String> get_aliases () +   { +      final List<String> aliases; + +      aliases = new ArrayList<String>(); + +      aliases.add("list:add_element_at"); +      aliases.add("list:addelementat"); +      aliases.add("list:addElementAt"); +      aliases.add("list:add_at"); +      aliases.add("list:addat"); +      aliases.add("list:addAt"); + +      return aliases; +   } + +   public static Instruction build +   ( +      final Origin origin, +      final String _alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   { +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final List<Computation> extra_params; +   protected final Computation lambda_function; +   protected final Computation collection; +   protected final Computation default_a; +   protected final Computation collection_in_b; +   protected final Computation default_b; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected Merge +   ( +      final Origin origin, +      final Computation lambda_function, +      final Computation collection_in_b, +      final Computation default_b, +      final Computation collection, +      final Computation default_a, +      final List<Computation> extra_params +   ) +   { +      super(origin); + +      this.lambda_function = lambda_function; +      this.collection = collection; +      this.default_a = default_a; +      this.collection_in_b = collection_in_b; +      this.default_b = default_b; +      this.extra_params = extra_params; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   public static Merge build +   ( +      final Origin origin, +      final Computation lambda_function, +      final Computation collection_in_b, +      final Computation default_b, +      final Computation collection, +      final Computation default_a, +      final List<Computation> extra_params +   ) +   throws Throwable +   { +      final List<Type> types_in; + +      types_in = new ArrayList<Type>(); + +      if (default_a == null) +      { +         RecurrentChecks.assert_is_a_collection(collection); +      } +      else +      { +         RecurrentChecks.assert_is_a_collection_of(collection, default_a); +      } + +      if (default_b == null) +      { +         RecurrentChecks.assert_is_a_collection(collection_in_b); +      } +      else +      { +         RecurrentChecks.assert_is_a_collection_of(collection_in_b, default_b); +      } + +      types_in.add +      ( +         ((CollectionType) collection.get_type()).get_content_type() +      ); + +      types_in.add +      ( +         ((CollectionType) collection_in_b.get_type()).get_content_type() +      ); + +      for (final Computation c: extra_params) +      { +         types_in.add(c.get_type()); +      } + +      RecurrentChecks.assert_lambda_matches_types +      ( +         lambda_function, +         ((CollectionType) collection.get_type()).get_content_type(), +         types_in +      ); + +      return +         new Merge +         ( +            origin, +            lambda_function, +            collection_in_b, +            default_b, +            collection, +            default_a, +            extra_params +         ); +   } + +   /**** Accessors ************************************************************/ +   @Override +   public void get_visited_by (final InstructionVisitor iv) +   throws Throwable +   { +      iv.visit_merge(this); +   } + +   public Computation get_lambda_function () +   { +      return lambda_function; +   } + +   public Computation get_main_default () +   { +      return default_a; +   } + +   public Computation get_secondary_collection () +   { +      return collection_in_b; +   } + +   public Computation get_secondary_default () +   { +      return default_b; +   } + +   public Computation get_main_collection () +   { +      return collection; +   } + +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append("(Merge "); +      sb.append(lambda_function.toString()); +      sb.append(" "); +      sb.append(collection.toString()); +      sb.append(" "); + +      if (default_a == null) +      { +         sb.append("null"); +      } +      else +      { +         sb.append(default_a.toString()); +      } + +      sb.append(" "); +      sb.append(collection_in_b.toString()); +      sb.append(" "); + +      if (default_b == null) +      { +         sb.append("null"); +      } +      else +      { +         sb.append(default_b.toString()); +      } + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } + +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Partition.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Partition.java new file mode 100644 index 0000000..be4b733 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Partition.java @@ -0,0 +1,183 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import java.util.Collections; +import java.util.List; +import java.util.ArrayList; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.type.Type; +import tonkadur.fate.v1.lang.type.CollectionType; + +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.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; + +public class Partition extends GenericInstruction +{ +   public static Collection<String> get_aliases () +   { +      final List<String> aliases; + +      aliases = new ArrayList<String>(); + +      aliases.add("list:add_element_at"); +      aliases.add("list:addelementat"); +      aliases.add("list:addElementAt"); +      aliases.add("list:add_at"); +      aliases.add("list:addat"); +      aliases.add("list:addAt"); + +      return aliases; +   } + +   public static Instruction build +   ( +      final Origin origin, +      final String _alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   { +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final List<Computation> extra_params; +   protected final Computation lambda_function; +   protected final Computation collection_in; +   protected final Computation collection_out; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected Partition +   ( +      final Origin origin, +      final Computation lambda_function, +      final Computation collection_in, +      final Computation collection_out, +      final List<Computation> extra_params +   ) +   { +      super(origin); + +      this.lambda_function = lambda_function; +      this.collection_in = collection_in; +      this.collection_out = collection_out; +      this.extra_params = extra_params; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   public static Partition build +   ( +      final Origin origin, +      final Computation lambda_function, +      final Computation collection_in, +      final Computation collection_out, +      final List<Computation> extra_params +   ) +   throws ParsingError +   { +      final List<Type> target_signature; + +      target_signature = new ArrayList<Type>(); + +      RecurrentChecks.assert_is_a_collection(collection_in); +      RecurrentChecks.assert_is_a_collection(collection_out); +      RecurrentChecks.assert_can_be_used_as +      ( +         collection_in, +         collection_out.get_type() +      ); + +      target_signature.add +      ( +         ((CollectionType) collection_in.get_type()).get_content_type() +      ); + +      for (final Computation c: extra_params) +      { +         target_signature.add(c.get_type()); +      } + +      RecurrentChecks.assert_lambda_matches_types +      ( +         lambda_function, +         Type.BOOL, +         target_signature +      ); + +      return +         new Partition +         ( +            origin, +            lambda_function, +            collection_in, +            collection_out, +            extra_params +         ); +   } + +   /**** Accessors ************************************************************/ +   @Override +   public void get_visited_by (final InstructionVisitor iv) +   throws Throwable +   { +      iv.visit_partition(this); +   } + +   public Computation get_lambda_function () +   { +      return lambda_function; +   } + +   public Computation get_collection_in () +   { +      return collection_in; +   } + +   public Computation get_collection_out () +   { +      return collection_out; +   } + +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append("(Partition "); +      sb.append(lambda_function.toString()); +      sb.append(" "); +      sb.append(collection_in.toString()); +      sb.append(" "); +      sb.append(collection_out.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } + +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/PopElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/PopElement.java new file mode 100644 index 0000000..2f16762 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/PopElement.java @@ -0,0 +1,166 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.type.PointerType; +import tonkadur.fate.v1.lang.type.CollectionType; + +import tonkadur.fate.v1.lang.meta.InstructionVisitor; +import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; + +public class PopElement extends GenericInstruction +{ +   public static Collection<String> get_aliases () +   { +      final List<String> aliases; + +      aliases = new ArrayList<String>(); + +      aliases.add("list:popleft"); +      aliases.add("list:pop_left"); +      aliases.add("list:popLeft"); +      aliases.add("list:popleftelement"); +      aliases.add("list:pop_left_element"); +      aliases.add("list:popLeftElement"); +      aliases.add("list:popright"); +      aliases.add("list:pop_right"); +      aliases.add("list:popRight"); +      aliases.add("list:poprightelement"); +      aliases.add("list:pop_right_element"); +      aliases.add("list:popRightElement"); +      aliases.add("set:popleft"); +      aliases.add("set:pop_left"); +      aliases.add("set:popLeft"); +      aliases.add("set:popleftelement"); +      aliases.add("set:pop_left_element"); +      aliases.add("set:popLeftElement"); +      aliases.add("set:popright"); +      aliases.add("set:pop_right"); +      aliases.add("set:popRight"); +      aliases.add("set:poprightelement"); +      aliases.add("set:pop_right_element"); +      aliases.add("set:popRightElement"); + +      return aliases; +   } + +   public static Instruction build +   ( +      final Origin origin, +      final String _alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   { +      final Computation storage; +      final Computation collection; +      final boolean is_from_left; + +      if (call_parameters.size() != 2) +      { +         // TODO: Error. +         System.err.println("Wrong number of params at " + origin.toString()); + +         return null; +      } + +      collection = call_parameters.get(0); +      storage = call_parameters.get(1); + +      collection.expect_non_string(); +      storage.expect_non_string(); + +      is_from_left = alias.contains("eft"); + +      if (alias.startsWith("set:")) +      { +         RecurrentChecks.assert_is_a_set_of(collection, storage.get_type()); +      } +      else +      { +         RecurrentChecks.assert_is_a_list_of(collection, storage.get_type()); +      } + +      collection.use_as_reference(); +      storage.use_as_reference(); + +      return new PopElement(origin, storage, collection, is_from_left); +   } + +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final Computation storage_ptr; +   protected final Computation collection; +   protected final boolean is_from_left; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected PopElement +   ( +      final Origin origin, +      final Computation collection, +      final boolean is_from_left +   ) +   { +      super(origin); + +      this.storage_ptr = storage_ptr; +      this.collection = collection; +      this.is_from_left = is_from_left; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ + +   /**** Accessors ************************************************************/ +   public Computation get_collection () +   { +      return collection; +   } + +   public Computation get_storage () +   { +      return storage; +   } + +   public boolean is_from_left () +   { +      return is_from_left; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      if (is_from_left) +      { +         sb.append("(PopLeftElement "); +      } +      else +      { +         sb.append("(PopRightElement "); +      } + +      sb.append(collection.toString()); + +      sb.append(" "); +      sb.append(storage.toString()); +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/PushElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/PushElement.java new file mode 100644 index 0000000..b4c5a29 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/PushElement.java @@ -0,0 +1,162 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.meta.InstructionVisitor; +import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; + +public class PushElement extends GenericInstruction +{ +   public static Collection<String> get_aliases () +   { +      final List<String> aliases; + +      aliases = new ArrayList<String>(); + +      aliases.add("list:push_left"); +      aliases.add("list:pushleft"); +      aliases.add("list:pushLeft"); +      aliases.add("list:push_right"); +      aliases.add("list:pushright"); +      aliases.add("list:pushRight"); +      aliases.add("set:push_left"); +      aliases.add("set:pushleft"); +      aliases.add("set:pushLeft"); +      aliases.add("set:push_right"); +      aliases.add("set:pushright"); +      aliases.add("set:pushRight"); + +      return aliases; +   } + +   public static Instruction build +   ( +      final Origin origin, +      final String alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   { +      final Computation element; +      final Computation collection; +      final boolean is_from_left; + +      if (call_parameters.size() != 2) +      { +         // TODO: Error. +         System.err.println("Wrong number of params at " + origin.toString()); + +         return null; +      } + +      collection = call_parameters.get(0); +      element = call_parameters.get(1); +      is_from_left = alias.endsWith("eft"); + +      if (alias.startsWith("set:")) +      { +         RecurrentChecks.propagate_expected_types_and_assert_is_a_set_of +         ( +            collection, +            element +         ); +      } +      else +      { +         RecurrentChecks.propagate_expected_types_and_assert_is_a_list_of +         ( +            collection, +            element +         ); +      } + +      collection.use_as_reference(); + +      return new PushElement(origin, element, collection, is_from_left); +   } + +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final Computation element; +   protected final Computation collection; +   protected final boolean is_from_left; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected PushElement +   ( +      final Origin origin, +      final Computation element, +      final Computation collection, +      final boolean is_from_left +   ) +   { +      super(origin); + +      this.collection = collection; +      this.element = element; +      this.is_from_left = is_from_left; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Accessors ************************************************************/ +   public Computation get_collection () +   { +      return collection; +   } + +   public Computation get_element () +   { +      return element; +   } + +   public boolean  is_from_left () +   { +      return is_from_left; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      if (is_from_left) +      { +         sb.append("(LeftPushElement"); +      } +      else +      { +         sb.append("(RightPushElement"); +      } + +      sb.append(System.lineSeparator()); +      sb.append(System.lineSeparator()); + +      sb.append("element:"); +      sb.append(System.lineSeparator()); +      sb.append(element.toString()); +      sb.append(System.lineSeparator()); +      sb.append(System.lineSeparator()); + +      sb.append("collection:"); +      sb.append(System.lineSeparator()); +      sb.append(collection.toString()); + +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveAllOfElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveAllOfElement.java new file mode 100644 index 0000000..79d5bc1 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveAllOfElement.java @@ -0,0 +1,144 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.meta.InstructionVisitor; +import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; + +public class RemoveAllOfElement extends GenericInstruction +{ +   public static Collection<String> get_aliases () +   { +      final List<String> aliases; + +      aliases = new ArrayList<String>(); + +      aliases.add("list:remove_each"); +      aliases.add("list:removeeach"); +      aliases.add("list:removeEach"); +      aliases.add("list:remove_every"); +      aliases.add("list:removeevery"); +      aliases.add("list:removeEvery"); +      aliases.add("set:remove_each"); +      aliases.add("set:removeeach"); +      aliases.add("set:removeEach"); +      aliases.add("set:remove_every"); +      aliases.add("set:removeevery"); +      aliases.add("set:removeEvery"); + +      return aliases; +   } + +   public static Instruction build +   ( +      final Origin origin, +      final String alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   { +      final Computation element; +      final Computation collection; + +      if (call_parameters.size() != 2) +      { +         // TODO: Error. +         System.err.println("Wrong number of params at " + origin.toString()); + +         return null; +      } + +      element = call_parameters.get(0); +      collection = call_parameters.get(1); + +      if (alias.startsWith("set:")) +      { +         RecurrentChecks.propagate_expected_types_and_assert_is_a_set_of +         ( +            collection, +            element +         ); +      } +      else +      { +         RecurrentChecks.propagate_expected_types_and_assert_is_a_list_of +         ( +            collection, +            element +         ); +      } + +      collection.use_as_reference(); + +      return new RemoveAllOfElement(origin, element, collection); +   } + +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final Computation element; +   protected final Computation collection; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected RemoveAllOfElement +   ( +      final Origin origin, +      final Computation element, +      final Computation collection +   ) +   { +      super(origin); + +      this.collection = collection; +      this.element = element; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Accessors ************************************************************/ +   public Computation get_element () +   { +      return element; +   } + +   public Computation get_collection () +   { +      return collection; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append("(RemoveAllOfElement"); +      sb.append(System.lineSeparator()); +      sb.append(System.lineSeparator()); + +      sb.append("element:"); +      sb.append(System.lineSeparator()); +      sb.append(element.toString()); +      sb.append(System.lineSeparator()); +      sb.append(System.lineSeparator()); + +      sb.append("collection:"); +      sb.append(System.lineSeparator()); +      sb.append(collection.toString()); + +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElement.java new file mode 100644 index 0000000..667b489 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElement.java @@ -0,0 +1,145 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.meta.InstructionVisitor; +import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; + +public class RemoveElement extends GenericInstruction +{ +   public static Collection<String> get_aliases () +   { +      final List<String> aliases; + +      aliases = new ArrayList<String>(); + +      aliases.add("list:remove"); +      aliases.add("list:remove_one"); +      aliases.add("list:remove_once"); +      aliases.add("list:removeone"); +      aliases.add("list:removeonce"); +      aliases.add("list:removeOne"); +      aliases.add("list:removeOnce"); +      aliases.add("set:remove"); +      aliases.add("set:remove_one"); +      aliases.add("set:remove_once"); +      aliases.add("set:removeone"); +      aliases.add("set:removeonce"); +      aliases.add("set:removeOne"); +      aliases.add("set:removeOnce"); + +      return aliases; +   } + +   public static Instruction build +   ( +      final Origin origin, +      final String alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   { +      final Computation element; +      final Computation collection; + +      if (call_parameters.size() != 1) +      { +         // TODO: Error. +         System.err.println("Wrong number of params at " + origin.toString()); + +         return null; +      } + +      element = call_parameters.get(0); +      collection = call_parameters.get(1); + +      if (alias.startsWith("set:")) +      { +         RecurrentChecks.propagate_expected_types_and_assert_is_a_set_of +         ( +            collection, +            element +         ); +      } +      else +      { +         RecurrentChecks.propagate_expected_types_and_assert_is_a_list_of +         ( +            collection, +            element +         ); +      } + +      collection.use_as_reference(); + +      return new RemoveElement(origin, element, collection); +   } +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final Computation element; +   protected final Computation collection; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected RemoveElement +   ( +      final Origin origin, +      final Computation element, +      final Computation collection +   ) +   { +      super(origin); + +      this.collection = collection; +      this.element = element; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Accessors ************************************************************/ +   public Computation get_element () +   { +      return element; +   } + +   public Computation get_collection () +   { +      return collection; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append("(RemoveElement"); +      sb.append(System.lineSeparator()); +      sb.append(System.lineSeparator()); + +      sb.append("element:"); +      sb.append(System.lineSeparator()); +      sb.append(element.toString()); +      sb.append(System.lineSeparator()); +      sb.append(System.lineSeparator()); + +      sb.append("collection:"); +      sb.append(System.lineSeparator()); +      sb.append(collection.toString()); + +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementAt.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementAt.java new file mode 100644 index 0000000..a7e83e1 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementAt.java @@ -0,0 +1,137 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.type.Type; + +import tonkadur.fate.v1.lang.meta.InstructionVisitor; +import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; + +public class RemoveElementAt extends GenericInstruction +{ +   public static Collection<String> get_aliases () +   { +      final List<String> aliases; + +      aliases = new ArrayList<String>(); + +      aliases.add("list:remove_at"); +      aliases.add("list:removeat"); +      aliases.add("list:removeAt"); +      aliases.add("set:remove_at"); +      aliases.add("set:removeat"); +      aliases.add("set:removeAt"); + +      return aliases; +   } + +   public static Instruction build +   ( +      final Origin origin, +      final String alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   { +      final Computation index; +      final Computation collection; + +      if (call_parameters.size() != 2) +      { +         // TODO: Error. +         System.err.println("Wrong number of params at " + origin.toString()); + +         return null; +      } + +      index = call_parameters.get(0); +      collection = call_parameters.get(1); + +      index.expect_non_string(); +      collection.expect_non_string(); + +      if (alias.startsWith("set:")) +      { +         RecurrentChecks.assert_is_a_set(collection); +      } +      else +      { +         RecurrentChecks.assert_is_a_list(collection); +      } + +      RecurrentChecks.assert_can_be_used_as(index, Type.INT); + +      collection.use_as_reference(); + +      return new RemoveElementAt(origin, index, collection); +   } + +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final Computation index; +   protected final Computation collection; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected RemoveElementAt +   ( +      final Origin origin, +      final Computation index, +      final Computation collection +   ) +   { +      super(origin); + +      this.collection = collection; +      this.index = index; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Accessors ************************************************************/ +   public Computation get_index () +   { +      return index; +   } + +   public Computation get_collection () +   { +      return collection; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append("(RemoveElementAt"); +      sb.append(System.lineSeparator()); +      sb.append(System.lineSeparator()); + +      sb.append("index:"); +      sb.append(System.lineSeparator()); +      sb.append(index.toString()); +      sb.append(System.lineSeparator()); +      sb.append(System.lineSeparator()); + +      sb.append("collection:"); +      sb.append(System.lineSeparator()); +      sb.append(collection.toString()); + +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementsOf.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementsOf.java new file mode 100644 index 0000000..e37601d --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementsOf.java @@ -0,0 +1,150 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.type.CollectionType; + +import tonkadur.fate.v1.lang.meta.InstructionVisitor; +import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; + +public class RemoveElementsOf extends GenericInstruction +{ +   public static Collection<String> get_aliases () +   { +      final List<String> aliases; + +      aliases = new ArrayList<String>(); + +      aliases.add("list:remove_all"); +      aliases.add("list:removeall"); +      aliases.add("list:removeAll"); +      aliases.add("set:remove_all"); +      aliases.add("set:removeall"); +      aliases.add("set:removeAll"); + +      return aliases; +   } + +   public static Instruction build +   ( +      final Origin origin, +      final String alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   { +      final Computation other_collection; +      final Computation collection; + +      if (call_parameters.size() != 2) +      { +         // TODO: Error. +         System.err.print +         ( +            "[E] Wrong number of arguments at " +            + origin.toString() +         ); + +         return null; +      } + + +      other_collection = call_parameters.get(0); +      collection = call_parameters.get(1); + +      other_collection.expect_non_string(); +      collection.expect_non_string(); + +      RecurrentChecks.assert_is_a_collection(other_collection); + +      if (alias.startsWith("set:")) +      { +         RecurrentChecks.assert_is_a_set(collection); +      } +      else +      { +         RecurrentChecks.assert_is_a_list(collection); +      } + +      RecurrentChecks.assert_can_be_used_as +      ( +         other_collection.get_origin(), +         ((CollectionType) other_collection.get_type()).get_content_type(), +         ((CollectionType) collection.get_type()).get_content_type() +      ); + +      collection.use_as_reference(); + +      return new RemoveElementsOf(origin, other_collection, collection); +   } + +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final Computation other_collection; +   protected final Computation collection; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected RemoveElementsOf +   ( +      final Origin origin, +      final Computation other_collection, +      final Computation collection +   ) +   { +      super(origin); + +      this.collection = collection; +      this.other_collection = other_collection; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Accessors ************************************************************/ + +   public Computation get_source_collection () +   { +      return other_collection; +   } + +   public Computation get_target_collection () +   { +      return collection; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append("(RemoveElementsOf"); +      sb.append(System.lineSeparator()); +      sb.append(System.lineSeparator()); + +      sb.append("other_collection:"); +      sb.append(System.lineSeparator()); +      sb.append(other_collection.toString()); +      sb.append(System.lineSeparator()); +      sb.append(System.lineSeparator()); + +      sb.append("collection:"); +      sb.append(System.lineSeparator()); +      sb.append(collection.toString()); + +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/ReverseList.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/ReverseList.java new file mode 100644 index 0000000..3281c5e --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/ReverseList.java @@ -0,0 +1,111 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.meta.InstructionVisitor; +import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; + +public class ReverseList extends GenericInstruction +{ +   public static Collection<String> get_aliases () +   { +      final List<String> aliases; + +      aliases = new ArrayList<String>(); + +      aliases.add("list:reverse"); +      aliases.add("set:reverse"); + +      return aliases; +   } + +   public static Instruction build +   ( +      final Origin origin, +      final String alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   { +      final Computation collection; + +      if (call_parameters.size() != 1) +      { +         // TODO: Error. +         System.err.print +         ( +            "[E] Wrong number of arguments at " +            + origin.toString() +         ); + +         return null; +      } + +      collection = call_parameters.get(0); + +      collection.expect_non_string(); + +      if (alias.startsWith("set:")) +      { +         RecurrentChecks.assert_is_a_set(collection); +      } +      else +      { +         RecurrentChecks.assert_is_a_list(collection); +      } + +      collection.use_as_reference(); + +      return new ReverseList(origin, collection); +   } + +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final Computation collection; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected ReverseList +   ( +      final Origin origin, +      final Computation collection +   ) +   { +      super(origin); + +      this.collection = collection; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Accessors ************************************************************/ +   public Computation get_collection () +   { +      return collection; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append("(ReverseList "); +      sb.append(collection.toString()); + +      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/generic/SequenceVariableCall.java index 7fb0d1c..f09dcdd 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableCall.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SequenceVariableCall.java @@ -1,5 +1,7 @@ -package tonkadur.fate.v1.lang.instruction; +package tonkadur.fate.v1.lang.instruction.generic; +import java.util.ArrayList; +import java.util.Collection;  import java.util.Collections;  import java.util.List; @@ -18,43 +20,60 @@ 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 +public class SequenceVariableCall extends GenericInstruction  { -   /***************************************************************************/ -   /**** MEMBERS **************************************************************/ -   /***************************************************************************/ -   protected final List<Computation> parameters; -   protected final Computation sequence; - -   /***************************************************************************/ -   /**** PROTECTED ************************************************************/ -   /***************************************************************************/ -   /**** Constructors *********************************************************/ -   protected SequenceVariableCall -   ( -      final Origin origin, -      final Computation sequence, -      final List<Computation> parameters -   ) +   public static Collection<String> get_aliases ()     { -      super(origin); - -      this.sequence = sequence; -      this.parameters = parameters; +      // ISSUE: how can the parser distinguish these from (call! <STRING>) +      final List<String> aliases; + +      aliases = new ArrayList<String>(); + +      aliases.add("call"); +      aliases.add("call_sequence"); +      aliases.add("call_procedure"); +      aliases.add("call_seq"); +      aliases.add("call_proc"); +      aliases.add("callsequence"); +      aliases.add("callprocedure"); +      aliases.add("callseq"); +      aliases.add("callproc"); +      aliases.add("callSequence"); +      aliases.add("callProcedure"); +      aliases.add("callSeq"); +      aliases.add("callProc"); +      aliases.add("visit"); +      aliases.add("visit_sequence"); +      aliases.add("visit_procedure"); +      aliases.add("visit_seq"); +      aliases.add("visit_proc"); +      aliases.add("visitsequence"); +      aliases.add("visitprocedure"); +      aliases.add("visitseq"); +      aliases.add("visitproc"); +      aliases.add("visitSequence"); +      aliases.add("visitProcedure"); +      aliases.add("visitSeq"); +      aliases.add("visitProc"); + +      return aliases;     } -   /***************************************************************************/ -   /**** PUBLIC ***************************************************************/ -   /***************************************************************************/ -   /**** Constructors *********************************************************/ -   public static SequenceVariableCall build +   public static Instruction build     (        final Origin origin, -      final Computation sequence, -      final List<Computation> parameters +      final String _alias, +      final List<Computation> call_parameters     ) -   throws ParsingError +   throws Throwable     { +      // TODO: implement +      // Quite a troublesome one, since we need to handle: +      // * If first argument is a string, this is a reference to a sequence. +      // * In that case, the expected type of each other parameter is to be +      //   determined in the future. +      final Computation sequence = null; +      final List<Computation> parameters = null;        final List<Type> signature;        sequence.expect_non_string(); @@ -89,14 +108,33 @@ public class SequenceVariableCall extends Instruction        return new SequenceVariableCall(origin, sequence, parameters);     } -   /**** Accessors ************************************************************/ -   @Override -   public void get_visited_by (final InstructionVisitor iv) -   throws Throwable +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final List<Computation> parameters; +   protected final Computation sequence; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected SequenceVariableCall +   ( +      final Origin origin, +      final Computation sequence, +      final List<Computation> parameters +   )     { -      iv.visit_sequence_variable_call(this); +      super(origin); + +      this.sequence = sequence; +      this.parameters = parameters;     } +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Accessors ************************************************************/     public Computation get_sequence ()     {        return sequence; diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SequenceVariableJump.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SequenceVariableJump.java new file mode 100644 index 0000000..87365c4 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SequenceVariableJump.java @@ -0,0 +1,219 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +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 GenericInstruction +{ +   public static Collection<String> get_aliases () +   { +      final List<String> aliases; + +      aliases = new ArrayList<String>(); + +      aliases.add("jump"); +      aliases.add("jump_to"); +      aliases.add("jump_to_sequence"); +      aliases.add("jump_to_procedure"); +      aliases.add("jump_to_seq"); +      aliases.add("jump_to_proc"); +      aliases.add("continue_as"); +      aliases.add("continue_as_sequence"); +      aliases.add("continue_as_procedure"); +      aliases.add("continue_as_seq"); +      aliases.add("continue_as_proc"); +      aliases.add("continue_to"); +      aliases.add("continue_to_sequence"); +      aliases.add("continue_to_procedure"); +      aliases.add("continue_to_seq"); +      aliases.add("continue_to_proc"); +      aliases.add("continue_with"); +      aliases.add("continue_with_sequence"); +      aliases.add("continue_with_procedure"); +      aliases.add("continue_with_seq"); +      aliases.add("continue_with_proc"); +      aliases.add("go_to"); +      aliases.add("go_to_sequence"); +      aliases.add("go_to_procedure"); +      aliases.add("go_to_seq"); +      aliases.add("go_to_proc"); + +      aliases.add("jumpto"); +      aliases.add("jumptosequence"); +      aliases.add("jumptoprocedure"); +      aliases.add("jumptoseq"); +      aliases.add("jumptoproc"); +      aliases.add("continueas"); +      aliases.add("continueassequence"); +      aliases.add("continueasprocedure"); +      aliases.add("continueasseq"); +      aliases.add("continueasproc"); +      aliases.add("continueto"); +      aliases.add("continuetosequence"); +      aliases.add("continuetoprocedure"); +      aliases.add("continuetoseq"); +      aliases.add("continuetoproc"); +      aliases.add("continuewith"); +      aliases.add("continuewithsequence"); +      aliases.add("continuewithprocedure"); +      aliases.add("continuewithseq"); +      aliases.add("continuewithproc"); +      aliases.add("goto"); +      aliases.add("gotosequence"); +      aliases.add("gotoprocedure"); +      aliases.add("gotoseq"); +      aliases.add("gotoproc"); + +      aliases.add("jumpTo"); +      aliases.add("jumpToSequence"); +      aliases.add("jumpToProcedure"); +      aliases.add("jumpToSeq"); +      aliases.add("jumpToProc"); +      aliases.add("continueAs"); +      aliases.add("continueAsSequence"); +      aliases.add("continueAsProcedure"); +      aliases.add("continueAsSeq"); +      aliases.add("continueAsProc"); +      aliases.add("continueTo"); +      aliases.add("continueToSequence"); +      aliases.add("continueToProcedure"); +      aliases.add("continueToSeq"); +      aliases.add("continueToProc"); +      aliases.add("continueWith"); +      aliases.add("continueWithSequence"); +      aliases.add("continueWithProcedure"); +      aliases.add("continueWithSeq"); +      aliases.add("continueWithProc"); +      aliases.add("goTo"); +      aliases.add("goToSequence"); +      aliases.add("goToProcedure"); +      aliases.add("goToSeq"); +      aliases.add("goToProc"); + +      return aliases; +   } + +   public static Instruction build +   ( +      final Origin origin, +      final String _alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   { +      // TODO: implement +      // Quite a troublesome one, since we need to handle: +      // * If first argument is a string, this is a reference to a sequence. +      // * In that case, the expected type of each other parameter is to be +      //   determined in the future. +      final Computation sequence = null; +      final List<Computation> parameters = null; + +      final List<Type> signature; + +      sequence.expect_non_string(); + +      // TODO: change this system, since we'd rather use the signature to tell +      // the parameters what to expect. +      ((SequenceType) sequence.get_type()).propose_signature_from_parameters +      ( +         parameters +      ); + +      if (!sequence.get_type().get_act_as_type().equals(SequenceType.ARCHETYPE)) +      { +         ErrorManager.handle +         ( +            new InvalidTypeException +            ( +               origin, +               sequence.get_type(), +               Collections.singleton(SequenceType.ARCHETYPE) +            ) +         ); +      } + +      RecurrentChecks.propagate_expected_types_and_assert_computations_matches_signature +      ( +         origin, +         parameters, +         ((SequenceType) sequence.get_type()).get_signature() +      ); + +      return new SequenceVariableJump(origin, sequence, parameters); +   } + +   /***************************************************************************/ +   /**** 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 ***************************************************************/ +   /***************************************************************************/ +   /**** Accessors ************************************************************/ +   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/instruction/SetValue.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SetValue.java index d077c26..324694d 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SetValue.java @@ -1,16 +1,62 @@ -package tonkadur.fate.v1.lang.instruction; +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List;  import tonkadur.parser.Origin;  import tonkadur.parser.ParsingError; -  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Instruction;  import tonkadur.fate.v1.lang.meta.Computation;  import tonkadur.fate.v1.lang.meta.RecurrentChecks; -public class SetValue extends Instruction +public class SetValue extends GenericInstruction  { +   public static Collection<String> get_aliases () +   { +      final List<String> aliases; + +      aliases = new ArrayList<String>(); + +      aliases.add("set"); +      aliases.add("set_value"); +      aliases.add("set_value_of"); +      aliases.add("setvalue"); +      aliases.add("setvalueof"); +      aliases.add("setValue"); +      aliases.add("setValueOf"); + +      return aliases; +   } + +   public static Instruction build +   ( +      final Origin origin, +      final String alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   { +      final Computation reference; +      final Computation value; + +      reference.expect_non_string(); + +      RecurrentChecks.propagate_expected_type +      ( +         value, +         reference.get_type() +      ); + +      RecurrentChecks.assert_can_be_used_as(value, reference); + +      reference.use_as_reference(); + +      return new SetValue(origin, value, reference); +   } +     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ @@ -37,30 +83,7 @@ public class SetValue extends Instruction     /***************************************************************************/     /**** PUBLIC ***************************************************************/     /***************************************************************************/ -   /**** Constructors *********************************************************/ -   public static SetValue build -   ( -      final Origin origin, -      final Computation element, -      final Computation value_reference -   ) -   throws ParsingError -   { -      value_reference.expect_non_string(); - -      RecurrentChecks.assert_can_be_used_as(element, value_reference); - -      return new SetValue(origin, element, value_reference); -   } -     /**** Accessors ************************************************************/ -   @Override -   public void get_visited_by (final InstructionVisitor iv) -   throws Throwable -   { -      iv.visit_set_value(this); -   } -     public Computation get_value ()     {        return element; diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Shuffle.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Shuffle.java new file mode 100644 index 0000000..ca9e5d7 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Shuffle.java @@ -0,0 +1,111 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.meta.InstructionVisitor; +import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; + +public class Shuffle extends GenericInstruction +{ +   public static Collection<String> get_aliases () +   { +      final List<String> aliases; + +      aliases = new ArrayList<String>(); + +      aliases.add("list:shuffle"); +      aliases.add("set:shuffle"); + +      return aliases; +   } + +   public static Instruction build +   ( +      final Origin origin, +      final String alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   { +      final Computation collection; + +      if (call_parameters.size() != 1) +      { +         // TODO: Error. +         System.err.print +         ( +            "[E] Wrong number of arguments at " +            + origin.toString() +         ); + +         return null; +      } + +      collection = call_parameters.get(0); + +      collection.expect_non_string(); + +      if (alias.startsWith("set:")) +      { +         RecurrentChecks.assert_is_a_set(collection); +      } +      else +      { +         RecurrentChecks.assert_is_a_list(collection); +      } + +      collection.use_as_reference(); + +      return new Shuffle(origin, collection); +   } + +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final Computation collection; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected Shuffle +   ( +      final Origin origin, +      final Computation collection +   ) +   { +      super(origin); + +      this.collection = collection; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Accessors ************************************************************/ +   public Computation get_collection () +   { +      return collection; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append("(Shuffle "); +      sb.append(collection.toString()); + +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Sort.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Sort.java new file mode 100644 index 0000000..df3cc1e --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Sort.java @@ -0,0 +1,138 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import java.util.ArrayList; +import java.util.List; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.type.Type; +import tonkadur.fate.v1.lang.type.CollectionType; + +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; + +public class Sort extends GenericInstruction +{ +   public static Collection<String> get_aliases () +   { +      final List<String> aliases; + +      aliases = new ArrayList<String>(); + +      aliases.add("list:sort"); + +      return aliases; +   } + +   public static Instruction build +   ( +      final Origin origin, +      final String _alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   { +      // TODO: implement +      final Computation lambda_function = null; +      final Computation collection = null; +      final List<Computation> extra_params = nulls; +      final List<Type> types_in; + +      types_in = new ArrayList<Type>(); + +      RecurrentChecks.assert_is_a_list(collection); + +      types_in.add(((CollectionType) collection.get_type()).get_content_type()); +      types_in.add(types_in.get(0)); + +      for (final Computation c: extra_params) +      { +         types_in.add(c.get_type()); +      } + +      RecurrentChecks.assert_lambda_matches_types +      ( +         lambda_function, +         Type.INT, +         types_in +      ); + +      collection.use_as_reference(); + +      return new Sort(origin, lambda_function, collection, extra_params); +   } + +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final List<Computation> extra_params; +   protected final Computation lambda_function; +   protected final Computation collection; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected Sort +   ( +      final Origin origin, +      final Computation lambda_function, +      final Computation collection, +      final List<Computation> extra_params +   ) +   { +      super(origin); + +      this.lambda_function = lambda_function; +      this.collection = collection; +      this.extra_params = extra_params; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Accessors ************************************************************/ +   public Computation get_lambda_function () +   { +      return lambda_function; +   } + +   public Computation get_collection () +   { +      return collection; +   } + +   public List<Computation> get_extra_parameters () +   { +      return extra_params; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append("(Sort "); +      sb.append(lambda_function.toString()); +      sb.append(" "); +      sb.append(collection.toString()); + +      for (final Computation c: extra_params) +      { +         sb.append(" "); +         sb.append(c.toString()); +      } + +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SubList.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SubList.java new file mode 100644 index 0000000..933d44d --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SubList.java @@ -0,0 +1,148 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.type.Type; + +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; + +public class SubList extends GenericInstruction +{ +   public static Collection<String> get_aliases () +   { +      final List<String> aliases; + +      aliases = new ArrayList<String>(); + +      aliases.add("list:sublist"); +      aliases.add("list:sub_list"); +      aliases.add("list:subList"); +      aliases.add("set:sublist"); +      aliases.add("set:sub_list"); +      aliases.add("set:subList"); +      aliases.add("set:subset"); +      aliases.add("set:sub_set"); +      aliases.add("set:subSet"); + +      return aliases; +   } + +   public static Instruction build +   ( +      final Origin origin, +      final String alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   { +      final Computation start; +      final Computation end; +      final Computation collection; + +      if (call_parameters.size() != 3) +      { +         // TODO: Error. +         System.err.print +         ( +            "[E] Wrong number of arguments at " +            + origin.toString() +         ); + +         return null; +      } + +      start = call_parameters.get(0); +      end = call_parameters.get(1); +      collection = call_parameters.get(2); + +      start.expect_non_string(); +      end.expect_non_string(); +      collection.expect_non_string(); + +      if (alias.startsWith("set:")) +      { +         RecurrentChecks.assert_is_a_set(collection); +      } +      else +      { +         RecurrentChecks.assert_is_a_list(collection); +      } + +      RecurrentChecks.assert_can_be_used_as(start, Type.INT); +      RecurrentChecks.assert_can_be_used_as(end, Type.INT); + +      collection.use_as_reference(); + +      return new SubList(origin, start, end, collection); +   } + +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final Computation start; +   protected final Computation end; +   protected final Computation collection; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected SubList +   ( +      final Origin origin, +      final Computation start, +      final Computation end, +      final Computation collection +   ) +   { +      super(origin); + +      this.start = start; +      this.end = end; +      this.collection = collection; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Accessors ************************************************************/ +   public Computation get_start_index () +   { +      return start; +   } + +   public Computation get_end_index () +   { +      return end; +   } + +   public Computation get_collection () +   { +      return collection; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append("(SubList "); +      sb.append(start.toString()); +      sb.append(" "); +      sb.append(end.toString()); +      sb.append(" "); +      sb.append(collection.toString()); +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/Computation.java b/src/core/src/tonkadur/fate/v1/lang/meta/Computation.java index 73b63b7..851df56 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/Computation.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/Computation.java @@ -48,6 +48,20 @@ public abstract class Computation extends Node     {     } +   public void use_as_reference () +   throws ParsingError +   { +      // TODO: proper ParsingError. +      System.err.println +      ( +         "[W] Computation at " +         + origin.toString +         + " is being used as a reference, but isn't one. The instruction will" +         + " not be able to modify the memory you thought was targeted by this" +         + " computation." +      ); +   } +     /**** Misc. ****************************************************************/     @Override     public String 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 25cdeea..7f93acf 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java @@ -22,18 +22,12 @@ public interface ComputationVisitor     public void visit_constant (final Constant n)     throws Throwable; -   public void visit_if_else_value (final IfElseValue n) -   throws Throwable; -     public void visit_lambda_expression (final LambdaExpression n)     throws Throwable;     public void visit_let (final Let n)     throws Throwable; -   public void visit_newline (final Newline n) -   throws Throwable; -     public void visit_sequence_reference (final SequenceReference 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 9a6fbdf..1f70545 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 @@ -2100,6 +2100,20 @@ returns [Computation result]           );     } +   | SEQUENCE_KW identifier WS* R_PAREN +   { +      $result = +         new SequenceReference +         ( +            PARSER.get_origin_at +            ( +               ($SEQUENCE_KW.getLine()), +               ($SEQUENCE_KW.getCharPositionInLine()) +            ), +            $identifier.text +         ); +   } +     | LAMBDA_KW        {           previous_local_variables_stack = PARSER.get_local_variables_stack(); 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 b02b600..b9f62e9 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 @@ -154,6 +154,11 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor        reserved_registers.addAll(cc.reserved_registers);     } +   protected void assimilate_reserved_registers (final ComputationCompiler cc) +   { +      reserved_registers.addAll(cc.reserved_registers); +   } +     protected Register reserve (final Type t)     {        final Register result; @@ -377,125 +382,6 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor     }     @Override -   public void visit_if_else_value -   ( -      final tonkadur.fate.v1.lang.computation.IfElseValue n -   ) -   throws Throwable -   { -      final ComputationCompiler cond_cc, if_true_cc, if_false_cc; - -      cond_cc = new ComputationCompiler(compiler); -      if_true_cc = new ComputationCompiler(compiler); -      if_false_cc = new ComputationCompiler(compiler); - -      n.get_condition().get_visited_by(cond_cc); -      n.get_if_true().get_visited_by(if_true_cc); -      n.get_if_false().get_visited_by(if_false_cc); - -      if (if_true_cc.has_init() || if_false_cc.has_init()) -      { -         /* -          * Unsafe ifelse computation: at least one of the branches needs to -          * use instructions with values *before* the condition has been -          * checked. This results in non-lazy evaluation, and is dangerous: -          * the condition might be a test to ensure that the computations of the -          * chosen branch are legal. In such cases, performing the potentially -          * illegal branch's instructions is likely to result in a runtime error -          * on the interpreter. -          * -          * Instead, we just convert the ifelse into an instruction-based -          * equivalent and store the result in an anonymous register to be used -          * here. -          */ -         final Register if_else_result; -         final List<Instruction> if_true_branch; -         final List<Instruction> if_false_branch; - -         if_else_result = reserve(if_true_cc.get_computation().get_type()); - -         if_true_branch = new ArrayList<Instruction>(); -         if_false_branch = new ArrayList<Instruction>(); - -         if (if_true_cc.has_init()) -         { -            if_true_branch.add(if_true_cc.get_init()); -         } - -         if (if_false_cc.has_init()) -         { -            if_false_branch.add(if_false_cc.get_init()); -         } - -         if_true_branch.add -         ( -            new SetValue -            ( -               if_else_result.get_address(), -               if_true_cc.get_computation() -            ) -         ); - -         if_false_branch.add -         ( -            new SetValue -            ( -               if_else_result.get_address(), -               if_false_cc.get_computation() -            ) -         ); - -         if (cond_cc.has_init()) -         { -            init_instructions.add(cond_cc.get_init()); -         } - -         init_instructions.add -         ( -            IfElse.generate -            ( -               compiler.registers(), -               compiler.assembler(), -               cond_cc.get_computation(), -               compiler.assembler().merge(if_true_branch), -               compiler.assembler().merge(if_false_branch) -            ) -         ); - -         reserved_registers.addAll(cond_cc.reserved_registers); -         reserved_registers.addAll(if_true_cc.reserved_registers); -         reserved_registers.addAll(if_false_cc.reserved_registers); - -         result_as_computation = if_else_result.get_value(); -         result_as_address = if_else_result.get_address(); -      } -      else -      { -         assimilate(cond_cc); -         assimilate(if_true_cc); -         assimilate(if_false_cc); - -         result_as_computation = -            new IfElseComputation -            ( -               cond_cc.get_computation(), -               if_true_cc.get_computation(), -               if_false_cc.get_computation() -            ); -      } -   } - -   @Override -   public void visit_newline -   ( -      final tonkadur.fate.v1.lang.computation.Newline n -   ) -   throws Throwable -   { -      result_as_computation = new Newline(); -   } - -   @Override     public void visit_extra_computation     (        final tonkadur.fate.v1.lang.computation.ExtraComputationInstance n | 


