| summaryrefslogtreecommitdiff |
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-09-15 22:22:49 +0200 |
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-09-15 22:22:49 +0200 |
| commit | ce433e51aa644e416f961125a0f690cac76b21a4 (patch) | |
| tree | 8afa19d74cb0df208aa42cde996acf33381bff2c | |
| parent | 2252812f48a5792aeeed2956dc54313a830b697e (diff) | |
Need to think on instruction ref vs comp vs ptr.
20 files changed, 510 insertions, 92 deletions
diff --git a/data/tests/extra_functionals.fate b/data/tests/extra_functionals.fate index de44c6f..44cd525 100644 --- a/data/tests/extra_functionals.fate +++ b/data/tests/extra_functionals.fate @@ -73,4 +73,51 @@ (set int_list_a (var int_list_c)) (reverse! int_list_a) (set int_list_b (reverse (range 0 50 5))) + +(global (list string) some_words_a) +(global (list string) some_words_b) +(global (set string) some_words_c) + +(set some_words + (map + (lambda ( (int i) ) + (switch 0 + ((% (var i) 5) Five) + ((% (var i) 4) Four) + ((% (var i) 3) Three) + ((% (var i) 2) Two) + None + ) + ) + (range 0 20 1) + ) +) +(map! + (lambda ( (int i) ) + (switch 0 + ((% (var i) 5) Five) + ((% (var i) 4) Four) + ((% (var i) 3) Three) + ((% (var i) 2) Two) + None + ) + ) + (range 0 20 1) + some_words_b +) + +(map! + (lambda ( (int i) ) + (switch 0 + ((% (var i) 5) Five) + ((% (var i) 4) Four) + ((% (var i) 3) Three) + ((% (var i) 2) Two) + None + ) + ) + (range 0 20 1) + some_words_c +) + (end) diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/AddElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/AddElement.java index e7dadb8..84828ca 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/AddElement.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/AddElement.java @@ -6,6 +6,7 @@ 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.Reference; import tonkadur.fate.v1.lang.meta.RecurrentChecks; public class AddElement extends Instruction @@ -14,7 +15,7 @@ public class AddElement extends Instruction /**** MEMBERS **************************************************************/ /***************************************************************************/ protected final Computation element; - protected final Computation collection; + protected final Reference collection; /***************************************************************************/ /**** PROTECTED ************************************************************/ @@ -24,7 +25,7 @@ public class AddElement extends Instruction ( final Origin origin, final Computation element, - final Computation collection + final Reference collection ) { super(origin); @@ -41,7 +42,7 @@ public class AddElement extends Instruction ( final Origin origin, final Computation element, - final Computation collection + final Reference collection ) throws ParsingError { @@ -58,7 +59,7 @@ public class AddElement extends Instruction iv.visit_add_element(this); } - public Computation get_collection () + public Reference get_collection () { return collection; } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/AddElementAt.java b/src/core/src/tonkadur/fate/v1/lang/instruction/AddElementAt.java index 156b54f..56329ed 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/AddElementAt.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/AddElementAt.java @@ -8,6 +8,7 @@ import tonkadur.fate.v1.lang.type.Type; 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.Reference; import tonkadur.fate.v1.lang.meta.RecurrentChecks; public class AddElementAt extends Instruction @@ -17,7 +18,7 @@ public class AddElementAt extends Instruction /***************************************************************************/ protected final Computation index; protected final Computation element; - protected final Computation collection; + protected final Reference collection; /***************************************************************************/ /**** PROTECTED ************************************************************/ @@ -28,7 +29,7 @@ public class AddElementAt extends Instruction final Origin origin, final Computation index, final Computation element, - final Computation collection + final Reference collection ) { super(origin); @@ -47,7 +48,7 @@ public class AddElementAt extends Instruction final Origin origin, final Computation index, final Computation element, - final Computation collection + final Reference collection ) throws ParsingError { @@ -65,7 +66,7 @@ public class AddElementAt extends Instruction iv.visit_add_element_at(this); } - public Computation get_collection () + public Reference get_collection () { return collection; } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/AddElementsOf.java b/src/core/src/tonkadur/fate/v1/lang/instruction/AddElementsOf.java index 2ffde59..f992c44 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/AddElementsOf.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/AddElementsOf.java @@ -8,6 +8,7 @@ import tonkadur.fate.v1.lang.type.CollectionType; 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 AddElementsOf extends Instruction @@ -15,7 +16,7 @@ public class AddElementsOf extends Instruction /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ - protected final Reference other_collection; + protected final Computation other_collection; protected final Reference collection; /***************************************************************************/ @@ -25,7 +26,7 @@ public class AddElementsOf extends Instruction protected AddElementsOf ( final Origin origin, - final Reference other_collection, + final Computation other_collection, final Reference collection ) { @@ -42,7 +43,7 @@ public class AddElementsOf extends Instruction public static AddElementsOf build ( final Origin origin, - final Reference other_collection, + final Computation other_collection, final Reference collection ) throws ParsingError @@ -67,7 +68,7 @@ public class AddElementsOf extends Instruction iv.visit_add_elements_of(this); } - public Reference get_source_collection () + public Computation get_source_collection () { return other_collection; } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/ForEach.java b/src/core/src/tonkadur/fate/v1/lang/instruction/ForEach.java index cd1c4d0..c3c049b 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/ForEach.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/ForEach.java @@ -13,7 +13,7 @@ import tonkadur.fate.v1.lang.type.Type; 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 ForEach extends Instruction @@ -21,7 +21,7 @@ public class ForEach extends Instruction /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ - protected final Reference collection; + protected final Computation collection; protected final String var_name; protected final List<Instruction> body; @@ -32,7 +32,7 @@ public class ForEach extends Instruction public ForEach ( final Origin origin, - final Reference collection, + final Computation collection, final String var_name, final List<Instruction> body ) @@ -52,7 +52,7 @@ public class ForEach extends Instruction iv.visit_for_each(this); } - public Reference get_collection () + public Computation get_collection () { return collection; } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMap.java b/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMap.java index 5040987..950418e 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMap.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/IndexedMap.java @@ -21,7 +21,7 @@ public class IndexedMap extends Instruction /**** MEMBERS **************************************************************/ /***************************************************************************/ protected final Computation lambda_function; - protected final Reference collection_in; + protected final Computation collection_in; protected final Reference collection_out; /***************************************************************************/ @@ -32,7 +32,7 @@ public class IndexedMap extends Instruction ( final Origin origin, final Computation lambda_function, - final Reference collection_in, + final Computation collection_in, final Reference collection_out ) { @@ -51,7 +51,7 @@ public class IndexedMap extends Instruction ( final Origin origin, final Computation lambda_function, - final Reference collection_in, + final Computation collection_in, final Reference collection_out ) throws Throwable @@ -93,7 +93,7 @@ public class IndexedMap extends Instruction return lambda_function; } - public Reference get_collection_in () + public Computation get_collection_in () { return collection_in; } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Map.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Map.java index 46a728c..cba32f5 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Map.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Map.java @@ -21,7 +21,7 @@ public class Map extends Instruction /**** MEMBERS **************************************************************/ /***************************************************************************/ protected final Computation lambda_function; - protected final Reference collection_in; + protected final Computation collection_in; protected final Reference collection_out; /***************************************************************************/ @@ -32,7 +32,7 @@ public class Map extends Instruction ( final Origin origin, final Computation lambda_function, - final Reference collection_in, + final Computation collection_in, final Reference collection_out ) { @@ -51,7 +51,7 @@ public class Map extends Instruction ( final Origin origin, final Computation lambda_function, - final Reference collection_in, + final Computation collection_in, final Reference collection_out ) throws ParsingError @@ -84,7 +84,7 @@ public class Map extends Instruction return lambda_function; } - public Reference get_collection_in () + public Computation get_collection_in () { return collection_in; } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java index 1dd9b91..e070cdc 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Merge.java @@ -21,9 +21,9 @@ public class Merge extends Instruction /**** MEMBERS **************************************************************/ /***************************************************************************/ protected final Computation lambda_function; - protected final Reference collection_in_a; + protected final Computation collection_in_a; protected final Computation default_a; - protected final Reference collection_in_b; + protected final Computation collection_in_b; protected final Computation default_b; protected final Reference collection_out; @@ -35,9 +35,9 @@ public class Merge extends Instruction ( final Origin origin, final Computation lambda_function, - final Reference collection_in_a, + final Computation collection_in_a, final Computation default_a, - final Reference collection_in_b, + final Computation collection_in_b, final Computation default_b, final Reference collection_out ) @@ -60,9 +60,9 @@ public class Merge extends Instruction ( final Origin origin, final Computation lambda_function, - final Reference collection_in_a, + final Computation collection_in_a, final Computation default_a, - final Reference collection_in_b, + final Computation collection_in_b, final Computation default_b, final Reference collection_out ) @@ -135,7 +135,7 @@ public class Merge extends Instruction return lambda_function; } - public Reference get_collection_in_a () + public Computation get_collection_in_a () { return collection_in_a; } @@ -145,7 +145,7 @@ public class Merge extends Instruction return default_a; } - public Reference get_collection_in_b () + public Computation get_collection_in_b () { return collection_in_b; } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/PopElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/PopElement.java index 9ea468f..4d64652 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/PopElement.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/PopElement.java @@ -3,8 +3,12 @@ package tonkadur.fate.v1.lang.instruction; import tonkadur.parser.Origin; import tonkadur.parser.ParsingError; +import tonkadur.fate.v1.lang.type.PointerType; +import tonkadur.fate.v1.lang.type.CollectionType; + 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; @@ -13,7 +17,8 @@ public class PopElement extends Instruction /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ - protected final Computation collection; + protected final Computation storage_ptr; + protected final Reference collection; protected final boolean is_from_left; /***************************************************************************/ @@ -23,12 +28,14 @@ public class PopElement extends Instruction protected PopElement ( final Origin origin, - final Computation collection, + final Computation storage_ptr, + final Reference collection, final boolean is_from_left ) { super(origin); + this.storage_ptr = storage_ptr; this.collection = collection; this.is_from_left = is_from_left; } @@ -40,14 +47,25 @@ public class PopElement extends Instruction public static PopElement build ( final Origin origin, - final Computation collection, + final Computation storage_ptr, + final Reference collection, final boolean is_from_left ) throws ParsingError { RecurrentChecks.assert_is_a_collection(collection); + RecurrentChecks.assert_can_be_used_as + ( + storage_ptr, + new PointerType + ( + origin, + ((CollectionType) collection.get_type()).get_content_type(), + "auto generated" + ) + ); - return new PopElement(origin, collection, is_from_left); + return new PopElement(origin, storage_ptr, collection, is_from_left); } /**** Accessors ************************************************************/ @@ -58,11 +76,16 @@ public class PopElement extends Instruction iv.visit_pop_element(this); } - public Computation get_collection () + public Reference get_collection () { return collection; } + public Computation get_storage_pointer () + { + return storage_ptr; + } + public boolean is_from_left () { return is_from_left; @@ -85,6 +108,8 @@ public class PopElement extends Instruction sb.append(collection.toString()); + sb.append(" "); + sb.append(storage_ptr.toString()); sb.append(")"); return sb.toString(); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/PushElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/PushElement.java index 0ab34d4..f07ef89 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/PushElement.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/PushElement.java @@ -6,6 +6,7 @@ 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.Reference; import tonkadur.fate.v1.lang.meta.RecurrentChecks; public class PushElement extends Instruction @@ -14,7 +15,7 @@ public class PushElement extends Instruction /**** MEMBERS **************************************************************/ /***************************************************************************/ protected final Computation element; - protected final Computation collection; + protected final Reference collection; protected final boolean is_from_left; /***************************************************************************/ @@ -25,7 +26,7 @@ public class PushElement extends Instruction ( final Origin origin, final Computation element, - final Computation collection, + final Reference collection, final boolean is_from_left ) { @@ -44,7 +45,7 @@ public class PushElement extends Instruction ( final Origin origin, final Computation element, - final Computation collection, + final Reference collection, final boolean is_from_left ) throws ParsingError @@ -62,7 +63,7 @@ public class PushElement extends Instruction iv.visit_push_element(this); } - public Computation get_collection () + public Reference get_collection () { return collection; } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElement.java index 040ef99..d2a2e50 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElement.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElement.java @@ -6,6 +6,7 @@ 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.Reference; import tonkadur.fate.v1.lang.meta.RecurrentChecks; public class RemoveElement extends Instruction @@ -14,7 +15,7 @@ public class RemoveElement extends Instruction /**** MEMBERS **************************************************************/ /***************************************************************************/ protected final Computation element; - protected final Computation collection; + protected final Reference collection; /***************************************************************************/ /**** PROTECTED ************************************************************/ @@ -24,7 +25,7 @@ public class RemoveElement extends Instruction ( final Origin origin, final Computation element, - final Computation collection + final Reference collection ) { super(origin); @@ -41,7 +42,7 @@ public class RemoveElement extends Instruction ( final Origin origin, final Computation element, - final Computation collection + final Reference collection ) throws ParsingError { @@ -63,7 +64,7 @@ public class RemoveElement extends Instruction return element; } - public Computation get_collection () + public Reference get_collection () { return collection; } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/ReverseList.java b/src/core/src/tonkadur/fate/v1/lang/instruction/ReverseList.java index 9d84ee4..79caeac 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/ReverseList.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/ReverseList.java @@ -5,7 +5,7 @@ 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.Reference; import tonkadur.fate.v1.lang.meta.RecurrentChecks; public class ReverseList extends Instruction @@ -13,7 +13,7 @@ public class ReverseList extends Instruction /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ - protected final Computation collection; + protected final Reference collection; /***************************************************************************/ /**** PROTECTED ************************************************************/ @@ -22,7 +22,7 @@ public class ReverseList extends Instruction protected ReverseList ( final Origin origin, - final Computation collection + final Reference collection ) { super(origin); @@ -37,7 +37,7 @@ public class ReverseList extends Instruction public static ReverseList build ( final Origin origin, - final Computation collection + final Reference collection ) throws ParsingError { @@ -54,7 +54,7 @@ public class ReverseList extends Instruction iv.visit_reverse_list(this); } - public Computation get_collection () + public Reference get_collection () { return collection; } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java index 5983c03..bdad43d 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java @@ -7,6 +7,7 @@ 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.Reference; import tonkadur.fate.v1.lang.meta.RecurrentChecks; public class SetValue extends Instruction @@ -15,7 +16,7 @@ public class SetValue extends Instruction /**** MEMBERS **************************************************************/ /***************************************************************************/ protected final Computation element; - protected final Computation value_reference; + protected final Reference value_reference; /***************************************************************************/ /**** PROTECTED ************************************************************/ @@ -25,7 +26,7 @@ public class SetValue extends Instruction ( final Origin origin, final Computation element, - final Computation value_reference + final Reference value_reference ) { super(origin); @@ -42,7 +43,7 @@ public class SetValue extends Instruction ( final Origin origin, final Computation element, - final Computation value_reference + final Reference value_reference ) throws ParsingError { @@ -64,7 +65,7 @@ public class SetValue extends Instruction return element; } - public Computation get_reference () + public Reference get_reference () { return value_reference; } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Shuffle.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Shuffle.java index 82e746d..bf12da6 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Shuffle.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Shuffle.java @@ -1,13 +1,11 @@ package tonkadur.fate.v1.lang.instruction; -import tonkadur.error.ErrorManager; - 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.Reference; import tonkadur.fate.v1.lang.meta.RecurrentChecks; public class Shuffle extends Instruction @@ -15,7 +13,7 @@ public class Shuffle extends Instruction /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ - protected final Computation collection; + protected final Reference collection; /***************************************************************************/ /**** PROTECTED ************************************************************/ @@ -24,7 +22,7 @@ public class Shuffle extends Instruction protected Shuffle ( final Origin origin, - final Computation collection + final Reference collection ) { super(origin); @@ -39,7 +37,7 @@ public class Shuffle extends Instruction public static Shuffle build ( final Origin origin, - final Computation collection + final Reference collection ) throws ParsingError { @@ -56,7 +54,7 @@ public class Shuffle extends Instruction iv.visit_shuffle(this); } - public Computation get_collection () + public Reference get_collection () { return collection; } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SubList.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SubList.java index 918d6e0..b2e5176 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/SubList.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SubList.java @@ -18,7 +18,7 @@ public class SubList extends Instruction /***************************************************************************/ protected final Computation start; protected final Computation end; - protected final Reference collection_in; + protected final Computation collection_in; protected final Reference collection_out; /***************************************************************************/ @@ -30,7 +30,7 @@ public class SubList extends Instruction final Origin origin, final Computation start, final Computation end, - final Reference collection_in, + final Computation collection_in, final Reference collection_out ) { @@ -51,7 +51,7 @@ public class SubList extends Instruction final Origin origin, final Computation start, final Computation end, - final Reference collection_in, + final Computation collection_in, final Reference collection_out ) throws Throwable @@ -87,7 +87,7 @@ public class SubList extends Instruction return end; } - public Reference get_collection_in () + public Computation get_collection_in () { return collection_in; } diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 index 6d65e0a..f914451 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 @@ -610,7 +610,7 @@ returns [Instruction result] } | IMP_ADD_ALL_KW - source=value_reference WS+ + sourcev=value WS+ target=value_reference WS* R_PAREN { @@ -622,7 +622,7 @@ returns [Instruction result] ($IMP_ADD_ALL_KW.getLine()), ($IMP_ADD_ALL_KW.getCharPositionInLine()) ), - ($source.result), + ($sourcev.result), ($target.result) ); } @@ -773,7 +773,7 @@ returns [Instruction result] ); } - | IMP_POP_RIGHT_KW value_reference WS* R_PAREN + | IMP_POP_RIGHT_KW value_reference WS+ value WS* R_PAREN { $result = PopElement.build @@ -783,12 +783,13 @@ returns [Instruction result] ($IMP_POP_RIGHT_KW.getLine()), ($IMP_POP_RIGHT_KW.getCharPositionInLine()) ), + ($value.result), ($value_reference.result), false ); } - | IMP_POP_LEFT_KW value_reference WS* R_PAREN + | IMP_POP_LEFT_KW value_reference WS+ value WS* R_PAREN { $result = PopElement.build @@ -798,14 +799,15 @@ returns [Instruction result] ($IMP_POP_LEFT_KW.getLine()), ($IMP_POP_LEFT_KW.getCharPositionInLine()) ), + ($value.result), ($value_reference.result), true ); } | IMP_MAP_KW - value WS+ - inr=value_reference WS+ + fun=value WS+ + in=value WS+ outr=value_reference WS* R_PAREN { @@ -817,15 +819,15 @@ returns [Instruction result] ($IMP_MAP_KW.getLine()), ($IMP_MAP_KW.getCharPositionInLine()) ), - ($value.result), - ($inr.result), + ($fun.result), + ($in.result), ($outr.result) ); } | IMP_INDEXED_MAP_KW - value WS+ - inr=value_reference WS+ + fun=value WS+ + in=value WS+ outr=value_reference WS* R_PAREN { @@ -837,8 +839,8 @@ returns [Instruction result] ($IMP_INDEXED_MAP_KW.getLine()), ($IMP_INDEXED_MAP_KW.getCharPositionInLine()) ), - ($value.result), - ($inr.result), + ($fun.result), + ($in.result), ($outr.result) ); } @@ -846,8 +848,8 @@ returns [Instruction result] | IMP_MERGE_KW fun=value WS+ - inr0=value_reference WS+ - inr1=value_reference WS+ + inv0=value WS+ + inv1=value WS+ outr=value_reference WS* R_PAREN { @@ -860,9 +862,9 @@ returns [Instruction result] ($IMP_MERGE_KW.getCharPositionInLine()) ), ($fun.result), - ($inr0.result), + ($inv0.result), null, - ($inr1.result), + ($inv1.result), null, ($outr.result) ); @@ -871,9 +873,9 @@ returns [Instruction result] | IMP_MERGE_KW fun=value WS+ def0=value WS+ - inr0=value_reference WS+ + inv0=value WS+ def1=value WS+ - inr1=value_reference WS+ + inv1=value WS+ outr=value_reference WS* R_PAREN { @@ -886,9 +888,9 @@ returns [Instruction result] ($IMP_MERGE_KW.getCharPositionInLine()) ), ($fun.result), - ($inr0.result), + ($inv0.result), ($def0.result), - ($inr1.result), + ($inv1.result), ($def1.result), ($outr.result) ); @@ -897,7 +899,7 @@ returns [Instruction result] | IMP_SUB_LIST_KW vstart=value WS+ vend=value WS+ - inr=value_reference WS+ + inv=value WS+ outr=value_reference WS* R_PAREN { @@ -911,7 +913,7 @@ returns [Instruction result] ), ($vstart.result), ($vend.result), - ($inr.result), + ($inv.result), ($outr.result) ); } @@ -1161,7 +1163,7 @@ returns [Instruction result] } | FOR_EACH_KW - value_reference WS+ new_reference_name + coll=value WS+ new_reference_name { final Map<String, Variable> variable_map; final Variable new_variable; @@ -1170,7 +1172,7 @@ returns [Instruction result] elem_type = Type.ANY; - collection_type = ($value_reference.result).get_type(); + collection_type = ($coll.result).get_type(); if (collection_type instanceof CollectionType) { @@ -1251,7 +1253,7 @@ returns [Instruction result] ($FOR_EACH_KW.getLine()), ($FOR_EACH_KW.getCharPositionInLine()) ), - ($value_reference.result), + ($coll.result), ($new_reference_name.result), ($general_fate_sequence.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 74489f8..0712319 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 @@ -29,6 +29,7 @@ import tonkadur.wyrd.v1.compiler.util.Shuffle; import tonkadur.wyrd.v1.compiler.util.RemoveAt; import tonkadur.wyrd.v1.compiler.util.InsertAt; import tonkadur.wyrd.v1.compiler.util.RemoveAllOf; +import tonkadur.wyrd.v1.compiler.util.MapLambda; import tonkadur.wyrd.v1.compiler.util.RemoveOneOf; import tonkadur.wyrd.v1.compiler.util.ReverseList; import tonkadur.wyrd.v1.compiler.util.CreateCons; @@ -2077,7 +2078,42 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ) throws Throwable { - /* TODO */ + final ComputationCompiler lambda_cc, in_collection_cc; + final Register result; + + result = reserve(TypeCompiler.compile(compiler, n.get_type())); + + result_as_address = result.get_address(); + result_as_computation = result.get_value(); + + lambda_cc = new ComputationCompiler(compiler); + + n.get_lambda_function().get_visited_by(lambda_cc); + + assimilate(lambda_cc); + + in_collection_cc = new ComputationCompiler(compiler); + + n.get_collection().get_visited_by(in_collection_cc); + + assimilate(in_collection_cc); + + init_instructions.add + ( + MapLambda.generate + ( + compiler.registers(), + compiler.assembler(), + lambda_cc.get_computation(), + in_collection_cc.get_address(), + result_as_address, + ( + (tonkadur.fate.v1.lang.type.CollectionType) + n.get_collection().get_type() + ).is_set() + ) + ); + } @Override 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 ba268f1..5d46b79 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 @@ -50,6 +50,7 @@ import tonkadur.wyrd.v1.compiler.util.NOP; import tonkadur.wyrd.v1.compiler.util.While; import tonkadur.wyrd.v1.compiler.util.Shuffle; import tonkadur.wyrd.v1.compiler.util.Clear; +import tonkadur.wyrd.v1.compiler.util.MapLambda; import tonkadur.wyrd.v1.compiler.util.IterativeSearch; import tonkadur.wyrd.v1.compiler.util.RemoveAllOf; import tonkadur.wyrd.v1.compiler.util.RemoveOneOf; @@ -652,7 +653,54 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ) throws Throwable { - /* TODO */ + final ComputationCompiler lambda_cc, in_collection_cc, out_collection_cc; + + lambda_cc = new ComputationCompiler(compiler); + + n.get_lambda_function().get_visited_by(lambda_cc); + + if (lambda_cc.has_init()) + { + result.add(lambda_cc.get_init()); + } + + in_collection_cc = new ComputationCompiler(compiler); + + n.get_collection_in().get_visited_by(in_collection_cc); + + if (in_collection_cc.has_init()) + { + result.add(in_collection_cc.get_init()); + } + + out_collection_cc = new ComputationCompiler(compiler); + + n.get_collection_out().get_visited_by(out_collection_cc); + + if (out_collection_cc.has_init()) + { + result.add(out_collection_cc.get_init()); + } + + result.add + ( + MapLambda.generate + ( + compiler.registers(), + compiler.assembler(), + lambda_cc.get_computation(), + in_collection_cc.get_address(), + out_collection_cc.get_address(), + ( + (tonkadur.fate.v1.lang.type.CollectionType) + n.get_collection_out().get_type() + ).is_set() + ) + ); + + lambda_cc.release_registers(result); + in_collection_cc.release_registers(result); + out_collection_cc.release_registers(result); } @Override diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/AddElement.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/AddElement.java new file mode 100644 index 0000000..8e8ae03 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/AddElement.java @@ -0,0 +1,114 @@ +package tonkadur.wyrd.v1.compiler.util; + +import java.util.List; +import java.util.ArrayList; + +import tonkadur.wyrd.v1.lang.Register; + +import tonkadur.wyrd.v1.lang.type.Type; + +import tonkadur.wyrd.v1.lang.meta.Computation; +import tonkadur.wyrd.v1.lang.meta.Instruction; + +import tonkadur.wyrd.v1.lang.computation.Cast; +import tonkadur.wyrd.v1.lang.computation.Operation; +import tonkadur.wyrd.v1.lang.computation.Address; +import tonkadur.wyrd.v1.lang.computation.RelativeAddress; +import tonkadur.wyrd.v1.lang.computation.ValueOf; +import tonkadur.wyrd.v1.lang.computation.Size; + +import tonkadur.wyrd.v1.lang.instruction.SetValue; +import tonkadur.wyrd.v1.lang.instruction.Initialize; + +import tonkadur.wyrd.v1.compiler.util.registers.RegisterManager; + +public class AddElement +{ + /* Utility Class */ + private AddElement () {} + public static Instruction generate + ( + final RegisterManager registers, + final InstructionManager assembler, + final Computation element, + final Address collection, + final boolean is_set + ) + { + final Register collection_size; + final List<Instruction> result; + + result = new ArrayList<Instruction>(); + + collection_size = registers.reserve(Type.INT, result); + + result.add + ( + new SetValue(collection_size.get_address(), new Size(collection)) + ); + + + if (is_set) + { + final Register found, index; + + index = registers.reserve(Type.INT, result); + found = registers.reserve(Type.BOOL, result); + + result.add + ( + BinarySearch.generate + ( + registers, + assembler, + element, + collection_size.get_value(), + collection, + found.get_address(), + index.get_address() + ) + ); + + result.add + ( + If.generate + ( + registers, + assembler, + Operation.not(found.get_value()), + InsertAt.generate + ( + registers, + assembler, + index.get_address(), + element, + collection_size.get_value(), + collection + ) + ) + ); + + registers.release(index, result); + registers.release(found, result); + } + else + { + final Address new_elem_addr; + + new_elem_addr = + new RelativeAddress + ( + collection, + new Cast(collection_size.get_value(), Type.STRING), + element.get_type() + ); + + result.add(new Initialize(new_elem_addr)); + result.add(new SetValue(new_elem_addr, element)); + } + + registers.release(collection_size, result); + + return assembler.merge(result); + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/MapLambda.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/MapLambda.java new file mode 100644 index 0000000..580bcb1 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/MapLambda.java @@ -0,0 +1,142 @@ +package tonkadur.wyrd.v1.compiler.util; + +import java.util.List; +import java.util.ArrayList; +import java.util.Collections; + +import tonkadur.wyrd.v1.lang.Register; + +import tonkadur.wyrd.v1.lang.type.Type; +import tonkadur.wyrd.v1.lang.type.MapType; + +import tonkadur.wyrd.v1.lang.meta.Instruction; +import tonkadur.wyrd.v1.lang.meta.Computation; + +import tonkadur.wyrd.v1.lang.computation.Cast; +import tonkadur.wyrd.v1.lang.computation.Constant; +import tonkadur.wyrd.v1.lang.computation.Operation; +import tonkadur.wyrd.v1.lang.computation.Address; +import tonkadur.wyrd.v1.lang.computation.RelativeAddress; +import tonkadur.wyrd.v1.lang.computation.ValueOf; +import tonkadur.wyrd.v1.lang.computation.Size; + +import tonkadur.wyrd.v1.lang.instruction.SetValue; + +import tonkadur.wyrd.v1.compiler.util.registers.RegisterManager; + +public class MapLambda +{ + /* Utility Class */ + private MapLambda () {} + + /* Uses Durstenfeld's shuffling algorithm */ + public static Instruction generate + ( + final RegisterManager registers, + final InstructionManager assembler, + final Computation lambda, + final Address collection_in, + final Address collection_out, + final boolean to_set + ) + { + final List<Computation> params; + final List<Instruction> result, while_body; + final Register iterator, collection_in_size, storage; + + params = new ArrayList<Computation>(); + result = new ArrayList<Instruction>(); + while_body = new ArrayList<Instruction>(); + + iterator = registers.reserve(Type.INT, result); + collection_in_size = registers.reserve(Type.INT, result); + storage = + registers.reserve + ( + ((MapType) collection_out.get_target_type()).get_member_type(), + result + ); + + result.add(new SetValue(iterator.get_address(), Constant.ZERO)); + result.add + ( + new SetValue + ( + collection_in_size.get_address(), + new Size(collection_in) + ) + ); + + params.add + ( + new ValueOf + ( + new RelativeAddress + ( + collection_in, + new Cast(iterator.get_value(), Type.STRING), + ( + (MapType) collection_in.get_target_type() + ).get_member_type() + ) + ) + ); + + while_body.add + ( + LambdaEvaluation.generate + ( + registers, + assembler, + lambda, + /* Can't put it in the target collection directly, since that may + * be a set. + */ + storage.get_address(), + params + ) + ); + + while_body.add + ( + AddElement.generate + ( + registers, + assembler, + storage.get_value(), + collection_out, + to_set + ) + ); + + while_body.add + ( + new SetValue + ( + iterator.get_address(), + Operation.plus(iterator.get_value(), Constant.ONE) + ) + ); + + result.add + ( + While.generate + ( + registers, + assembler, + Operation.less_than + ( + iterator.get_value(), + collection_in_size.get_value() + ), + assembler.merge(while_body) + ) + ); + + registers.release(iterator, result); + registers.release(collection_in_size, result); + registers.release(storage, result); + + return assembler.merge(result); + } +} |


