| summaryrefslogtreecommitdiff | 
diff options
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/lang/instruction/SetFields.java | 94 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/parser/FateParser.g4 | 37 | 
2 files changed, 113 insertions, 18 deletions
| diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SetFields.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SetFields.java new file mode 100644 index 0000000..3ff8254 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SetFields.java @@ -0,0 +1,94 @@ +package tonkadur.fate.v1.lang.instruction; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + + +import tonkadur.fate.v1.lang.meta.InstructionVisitor; +import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; + +public class SetFields extends Instruction +{ +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final Reference target; +   protected final List<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 +   ( +      final Origin origin, +      final Reference target, +      final List<FieldReference, Computation> field_assignments +   ) +   throws ParsingError +   { +      return new SetFields(origin, element, value_reference); +   } + +   /**** Accessors ************************************************************/ +   @Override +   public void get_visited_by (final InstructionVisitor iv) +   throws Throwable +   { +      iv.visit_set_value(this); +   } + +   public Computation get_value () +   { +      return element; +   } + +   public Computation get_reference () +   { +      return value_reference; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      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(System.lineSeparator()); +      sb.append(System.lineSeparator()); + +      sb.append("value_reference:"); +      sb.append(System.lineSeparator()); +      sb.append(value_reference.toString()); + +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 index 6d2501b..bf1d207 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 @@ -1012,18 +1012,10 @@ returns [Instruction result]     | IMP_SET_FIELDS_KW value_reference WS* field_value_list WS* R_PAREN     { -      /* FIXME: this should be a true Fate construct. */ -      final Origin origin; -      final List<Instruction> operations; - -      origin = -         CONTEXT.get_origin_at -         ( -            ($IMP_SET_FIELDS_KW.getLine()), -            ($IMP_SET_FIELDS_KW.getCharPositionInLine()) -         ); - -      operations = new ArrayList<Instruction>(); +      /* +       * A bit of a lazy solution: build field references, then extract the data +       */ +      final List<Cons<FieldReference, Computation>> assignments;        for        ( @@ -1031,23 +1023,32 @@ returns [Instruction result]              ($field_value_list.result)        )        { -         operations.add +         assignments.add           ( -            SetValue.build +            new Cons<FieldReference, Computation>              ( -               entry.get_car(), -               entry.get_cdr().get_cdr(),                 FieldReference.build                 (                    entry.get_car(),                    ($value_reference.result),                    entry.get_cdr().get_car() -               ) +               ), +               entry.get_cdr().get_cdr()              )           );        } -      $result = new InstructionList(origin, operations); +      $result = +         SetFields.build +         ( +            CONTEXT.get_origin_at +            ( +               ($IMP_SET_FIELDS_KW.getLine()), +               ($IMP_SET_FIELDS_KW.getCharPositionInLine()) +            ), +            ($value_reference), +            assignments +         );     }     | WHILE_KW value WS* | 


