| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src/core')
11 files changed, 222 insertions, 37 deletions
| diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/AddressOperator.java b/src/core/src/tonkadur/fate/v1/lang/computation/AddressOperator.java index 290918a..a4482b3 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/AddressOperator.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/AddressOperator.java @@ -51,7 +51,6 @@ public class AddressOperator extends Computation     {        final StringBuilder sb = new StringBuilder(); -      sb.append(origin.toString());        sb.append("(AddressOf ");        sb.append(referred.get_name());        sb.append(") "); diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Cast.java b/src/core/src/tonkadur/fate/v1/lang/computation/Cast.java index d0096fb..08fdfce 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/Cast.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/Cast.java @@ -188,7 +188,6 @@ public class Cast extends Computation     {        final StringBuilder sb = new StringBuilder(); -      sb.append(origin.toString());        sb.append("(Cast (");        sb.append(type.get_name());        sb.append(") "); diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Constant.java b/src/core/src/tonkadur/fate/v1/lang/computation/Constant.java index 1945cea..97c5b02 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/Constant.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/Constant.java @@ -98,7 +98,6 @@ public class Constant extends Computation     {        final StringBuilder sb = new StringBuilder(); -      sb.append(origin.toString());        sb.append("(");        sb.append(type.get_name());        sb.append(" Constant "); diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/SizeOperator.java b/src/core/src/tonkadur/fate/v1/lang/computation/SizeOperator.java index a80efcf..b0bf57f 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/SizeOperator.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/SizeOperator.java @@ -66,7 +66,6 @@ public class SizeOperator extends Computation     {        final StringBuilder sb = new StringBuilder(); -      sb.append(origin.toString());        sb.append("(SizeOperator");        sb.append(System.lineSeparator());        sb.append(System.lineSeparator()); diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/SwitchValue.java b/src/core/src/tonkadur/fate/v1/lang/computation/SwitchValue.java index 405580b..afcdf12 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/SwitchValue.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/SwitchValue.java @@ -110,7 +110,6 @@ public class SwitchValue extends Computation     {        final StringBuilder sb = new StringBuilder(); -      sb.append(origin.toString());        sb.append("(SwitchValue");        sb.append(System.lineSeparator()); 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 3424eed..72b6068 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/VariableReference.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/VariableReference.java @@ -64,7 +64,6 @@ public class VariableReference extends Reference     {        final StringBuilder sb = new StringBuilder(); -      sb.append(origin.toString());        sb.append("(VariableReference (");        sb.append(type.get_name());        sb.append(") "); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Free.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Free.java index ee8efae..4e9a1f2 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Free.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Free.java @@ -56,7 +56,6 @@ public class Free extends Instruction     {        final StringBuilder sb = new StringBuilder(); -      sb.append(origin.toString());        sb.append("(Free ");        sb.append(value_reference.toString()); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElementsOf.java b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElementsOf.java new file mode 100644 index 0000000..ca91e7a --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElementsOf.java @@ -0,0 +1,105 @@ +package tonkadur.fate.v1.lang.instruction; + +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.Reference; +import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; + +public class RemoveElementsOf extends Instruction +{ +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final Computation other_collection; +   protected final Reference collection; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected RemoveElementsOf +   ( +      final Origin origin, +      final Computation other_collection, +      final Reference collection +   ) +   { +      super(origin); + +      this.collection = collection; +      this.other_collection = other_collection; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   public static RemoveElementsOf build +   ( +      final Origin origin, +      final Computation other_collection, +      final Reference collection +   ) +   throws ParsingError +   { +      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() +      ); + +      return new RemoveElementsOf(origin, other_collection, collection); +   } + +   /**** Accessors ************************************************************/ +   @Override +   public void get_visited_by (final InstructionVisitor iv) +   throws Throwable +   { +      iv.visit_remove_elements_of(this); +   } + +   public Computation get_source_collection () +   { +      return other_collection; +   } + +   public Reference 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/SetValue.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java index bdad43d..2e4dd79 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java @@ -76,7 +76,6 @@ public class SetValue extends Instruction     {        final StringBuilder sb = new StringBuilder(); -      sb.append(origin.toString());        sb.append("(SetValue");        sb.append(System.lineSeparator());        sb.append(System.lineSeparator()); diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java b/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java index c422956..b356f7d 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java @@ -14,6 +14,9 @@ public interface InstructionVisitor     public void visit_add_elements_of (final AddElementsOf n)     throws Throwable; +   public void visit_remove_elements_of (final RemoveElementsOf n) +   throws Throwable; +     public void visit_assert (final Assert n)     throws Throwable; diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java index 3d0630b..aeee56e 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java @@ -42,6 +42,7 @@ import tonkadur.wyrd.v1.lang.instruction.SetPC;  import tonkadur.wyrd.v1.lang.instruction.SetValue;  import tonkadur.wyrd.v1.compiler.util.AddElement; +import tonkadur.wyrd.v1.compiler.util.AddElementsOf;  import tonkadur.wyrd.v1.compiler.util.BinarySearch;  import tonkadur.wyrd.v1.compiler.util.InsertAt;  import tonkadur.wyrd.v1.compiler.util.If; @@ -49,6 +50,7 @@ import tonkadur.wyrd.v1.compiler.util.IfElse;  import tonkadur.wyrd.v1.compiler.util.InstructionManager;  import tonkadur.wyrd.v1.compiler.util.NOP;  import tonkadur.wyrd.v1.compiler.util.While; +import tonkadur.wyrd.v1.compiler.util.FilterLambda;  import tonkadur.wyrd.v1.compiler.util.Shuffle;  import tonkadur.wyrd.v1.compiler.util.Clear;  import tonkadur.wyrd.v1.compiler.util.MapLambda; @@ -56,6 +58,7 @@ import tonkadur.wyrd.v1.compiler.util.MergeLambda;  import tonkadur.wyrd.v1.compiler.util.IndexedMapLambda;  import tonkadur.wyrd.v1.compiler.util.IterativeSearch;  import tonkadur.wyrd.v1.compiler.util.RemoveAllOf; +import tonkadur.wyrd.v1.compiler.util.RemoveElementsOf;  import tonkadur.wyrd.v1.compiler.util.RemoveOneOf;  import tonkadur.wyrd.v1.compiler.util.ReverseList;  import tonkadur.wyrd.v1.compiler.util.RemoveAt; @@ -97,45 +100,95 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor     }     @Override +   public void visit_remove_elements_of +   ( +      final tonkadur.fate.v1.lang.instruction.RemoveElementsOf n +   ) +   throws Throwable +   { +      final ComputationCompiler collection_in_cc, collection_cc; + +      collection_cc = new ComputationCompiler(compiler); + +      n.get_target_collection().get_visited_by(collection_cc); + +      if (collection_cc.has_init()) +      { +         result.add(collection_cc.get_init()); +      } + +      collection_in_cc = new ComputationCompiler(compiler); + +      n.get_source_collection().get_visited_by(collection_in_cc); + +      if (collection_in_cc.has_init()) +      { +         result.add(collection_in_cc.get_init()); +      } + +      result.add +      ( +         RemoveElementsOf.generate +         ( +            compiler.registers(), +            compiler.assembler(), +            collection_in_cc.get_address(), +            collection_cc.get_address(), +            ( +               (tonkadur.fate.v1.lang.type.CollectionType) +               n.get_target_collection().get_type() +            ).is_set() +         ) +      ); + +      collection_cc.release_registers(result); +      collection_in_cc.release_registers(result); +   } + +   @Override     public void visit_add_elements_of     (        final tonkadur.fate.v1.lang.instruction.AddElementsOf n     )     throws Throwable     { -      final tonkadur.fate.v1.lang.meta.Instruction as_fate; +      final ComputationCompiler collection_in_cc, collection_cc; + +      collection_cc = new ComputationCompiler(compiler); +      n.get_target_collection().get_visited_by(collection_cc); -      as_fate = -         new tonkadur.fate.v1.lang.instruction.ForEach +      if (collection_cc.has_init()) +      { +         result.add(collection_cc.get_init()); +      } + +      collection_in_cc = new ComputationCompiler(compiler); + +      n.get_source_collection().get_visited_by(collection_in_cc); + +      if (collection_in_cc.has_init()) +      { +         result.add(collection_in_cc.get_init()); +      } + +      result.add +      ( +         AddElementsOf.generate           ( -            n.get_origin(), -            n.get_source_collection(), -            ".secret var of doom", -            Collections.singletonList +            compiler.registers(), +            compiler.assembler(), +            collection_in_cc.get_address(), +            collection_cc.get_address(),              ( -               tonkadur.fate.v1.lang.instruction.AddElement.build -               ( -                  n.get_origin(), -                  new tonkadur.fate.v1.lang.computation.VariableReference -                  ( -                     n.get_origin(), -                     new tonkadur.fate.v1.lang.Variable -                     ( -                        n.get_origin(), -                        ( -                           (tonkadur.fate.v1.lang.type.CollectionType) -                           n.get_source_collection().get_type() -                        ).get_content_type(), -                        ".secret var of doom" -                     ) -                  ), -                  n.get_target_collection() -               ) -            ) -         ); +               (tonkadur.fate.v1.lang.type.CollectionType) +               n.get_target_collection().get_type() +            ).is_set() +         ) +      ); -      as_fate.get_visited_by(this); +      collection_cc.release_registers(result); +      collection_in_cc.release_registers(result);     }     @Override @@ -664,7 +717,39 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor     )     throws Throwable     { -      /* TODO */ +      final ComputationCompiler lambda_cc, collection_cc; + +      lambda_cc = new ComputationCompiler(compiler); + +      n.get_lambda_function().get_visited_by(lambda_cc); + +      if (lambda_cc.has_init()) +      { +         result.add(lambda_cc.get_init()); +      } + +      collection_cc = new ComputationCompiler(compiler); + +      n.get_collection().get_visited_by(collection_cc); + +      if (collection_cc.has_init()) +      { +         result.add(collection_cc.get_init()); +      } + +      result.add +      ( +         FilterLambda.generate +         ( +            compiler.registers(), +            compiler.assembler(), +            lambda_cc.get_computation(), +            collection_cc.get_address() +         ) +      ); + +      lambda_cc.release_registers(result); +      collection_cc.release_registers(result);     }     @Override | 


