| summaryrefslogtreecommitdiff |
diff options
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 |


