| summaryrefslogtreecommitdiff |
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-09-14 19:56:51 +0200 |
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-09-14 19:56:51 +0200 |
| commit | a702d0d6ea17b99fc7fd5af83e0eee6343e8d53b (patch) | |
| tree | 4d17ede79baf8b055bfd8c3ede3f41c5aa0f0401 | |
| parent | 5e6cd5750d2e1c3b013eb04b6bd483dfa12a275e (diff) | |
Adds a real SetFields{,Computation} to Fate.
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 |


