summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-09-18 22:05:23 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-09-18 22:05:23 +0200
commitac4764a532994f84f6c6fea379d91d0662ba5669 (patch)
tree609c922256b3412181cf55b36e067b3f3531a86a /src
parent53eae69e9a0368751f7abfe5308428973de9bc5e (diff)
...
Diffstat (limited to 'src')
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/AddressOperator.java1
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/Cast.java1
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/Constant.java1
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/SizeOperator.java1
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/SwitchValue.java1
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/VariableReference.java1
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/Free.java1
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElementsOf.java105
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java1
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java3
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java143
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