| summaryrefslogtreecommitdiff |
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-12-05 02:04:24 +0100 |
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-12-05 02:04:24 +0100 |
| commit | d597bdec8c47fd388fb056f6a3238be23bd509b6 (patch) | |
| tree | 03ac33936d77aa1fbe627fabdddfab0800acc3f2 /src | |
| parent | 2ec3d993e86f64db38df970dbccfa2eacbc86de4 (diff) | |
Working on the merge operator...
Diffstat (limited to 'src')
4 files changed, 37 insertions, 21 deletions
diff --git a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 index c2ed078..10bb692 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 @@ -98,6 +98,12 @@ INDEXED_MERGE_TO_LIST_KW : L_PAREN 'indexed'US'merge'US'to'US'list' SEP+; INDEXED_MERGE_TO_SET_KW : L_PAREN 'indexed'US'merge'US'to'US'set' SEP+; IMP_MERGE_KW : L_PAREN 'merge!' SEP+; IMP_INDEXED_MERGE_KW : L_PAREN 'indexed'US'merge!' SEP+; +SAFE_MERGE_TO_LIST_KW : L_PAREN 'safe'US'merge'US'to'US'list' SEP+; +SAFE_MERGE_TO_SET_KW : L_PAREN 'safe'US'merge'US'to'US'set' SEP+; +SAFE_INDEXED_MERGE_TO_LIST_KW : L_PAREN (('safe'US'indexed')|('indexed'US'safe'))US'merge'US'to'US'list' SEP+; +SAFE_INDEXED_MERGE_TO_SET_KW : L_PAREN (('safe'US'indexed')|('indexed'US'safe'))US'merge'US'to'US'set' SEP+; +SAFE_IMP_MERGE_KW : L_PAREN 'safe'US'merge!' SEP+; +SAFE_IMP_INDEXED_MERGE_KW : L_PAREN (('indexed'US'safe')|('safe'US'indexed'))US'merge!' SEP+; NEWLINE_KW: L_PAREN 'newline)'; NEW_KW: L_PAREN ('new'|'reserve'|'create') SEP+; NOT_KW: L_PAREN ('not'|'~'|'!') SEP+; diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 index 2ea8bc4..4d791e3 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 @@ -1044,7 +1044,7 @@ returns [Instruction result] ); } - | IMP_MERGE_KW + | SAFE_IMP_MERGE_KW fun=non_text_value WS+ def0=value WS+ value_reference WS+ @@ -1057,8 +1057,8 @@ returns [Instruction result] ( CONTEXT.get_origin_at ( - ($IMP_MERGE_KW.getLine()), - ($IMP_MERGE_KW.getCharPositionInLine()) + ($SAFE_IMP_MERGE_KW.getLine()), + ($SAFE_IMP_MERGE_KW.getCharPositionInLine()) ), ($fun.result), ($value_reference.result), @@ -1069,7 +1069,7 @@ returns [Instruction result] ); } - | IMP_MERGE_KW + | SAFE_IMP_MERGE_KW fun=non_text_value WS+ def0=value WS+ value_reference WS+ @@ -1083,8 +1083,8 @@ returns [Instruction result] ( CONTEXT.get_origin_at ( - ($IMP_MERGE_KW.getLine()), - ($IMP_MERGE_KW.getCharPositionInLine()) + ($SAFE_IMP_MERGE_KW.getLine()), + ($SAFE_IMP_MERGE_KW.getCharPositionInLine()) ), ($fun.result), ($value_reference.result), @@ -4392,7 +4392,7 @@ returns [Computation result] ); } - | MERGE_TO_LIST_KW + | SAFE_MERGE_TO_LIST_KW fun=non_text_value WS+ def0=value WS+ inv0=non_text_value WS+ @@ -4405,8 +4405,8 @@ returns [Computation result] ( CONTEXT.get_origin_at ( - ($MERGE_TO_LIST_KW.getLine()), - ($MERGE_TO_LIST_KW.getCharPositionInLine()) + ($SAFE_MERGE_TO_LIST_KW.getLine()), + ($SAFE_MERGE_TO_LIST_KW.getCharPositionInLine()) ), ($fun.result), ($inv0.result), @@ -4418,7 +4418,7 @@ returns [Computation result] ); } - | MERGE_TO_LIST_KW + | SAFE_MERGE_TO_LIST_KW fun=non_text_value WS+ def0=value WS+ inv0=non_text_value WS+ @@ -4432,8 +4432,8 @@ returns [Computation result] ( CONTEXT.get_origin_at ( - ($MERGE_TO_LIST_KW.getLine()), - ($MERGE_TO_LIST_KW.getCharPositionInLine()) + ($SAFE_MERGE_TO_LIST_KW.getLine()), + ($SAFE_MERGE_TO_LIST_KW.getCharPositionInLine()) ), ($fun.result), ($inv0.result), @@ -4539,7 +4539,7 @@ returns [Computation result] ); } - | MERGE_TO_SET_KW + | SAFE_MERGE_TO_SET_KW fun=non_text_value WS+ def0=value WS+ inv0=non_text_value WS+ @@ -4552,8 +4552,8 @@ returns [Computation result] ( CONTEXT.get_origin_at ( - ($MERGE_TO_SET_KW.getLine()), - ($MERGE_TO_SET_KW.getCharPositionInLine()) + ($SAFE_MERGE_TO_SET_KW.getLine()), + ($SAFE_MERGE_TO_SET_KW.getCharPositionInLine()) ), ($fun.result), ($inv0.result), @@ -4565,7 +4565,7 @@ returns [Computation result] ); } - | MERGE_TO_SET_KW + | SAFE_MERGE_TO_SET_KW fun=non_text_value WS+ def0=value WS+ inv0=non_text_value WS+ @@ -4579,8 +4579,8 @@ returns [Computation result] ( CONTEXT.get_origin_at ( - ($MERGE_TO_SET_KW.getLine()), - ($MERGE_TO_SET_KW.getCharPositionInLine()) + ($SAFE_MERGE_TO_SET_KW.getLine()), + ($SAFE_MERGE_TO_SET_KW.getCharPositionInLine()) ), ($fun.result), ($inv0.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 2587769..9fb288d 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 @@ -2951,7 +2951,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ) throws Throwable { - if (n.get_default_a() == null) + if (n.get_default_a() != null) { visit_merge_with_defaults(n); 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 147f2f1..2f82d3c 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 @@ -890,10 +890,9 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ) throws Throwable { - /* TODO: handle default values. */ /* This is one dangerous operation to do in-place, so we don't. */ - if (n.get_default_a() == null) + if (n.get_default_a() != null) { visit_merge_with_defaults(n); return; @@ -938,6 +937,17 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor new SetValue(holder.get_address(), collection_cc.get_computation()) ); + result.add + ( + Clear.generate + ( + compiler.registers(), + compiler.assembler(), + collection_cc.get_address() + ) + ); + + in_collection_b_cc = new ComputationCompiler(compiler); n.get_collection_in_b().get_visited_by(in_collection_b_cc); |


