summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authornsensfel <SpamShield0@noot-noot.org>2020-09-14 17:45:53 +0200
committernsensfel <SpamShield0@noot-noot.org>2020-09-14 17:45:53 +0200
commit5e6cd5750d2e1c3b013eb04b6bd483dfa12a275e (patch)
tree86918287d5667cc34afda767c84e927496bd1004 /src
parent121042f223430aeab262634ecc59f86f08a35dc5 (diff)
...
Diffstat (limited to 'src')
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/SetFields.java94
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g437
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*