From 7605eaa49bfdafa6d386440aa301c809245055ae Mon Sep 17 00:00:00 2001 From: Nathanael Sensfelder Date: Wed, 25 Aug 2021 22:32:13 +0200 Subject: Reimplementing generic †Fate instructions & adds incorrect reference warning. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fate/v1/lang/computation/AmbiguousWord.java | 7 + .../fate/v1/lang/computation/FieldAccess.java | 7 + .../v1/lang/computation/GenericComputation.java | 4 +- .../fate/v1/lang/computation/IfElseValue.java | 149 ------------- .../tonkadur/fate/v1/lang/computation/Newline.java | 35 --- .../fate/v1/lang/computation/Paragraph.java | 12 +- .../v1/lang/computation/VariableReference.java | 8 +- .../fate/v1/lang/computation/generic/Access.java | 10 +- .../generic/AddElementAtComputation.java | 2 +- .../computation/generic/AddElementComputation.java | 2 +- .../generic/AddElementsOfComputation.java | 2 +- .../lang/computation/generic/AddressOperator.java | 2 +- .../v1/lang/computation/generic/AtReference.java | 13 +- .../fate/v1/lang/computation/generic/CarCdr.java | 9 +- .../lang/computation/generic/ConsComputation.java | 2 +- .../v1/lang/computation/generic/CountOperator.java | 2 +- .../computation/generic/FilterComputation.java | 2 +- .../fate/v1/lang/computation/generic/Fold.java | 2 +- .../v1/lang/computation/generic/IfElseValue.java | 2 +- .../lang/computation/generic/IndexOfOperator.java | 2 +- .../generic/IndexedFilterComputation.java | 2 +- .../computation/generic/IndexedMapComputation.java | 2 +- .../generic/IndexedMergeComputation.java | 2 +- .../generic/IndexedPartitionComputation.java | 2 +- .../fate/v1/lang/computation/generic/IsEmpty.java | 2 +- .../lang/computation/generic/IsMemberOperator.java | 2 +- .../lang/computation/generic/LambdaEvaluation.java | 2 +- .../lang/computation/generic/MapComputation.java | 2 +- .../lang/computation/generic/MergeComputation.java | 2 +- .../fate/v1/lang/computation/generic/Newline.java | 2 +- .../v1/lang/computation/generic/Operation.java | 4 +- .../computation/generic/PartitionComputation.java | 2 +- .../computation/generic/PopElementComputation.java | 2 +- .../generic/PushElementComputation.java | 6 +- .../fate/v1/lang/computation/generic/Range.java | 2 +- .../generic/RemoveAllOfElementComputation.java | 8 +- .../generic/RemoveElementAtComputation.java | 2 +- .../generic/RemoveElementComputation.java | 2 +- .../generic/RemoveElementsOfComputation.java | 2 +- .../generic/ReverseListComputation.java | 2 +- .../computation/generic/ShuffleComputation.java | 2 +- .../v1/lang/computation/generic/SizeOperator.java | 2 +- .../lang/computation/generic/SortComputation.java | 2 +- .../computation/generic/SubListComputation.java | 2 +- .../fate/v1/lang/computation/generic/TextJoin.java | 2 +- .../tonkadur/fate/v1/lang/instruction/Break.java | 37 ---- .../tonkadur/fate/v1/lang/instruction/Done.java | 37 ---- .../src/tonkadur/fate/v1/lang/instruction/End.java | 37 ---- .../v1/lang/instruction/GenericInstruction.java | 4 +- .../v1/lang/instruction/SequenceVariableCall.java | 129 ----------- .../v1/lang/instruction/SequenceVariableJump.java | 129 ----------- .../fate/v1/lang/instruction/SetValue.java | 98 --------- .../v1/lang/instruction/generic/AddElement.java | 146 ++++++++++++ .../v1/lang/instruction/generic/AddElementAt.java | 153 +++++++++++++ .../v1/lang/instruction/generic/AddElementsOf.java | 180 +++++++++++++++ .../fate/v1/lang/instruction/generic/Allocate.java | 5 +- .../fate/v1/lang/instruction/generic/Break.java | 65 ++++++ .../fate/v1/lang/instruction/generic/Clear.java | 2 +- .../fate/v1/lang/instruction/generic/Done.java | 65 ++++++ .../fate/v1/lang/instruction/generic/End.java | 65 ++++++ .../fate/v1/lang/instruction/generic/Filter.java | 141 ++++++++++++ .../fate/v1/lang/instruction/generic/Free.java | 2 +- .../v1/lang/instruction/generic/IndexedFilter.java | 160 ++++++++++++++ .../v1/lang/instruction/generic/IndexedMap.java | 158 +++++++++++++ .../v1/lang/instruction/generic/IndexedMerge.java | 244 +++++++++++++++++++++ .../lang/instruction/generic/IndexedPartition.java | 184 ++++++++++++++++ .../fate/v1/lang/instruction/generic/Map.java | 158 +++++++++++++ .../fate/v1/lang/instruction/generic/Merge.java | 238 ++++++++++++++++++++ .../v1/lang/instruction/generic/Partition.java | 183 ++++++++++++++++ .../v1/lang/instruction/generic/PopElement.java | 166 ++++++++++++++ .../v1/lang/instruction/generic/PushElement.java | 162 ++++++++++++++ .../instruction/generic/RemoveAllOfElement.java | 144 ++++++++++++ .../v1/lang/instruction/generic/RemoveElement.java | 145 ++++++++++++ .../lang/instruction/generic/RemoveElementAt.java | 137 ++++++++++++ .../lang/instruction/generic/RemoveElementsOf.java | 150 +++++++++++++ .../v1/lang/instruction/generic/ReverseList.java | 111 ++++++++++ .../instruction/generic/SequenceVariableCall.java | 167 ++++++++++++++ .../instruction/generic/SequenceVariableJump.java | 219 ++++++++++++++++++ .../fate/v1/lang/instruction/generic/SetValue.java | 121 ++++++++++ .../fate/v1/lang/instruction/generic/Shuffle.java | 111 ++++++++++ .../fate/v1/lang/instruction/generic/Sort.java | 138 ++++++++++++ .../fate/v1/lang/instruction/generic/SubList.java | 148 +++++++++++++ .../tonkadur/fate/v1/lang/meta/Computation.java | 14 ++ .../fate/v1/lang/meta/ComputationVisitor.java | 6 - src/core/src/tonkadur/fate/v1/parser/FateParser.g4 | 14 ++ .../v1/compiler/fate/v1/ComputationCompiler.java | 124 +---------- 86 files changed, 4204 insertions(+), 829 deletions(-) delete mode 100644 src/core/src/tonkadur/fate/v1/lang/computation/IfElseValue.java delete mode 100644 src/core/src/tonkadur/fate/v1/lang/computation/Newline.java delete mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/Break.java delete mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/Done.java delete mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/End.java delete mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableCall.java delete mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableJump.java delete mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElement.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementAt.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementsOf.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/generic/Break.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/generic/Done.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/generic/End.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/generic/Filter.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedFilter.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedMap.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedMerge.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/generic/IndexedPartition.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/generic/Map.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/generic/Merge.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/generic/Partition.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/generic/PopElement.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/generic/PushElement.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveAllOfElement.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElement.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementAt.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementsOf.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/generic/ReverseList.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/generic/SequenceVariableCall.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/generic/SequenceVariableJump.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/generic/SetValue.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/generic/Shuffle.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/generic/Sort.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/generic/SubList.java 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/Break.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Break.java deleted file mode 100644 index 653061d..0000000 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Break.java +++ /dev/null @@ -1,37 +0,0 @@ -package tonkadur.fate.v1.lang.instruction; - -import tonkadur.parser.Origin; - -import tonkadur.fate.v1.lang.meta.InstructionVisitor; -import tonkadur.fate.v1.lang.meta.Instruction; - -public class Break extends Instruction -{ - /***************************************************************************/ - /**** MEMBERS **************************************************************/ - /***************************************************************************/ - - /***************************************************************************/ - /**** PUBLIC ***************************************************************/ - /***************************************************************************/ - /**** Constructors *********************************************************/ - public Break (final Origin origin) - { - super(origin); - } - - /**** Accessors ************************************************************/ - @Override - public void get_visited_by (final InstructionVisitor iv) - throws Throwable - { - iv.visit_break(this); - } - - /**** Misc. ****************************************************************/ - @Override - public String toString () - { - return "(Break)"; - } -} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Done.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Done.java deleted file mode 100644 index ada3b7c..0000000 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Done.java +++ /dev/null @@ -1,37 +0,0 @@ -package tonkadur.fate.v1.lang.instruction; - -import tonkadur.parser.Origin; - -import tonkadur.fate.v1.lang.meta.InstructionVisitor; -import tonkadur.fate.v1.lang.meta.Instruction; - -public class Done extends Instruction -{ - /***************************************************************************/ - /**** MEMBERS **************************************************************/ - /***************************************************************************/ - - /***************************************************************************/ - /**** PUBLIC ***************************************************************/ - /***************************************************************************/ - /**** Constructors *********************************************************/ - public Done (final Origin origin) - { - super(origin); - } - - /**** Accessors ************************************************************/ - @Override - public void get_visited_by (final InstructionVisitor iv) - throws Throwable - { - iv.visit_done(this); - } - - /**** Misc. ****************************************************************/ - @Override - public String toString () - { - return "(Done)"; - } -} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/End.java b/src/core/src/tonkadur/fate/v1/lang/instruction/End.java deleted file mode 100644 index e39f435..0000000 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/End.java +++ /dev/null @@ -1,37 +0,0 @@ -package tonkadur.fate.v1.lang.instruction; - -import tonkadur.parser.Origin; - -import tonkadur.fate.v1.lang.meta.InstructionVisitor; -import tonkadur.fate.v1.lang.meta.Instruction; - -public class End extends Instruction -{ - /***************************************************************************/ - /**** MEMBERS **************************************************************/ - /***************************************************************************/ - - /***************************************************************************/ - /**** PUBLIC ***************************************************************/ - /***************************************************************************/ - /**** Constructors *********************************************************/ - public End (final Origin origin) - { - super(origin); - } - - /**** Accessors ************************************************************/ - @Override - public void get_visited_by (final InstructionVisitor iv) - throws Throwable - { - iv.visit_end(this); - } - - /**** Misc. ****************************************************************/ - @Override - public String toString () - { - return "(End)"; - } -} 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/SequenceVariableCall.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableCall.java deleted file mode 100644 index 7fb0d1c..0000000 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableCall.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 SequenceVariableCall extends Instruction -{ - /***************************************************************************/ - /**** MEMBERS **************************************************************/ - /***************************************************************************/ - protected final List parameters; - protected final Computation sequence; - - /***************************************************************************/ - /**** PROTECTED ************************************************************/ - /***************************************************************************/ - /**** Constructors *********************************************************/ - protected SequenceVariableCall - ( - final Origin origin, - final Computation sequence, - final List parameters - ) - { - super(origin); - - this.sequence = sequence; - this.parameters = parameters; - } - - /***************************************************************************/ - /**** PUBLIC ***************************************************************/ - /***************************************************************************/ - /**** Constructors *********************************************************/ - public static SequenceVariableCall build - ( - final Origin origin, - final Computation sequence, - final List parameters - ) - throws ParsingError - { - final List 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 SequenceVariableCall(origin, sequence, parameters); - } - - /**** Accessors ************************************************************/ - @Override - public void get_visited_by (final InstructionVisitor iv) - throws Throwable - { - iv.visit_sequence_variable_call(this); - } - - public Computation get_sequence () - { - return sequence; - } - - public List get_parameters () - { - return parameters; - } - - /**** Misc. ****************************************************************/ - @Override - public String toString () - { - final StringBuilder sb = new StringBuilder(); - - sb.append("(SequenceVariableCall "); - sb.append(sequence); - - for (final Computation c: parameters) - { - sb.append(" "); - sb.append(c.toString()); - } - - sb.append(")"); - - return sb.toString(); - } -} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableJump.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableJump.java 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 parameters; - protected final Computation sequence; - - /***************************************************************************/ - /**** PROTECTED ************************************************************/ - /***************************************************************************/ - /**** Constructors *********************************************************/ - protected SequenceVariableJump - ( - final Origin origin, - final Computation sequence, - final List parameters - ) - { - super(origin); - - this.sequence = sequence; - this.parameters = parameters; - } - - /***************************************************************************/ - /**** PUBLIC ***************************************************************/ - /***************************************************************************/ - /**** Constructors *********************************************************/ - public static SequenceVariableJump build - ( - final Origin origin, - final Computation sequence, - final List parameters - ) - throws ParsingError - { - final List 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 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/SetValue.java deleted file mode 100644 index d077c26..0000000 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java +++ /dev/null @@ -1,98 +0,0 @@ -package tonkadur.fate.v1.lang.instruction; - -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 -{ - /***************************************************************************/ - /**** MEMBERS **************************************************************/ - /***************************************************************************/ - protected final Computation element; - protected final Computation value_reference; - - /***************************************************************************/ - /**** PROTECTED ************************************************************/ - /***************************************************************************/ - /**** Constructors *********************************************************/ - protected SetValue - ( - final Origin origin, - final Computation element, - final Computation value_reference - ) - { - super(origin); - - this.value_reference = value_reference; - this.element = element; - } - - /***************************************************************************/ - /**** 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; - } - - public Computation get_reference () - { - return value_reference; - } - - /**** Misc. ****************************************************************/ - @Override - public String toString () - { - final StringBuilder sb = new StringBuilder(); - - sb.append("(SetValue"); - 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("value_reference:"); - sb.append(System.lineSeparator()); - sb.append(value_reference.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 get_aliases () + { + final List aliases; + + aliases = new ArrayList(); + + 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 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 get_aliases () + { + final List aliases; + + aliases = new ArrayList(); + + 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 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 get_aliases () + { + final List aliases; + + aliases = new ArrayList(); + + 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 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/generic/Break.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Break.java new file mode 100644 index 0000000..dd26d0e --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Break.java @@ -0,0 +1,65 @@ +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 GenericInstruction +{ + public static Collection get_aliases () + { + final List aliases; + + aliases = new ArrayList(); + + 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 call_parameters + ) + throws Throwable + { + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + public Break (final Origin origin) + { + super(origin); + } + + /**** Accessors ************************************************************/ + @Override + public void get_visited_by (final InstructionVisitor iv) + throws Throwable + { + iv.visit_break(this); + } + + /**** Misc. ****************************************************************/ + @Override + public String toString () + { + return "(Break)"; + } +} 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/generic/Done.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Done.java new file mode 100644 index 0000000..ec21eec --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Done.java @@ -0,0 +1,65 @@ +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 GenericInstruction +{ + public static Collection get_aliases () + { + final List aliases; + + aliases = new ArrayList(); + + 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 call_parameters + ) + throws Throwable + { + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + public Done (final Origin origin) + { + super(origin); + } + + /**** Accessors ************************************************************/ + @Override + public void get_visited_by (final InstructionVisitor iv) + throws Throwable + { + iv.visit_done(this); + } + + /**** Misc. ****************************************************************/ + @Override + public String toString () + { + return "(Done)"; + } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/End.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/End.java new file mode 100644 index 0000000..762f0ba --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/End.java @@ -0,0 +1,65 @@ +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 GenericInstruction +{ + public static Collection get_aliases () + { + final List aliases; + + aliases = new ArrayList(); + + 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 call_parameters + ) + throws Throwable + { + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + public End (final Origin origin) + { + super(origin); + } + + /**** Accessors ************************************************************/ + @Override + public void get_visited_by (final InstructionVisitor iv) + throws Throwable + { + iv.visit_end(this); + } + + /**** Misc. ****************************************************************/ + @Override + public String toString () + { + return "(End)"; + } +} 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 get_aliases () + { + final List aliases; + + aliases = new ArrayList(); + + aliases.add("list:filter"); + aliases.add("set:filter"); + + return aliases; + } + + public static Instruction build + ( + final Origin origin, + final String _alias, + final List call_parameters + ) + throws Throwable + { + // TODO: implement + final Computation lambda_function = null; + final Computation collection = null; + final List extra_params = null; + final List target_signature; + + target_signature = new ArrayList(); + + 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 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 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 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 get_aliases () + { + final List aliases; + + aliases = new ArrayList(); + + 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 call_parameters + ) + throws Throwable + { + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final List 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 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 extra_params + ) + throws ParsingError + { + final List target_signature; + + target_signature = new ArrayList(); + + 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 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 get_aliases () + { + final List aliases; + + aliases = new ArrayList(); + + 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 call_parameters + ) + throws Throwable + { + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final List 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 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 extra_params + ) + throws Throwable + { + final List in_types; + + in_types = new ArrayList(); + + 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 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 get_aliases () + { + final List aliases; + + aliases = new ArrayList(); + + 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 call_parameters + ) + throws Throwable + { + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final List 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 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 extra_params + ) + throws Throwable + { + final List types_in; + + types_in = new ArrayList(); + + 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 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 get_aliases () + { + final List aliases; + + aliases = new ArrayList(); + + 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 call_parameters + ) + throws Throwable + { + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final List 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 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 extra_params + ) + throws ParsingError + { + final List target_signature; + + target_signature = new ArrayList(); + + 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 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 get_aliases () + { + final List aliases; + + aliases = new ArrayList(); + + 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 call_parameters + ) + throws Throwable + { + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final List 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 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 extra_params + ) + throws ParsingError + { + final List target_signature; + + target_signature = new ArrayList(); + + 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 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 get_aliases () + { + final List aliases; + + aliases = new ArrayList(); + + 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 call_parameters + ) + throws Throwable + { + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final List 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 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 extra_params + ) + throws Throwable + { + final List types_in; + + types_in = new ArrayList(); + + 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 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 get_aliases () + { + final List aliases; + + aliases = new ArrayList(); + + 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 call_parameters + ) + throws Throwable + { + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final List 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 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 extra_params + ) + throws ParsingError + { + final List target_signature; + + target_signature = new ArrayList(); + + 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 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 get_aliases () + { + final List aliases; + + aliases = new ArrayList(); + + 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 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 get_aliases () + { + final List aliases; + + aliases = new ArrayList(); + + 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 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 get_aliases () + { + final List aliases; + + aliases = new ArrayList(); + + 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 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 get_aliases () + { + final List aliases; + + aliases = new ArrayList(); + + 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 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 get_aliases () + { + final List aliases; + + aliases = new ArrayList(); + + 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 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 get_aliases () + { + final List aliases; + + aliases = new ArrayList(); + + 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 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 get_aliases () + { + final List aliases; + + aliases = new ArrayList(); + + aliases.add("list:reverse"); + aliases.add("set:reverse"); + + return aliases; + } + + public static Instruction build + ( + final Origin origin, + final String alias, + final List 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/generic/SequenceVariableCall.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SequenceVariableCall.java new file mode 100644 index 0000000..f09dcdd --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SequenceVariableCall.java @@ -0,0 +1,167 @@ +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 SequenceVariableCall extends GenericInstruction +{ + public static Collection get_aliases () + { + // ISSUE: how can the parser distinguish these from (call! ) + final List aliases; + + aliases = new ArrayList(); + + 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 static Instruction build + ( + final Origin origin, + final String _alias, + final List 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 parameters = null; + final List 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 SequenceVariableCall(origin, sequence, parameters); + } + + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final List parameters; + protected final Computation sequence; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + protected SequenceVariableCall + ( + final Origin origin, + final Computation sequence, + final List parameters + ) + { + super(origin); + + this.sequence = sequence; + this.parameters = parameters; + } + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Accessors ************************************************************/ + public Computation get_sequence () + { + return sequence; + } + + public List get_parameters () + { + return parameters; + } + + /**** Misc. ****************************************************************/ + @Override + public String toString () + { + final StringBuilder sb = new StringBuilder(); + + sb.append("(SequenceVariableCall "); + sb.append(sequence); + + for (final Computation c: parameters) + { + sb.append(" "); + sb.append(c.toString()); + } + + sb.append(")"); + + return sb.toString(); + } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/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 get_aliases () + { + final List aliases; + + aliases = new ArrayList(); + + 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 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 parameters = null; + + final List 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 parameters; + protected final Computation sequence; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + protected SequenceVariableJump + ( + final Origin origin, + final Computation sequence, + final List parameters + ) + { + super(origin); + + this.sequence = sequence; + this.parameters = parameters; + } + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Accessors ************************************************************/ + public Computation get_sequence () + { + return sequence; + } + + public List 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/SetValue.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SetValue.java new file mode 100644 index 0000000..324694d --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SetValue.java @@ -0,0 +1,121 @@ +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 GenericInstruction +{ + public static Collection get_aliases () + { + final List aliases; + + aliases = new ArrayList(); + + 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 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 **************************************************************/ + /***************************************************************************/ + protected final Computation element; + protected final Computation value_reference; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + protected SetValue + ( + final Origin origin, + final Computation element, + final Computation value_reference + ) + { + super(origin); + + this.value_reference = value_reference; + this.element = element; + } + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Accessors ************************************************************/ + public Computation get_value () + { + return element; + } + + public Computation get_reference () + { + return value_reference; + } + + /**** Misc. ****************************************************************/ + @Override + public String toString () + { + final StringBuilder sb = new StringBuilder(); + + sb.append("(SetValue"); + 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("value_reference:"); + sb.append(System.lineSeparator()); + sb.append(value_reference.toString()); + + sb.append(")"); + + return sb.toString(); + } +} 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 get_aliases () + { + final List aliases; + + aliases = new ArrayList(); + + aliases.add("list:shuffle"); + aliases.add("set:shuffle"); + + return aliases; + } + + public static Instruction build + ( + final Origin origin, + final String alias, + final List 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 get_aliases () + { + final List aliases; + + aliases = new ArrayList(); + + aliases.add("list:sort"); + + return aliases; + } + + public static Instruction build + ( + final Origin origin, + final String _alias, + final List call_parameters + ) + throws Throwable + { + // TODO: implement + final Computation lambda_function = null; + final Computation collection = null; + final List extra_params = nulls; + final List types_in; + + types_in = new ArrayList(); + + 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 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 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 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 get_aliases () + { + final List aliases; + + aliases = new ArrayList(); + + 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 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; @@ -376,125 +381,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 if_true_branch; - final List if_false_branch; - - if_else_result = reserve(if_true_cc.get_computation().get_type()); - - if_true_branch = new ArrayList(); - if_false_branch = new ArrayList(); - - 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 ( -- cgit v1.2.3-70-g09d2