summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-09-14 19:56:51 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-09-14 19:56:51 +0200
commita702d0d6ea17b99fc7fd5af83e0eee6343e8d53b (patch)
tree4d17ede79baf8b055bfd8c3ede3f41c5aa0f0401
parent5e6cd5750d2e1c3b013eb04b6bd483dfa12a275e (diff)
Adds a real SetFields{,Computation} to Fate.
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/SetFieldsComputation.java89
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/SetFields.java54
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java3
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java3
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g481
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java9
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java11
7 files changed, 206 insertions, 44 deletions
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/SetFieldsComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/SetFieldsComputation.java
new file mode 100644
index 0000000..d9c66f6
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/SetFieldsComputation.java
@@ -0,0 +1,89 @@
+package tonkadur.fate.v1.lang.computation;
+
+import java.util.List;
+
+import tonkadur.parser.Origin;
+
+import tonkadur.functional.Cons;
+
+import tonkadur.fate.v1.lang.meta.ComputationVisitor;
+import tonkadur.fate.v1.lang.meta.Reference;
+import tonkadur.fate.v1.lang.meta.Computation;
+
+public class SetFieldsComputation extends Computation
+{
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final Reference target;
+ protected final List<Cons<String, Computation>> field_assignments;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ public SetFieldsComputation
+ (
+ final Origin origin,
+ final Reference target,
+ final List<Cons<String, Computation>> field_assignments
+ )
+ {
+ super(origin, target.get_type());
+
+ this.target = target;
+ this.field_assignments = field_assignments;
+ }
+
+ /**** Accessors ************************************************************/
+ @Override
+ public void get_visited_by (final ComputationVisitor cv)
+ throws Throwable
+ {
+ cv.visit_set_fields(this);
+ }
+
+ public Reference get_target ()
+ {
+ return target;
+ }
+
+ public List<Cons<String, Computation>> get_assignments ()
+ {
+ return field_assignments;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("(SetFieldsComputation");
+ sb.append(System.lineSeparator());
+ sb.append(System.lineSeparator());
+
+ sb.append("element:");
+ sb.append(System.lineSeparator());
+ sb.append(target.toString());
+ sb.append(System.lineSeparator());
+ sb.append(System.lineSeparator());
+
+ for (final Cons<String, Computation> assignment: field_assignments)
+ {
+ sb.append(assignment.get_car());
+ sb.append(": ");
+ sb.append(assignment.get_cdr());
+ sb.append(System.lineSeparator());
+
+ }
+
+ sb.append(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SetFields.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SetFields.java
index 3ff8254..db2fb73 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/SetFields.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SetFields.java
@@ -1,13 +1,15 @@
package tonkadur.fate.v1.lang.instruction;
+import java.util.List;
+
import tonkadur.parser.Origin;
-import tonkadur.parser.ParsingError;
+import tonkadur.functional.Cons;
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 SetFields extends Instruction
{
@@ -15,37 +17,27 @@ public class SetFields extends Instruction
/**** MEMBERS **************************************************************/
/***************************************************************************/
protected final Reference target;
- protected final List<String, Computation> field_assignments;
+ protected final List<Cons<String, Computation>> field_assignments;
/***************************************************************************/
/**** PROTECTED ************************************************************/
/***************************************************************************/
- /**** Constructors *********************************************************/
- protected SetFields
- (
- final Origin origin,
- final Reference target,
- final List<String, Computation> field_assignments
- )
- {
- super(origin);
-
- this.target = target;
- }
/***************************************************************************/
/**** PUBLIC ***************************************************************/
/***************************************************************************/
/**** Constructors *********************************************************/
- public static SetFields build
+ public SetFields
(
final Origin origin,
final Reference target,
- final List<FieldReference, Computation> field_assignments
+ final List<Cons<String, Computation>> field_assignments
)
- throws ParsingError
{
- return new SetFields(origin, element, value_reference);
+ super(origin);
+
+ this.target = target;
+ this.field_assignments = field_assignments;
}
/**** Accessors ************************************************************/
@@ -53,17 +45,17 @@ public class SetFields extends Instruction
public void get_visited_by (final InstructionVisitor iv)
throws Throwable
{
- iv.visit_set_value(this);
+ iv.visit_set_fields(this);
}
- public Computation get_value ()
+ public Reference get_target ()
{
- return element;
+ return target;
}
- public Computation get_reference ()
+ public List<Cons<String, Computation>> get_assignments ()
{
- return value_reference;
+ return field_assignments;
}
/**** Misc. ****************************************************************/
@@ -72,20 +64,24 @@ public class SetFields extends Instruction
{
final StringBuilder sb = new StringBuilder();
- sb.append(origin.toString());
sb.append("(SetFields");
sb.append(System.lineSeparator());
sb.append(System.lineSeparator());
sb.append("element:");
sb.append(System.lineSeparator());
- sb.append(element.toString());
+ sb.append(target.toString());
sb.append(System.lineSeparator());
sb.append(System.lineSeparator());
- sb.append("value_reference:");
- sb.append(System.lineSeparator());
- sb.append(value_reference.toString());
+ for (final Cons<String, Computation> assignment: field_assignments)
+ {
+ sb.append(assignment.get_car());
+ sb.append(": ");
+ sb.append(assignment.get_cdr());
+ sb.append(System.lineSeparator());
+
+ }
sb.append(")");
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 f40b2bf..1042abc 100644
--- a/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java
+++ b/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java
@@ -141,4 +141,7 @@ public interface ComputationVisitor
public void visit_pop_element (final PopElementComputation n)
throws Throwable;
+
+ public void visit_set_fields (final SetFieldsComputation n)
+ throws Throwable;
}
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 22bedb1..c422956 100644
--- a/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java
+++ b/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java
@@ -130,4 +130,7 @@ public interface InstructionVisitor
public void visit_set_value (final SetValue n)
throws Throwable;
+
+ public void visit_set_fields (final SetFields 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 bf1d207..9619283 100644
--- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
+++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
@@ -1015,7 +1015,9 @@ returns [Instruction result]
/*
* A bit of a lazy solution: build field references, then extract the data
*/
- final List<Cons<FieldReference, Computation>> assignments;
+ final List<Cons<String, Computation>> assignments;
+
+ assignments = new ArrayList<Cons<String, Computation>>();
for
(
@@ -1023,30 +1025,33 @@ returns [Instruction result]
($field_value_list.result)
)
{
- assignments.add
- (
- new Cons<FieldReference, Computation>
+ final FieldReference fr;
+ final Computation cp;
+
+ fr =
+ FieldReference.build
(
- FieldReference.build
- (
- entry.get_car(),
- ($value_reference.result),
- entry.get_cdr().get_car()
- ),
- entry.get_cdr().get_cdr()
- )
- );
+ entry.get_car(),
+ ($value_reference.result),
+ entry.get_cdr().get_car()
+ );
+
+ cp = entry.get_cdr().get_cdr();
+
+ RecurrentChecks.assert_can_be_used_as(cp, fr.get_type());
+
+ assignments.add(new Cons(fr.get_field_name(), cp));
}
$result =
- SetFields.build
+ new SetFields
(
CONTEXT.get_origin_at
(
($IMP_SET_FIELDS_KW.getLine()),
($IMP_SET_FIELDS_KW.getCharPositionInLine())
),
- ($value_reference),
+ ($value_reference.result),
assignments
);
}
@@ -3691,6 +3696,52 @@ returns [Computation result]
);
}
+ | SET_FIELDS_KW value_reference WS* field_value_list WS* R_PAREN
+ {
+ /*
+ * A bit of a lazy solution: build field references, then extract the data
+ */
+ final List<Cons<String, Computation>> assignments;
+
+ assignments = new ArrayList<Cons<String, Computation>>();
+
+ for
+ (
+ final Cons<Origin, Cons<String, Computation>> entry:
+ ($field_value_list.result)
+ )
+ {
+ final FieldReference fr;
+ final Computation cp;
+
+ fr =
+ FieldReference.build
+ (
+ entry.get_car(),
+ ($value_reference.result),
+ entry.get_cdr().get_car()
+ );
+
+ cp = entry.get_cdr().get_cdr();
+
+ RecurrentChecks.assert_can_be_used_as(cp, fr.get_type());
+
+ assignments.add(new Cons(fr.get_field_name(), cp));
+ }
+
+ $result =
+ new SetFieldsComputation
+ (
+ CONTEXT.get_origin_at
+ (
+ ($SET_FIELDS_KW.getLine()),
+ ($SET_FIELDS_KW.getCharPositionInLine())
+ ),
+ ($value_reference.result),
+ assignments
+ );
+ }
+
| value_reference
{
$result = ($value_reference.result);
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 936ab5e..78047a3 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
@@ -2061,4 +2061,13 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
{
/* TODO */
}
+
+ @Override
+ public void visit_set_fields
+ (
+ final tonkadur.fate.v1.lang.computation.SetFieldsComputation n
+ )
+ {
+ /* TODO */
+ }
}
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 297ad14..7ca4652 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
@@ -590,6 +590,17 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
}
@Override
+ public void visit_set_fields
+ (
+ final tonkadur.fate.v1.lang.instruction.SetFields n
+ )
+ throws Throwable
+ {
+ /* TODO */
+ }
+
+
+ @Override
public void visit_map
(
final tonkadur.fate.v1.lang.instruction.Map n