From 5e6cd5750d2e1c3b013eb04b6bd483dfa12a275e Mon Sep 17 00:00:00 2001 From: nsensfel Date: Mon, 14 Sep 2020 17:45:53 +0200 Subject: ... --- .../fate/v1/lang/instruction/SetFields.java | 94 ++++++++++++++++++++++ src/core/src/tonkadur/fate/v1/parser/FateParser.g4 | 37 ++++----- 2 files changed, 113 insertions(+), 18 deletions(-) create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/SetFields.java 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 field_assignments; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + protected SetFields + ( + final Origin origin, + final Reference target, + final List field_assignments + ) + { + super(origin); + + this.target = target; + } + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + public static SetFields build + ( + final Origin origin, + final Reference target, + final List 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 operations; - - origin = - CONTEXT.get_origin_at - ( - ($IMP_SET_FIELDS_KW.getLine()), - ($IMP_SET_FIELDS_KW.getCharPositionInLine()) - ); - - operations = new ArrayList(); + /* + * A bit of a lazy solution: build field references, then extract the data + */ + final List> assignments; for ( @@ -1031,23 +1023,32 @@ returns [Instruction result] ($field_value_list.result) ) { - operations.add + assignments.add ( - SetValue.build + new Cons ( - 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* -- cgit v1.2.3-70-g09d2