| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src')
19 files changed, 463 insertions, 92 deletions
| 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); +   } +} | 


