| 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 /src | |
| parent | 5e6cd5750d2e1c3b013eb04b6bd483dfa12a275e (diff) | |
Adds a real SetFields{,Computation} to Fate.
Diffstat (limited to 'src')
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 | 


