| summaryrefslogtreecommitdiff | 
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-09-07 22:01:15 +0200 | 
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-09-07 22:01:15 +0200 | 
| commit | b9736f781266169a02c4833d4d87459781352e9c (patch) | |
| tree | 35952b9ba32b65c9eedc15e2060b31917824cbd1 /src/core | |
| parent | c4b0897e196dfdb685ee6c7aa542e7a0084db953 (diff) | |
...
Diffstat (limited to 'src/core')
8 files changed, 261 insertions, 31 deletions
| diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/CarCdr.java b/src/core/src/tonkadur/fate/v1/lang/computation/CarCdr.java index 1f5ad9c..58e099d 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/CarCdr.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/CarCdr.java @@ -37,6 +37,7 @@ public class CarCdr extends Computation        super(origin, type);        this.parent = parent; +      this.is_car = is_car;     }     /***************************************************************************/ @@ -78,7 +79,7 @@ public class CarCdr extends Computation           current_type = ((ConsType) current_type).get_cdr_type();        } -      return new CarCdr(origin, parent, current_type, is_car, field); +      return new CarCdr(origin, parent, is_car, current_type);     }     /**** Accessors ************************************************************/ diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/ConsComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/ConsComputation.java index 28f8f60..04d58ff 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/ConsComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/ConsComputation.java @@ -29,7 +29,7 @@ public class ConsComputation extends Computation        super        (           origin, -         new ConsType(origin, car.get_type(), cdr.get_type, "auto generated") +         new ConsType(origin, car.get_type(), cdr.get_type(), "auto generated")        );        this.car = car; @@ -44,7 +44,7 @@ public class ConsComputation extends Computation     public void get_visited_by (final ComputationVisitor cv)     throws Throwable     { -      cv.visit_cons_computation(this); +      cv.visit_cons(this);     }     public Computation get_car () diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Fold.java b/src/core/src/tonkadur/fate/v1/lang/computation/Fold.java index e7fd2cd..55f1877 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/Fold.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/Fold.java @@ -27,7 +27,7 @@ public class Fold extends Computation     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ -   protected final Reference lambda_function; +   protected final Computation lambda_function;     protected final Computation initial_value;     protected final Reference collection;     protected final boolean is_foldl; @@ -39,7 +39,7 @@ public class Fold extends Computation     protected Fold     (        final Origin origin, -      final Reference lambda_function, +      final Computation lambda_function,        final Computation initial_value,        final Reference collection,        final boolean is_foldl, @@ -61,7 +61,7 @@ public class Fold extends Computation     public static Fold build     (        final Origin origin, -      final Reference lambda_function, +      final Computation lambda_function,        final Computation initial_value,        final Reference collection,        final boolean is_foldl @@ -94,18 +94,14 @@ public class Fold extends Computation        signature = lambda_type.get_signature(); -      if -      ( -         (parameters.size() != signature.size()) -         || (parameters.size() != 2) -      ) +      if (signature.size() != 2)        {           ErrorManager.handle           (              new InvalidArityException              ( -               origin, -               parameters.size(), +               lambda_function.get_origin(), +               signature.size(),                 2,                 2              ) @@ -136,7 +132,7 @@ public class Fold extends Computation           /* TODO */        } -      if (!collection_type.get_member_type().can_be_used_as(signature.get(1))) +      if (!collection_type.get_content_type().can_be_used_as(signature.get(1)))        {           /* TODO */        } @@ -161,7 +157,7 @@ public class Fold extends Computation        cv.visit_fold(this);     } -   public Reference get_lambda_function_reference () +   public Computation get_lambda_function ()     {        return lambda_function;     } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Map.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Map.java new file mode 100644 index 0000000..228423c --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Map.java @@ -0,0 +1,215 @@ +package tonkadur.fate.v1.lang.instruction; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.error.ErrorManager; + +import tonkadur.fate.v1.error.IncompatibleTypeException; +import tonkadur.fate.v1.error.IncomparableTypeException; +import tonkadur.fate.v1.error.InvalidArityException; +import tonkadur.fate.v1.error.InvalidTypeException; + +import tonkadur.fate.v1.lang.type.Type; +import tonkadur.fate.v1.lang.type.LambdaType; +import tonkadur.fate.v1.lang.type.CollectionType; + +import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.InstructionVisitor; +import tonkadur.fate.v1.lang.meta.Reference; + +public class Map extends Instruction +{ +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final Computation lambda_function; +   protected final Reference collection_in; +   protected final Reference collection_out; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected Map +   ( +      final Origin origin, +      final Computation lambda_function, +      final Reference collection_in, +      final Reference collection_out +   ) +   { +      super(origin); + +      this.lambda_function = lambda_function; +      this.collection_in = collection_in; +      this.collection_out = collection_out; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   public static Map build +   ( +      final Origin origin, +      final Computation lambda_function, +      final Reference collection_in, +      final Reference collection_out +   ) +   throws Throwable +   { +      final Type var_type, collection_in_generic_type; +      final Type collection_out_generic_type; +      final CollectionType collection_in_type; +      final CollectionType collection_out_type; +      final LambdaType lambda_type; +      final List<Type> signature; + +      var_type = lambda_function.get_type(); + +      if (!(var_type instanceof LambdaType)) +      { +         ErrorManager.handle +         ( +            new InvalidTypeException +            ( +               origin, +               var_type, +               Collections.singleton(Type.LAMBDA) +            ) +         ); + +         return null; +      } + +      lambda_type = (LambdaType) var_type; + +      signature = lambda_type.get_signature(); + +      if (signature.size() != 1) +      { +         ErrorManager.handle +         ( +            new InvalidArityException +            ( +               lambda_function.get_origin(), +               signature.size(), +               1, +               1 +            ) +         ); +      } + +      collection_in_generic_type = collection_in.get_type(); + +      if (!(collection_in_generic_type instanceof CollectionType)) +      { +         ErrorManager.handle +         ( +            new InvalidTypeException +            ( +               collection_in.get_origin(), +               collection_in_generic_type, +               Type.COLLECTION_TYPES +            ) +         ); + +         return null; +      } + +      collection_in_type = (CollectionType) collection_in_generic_type; + +      if +      ( +         !collection_in_type.get_content_type().can_be_used_as(signature.get(0)) +      ) +      { +         /* TODO */ +      } + +      collection_out_generic_type = collection_out.get_type(); + +      if (!(collection_out_generic_type instanceof CollectionType)) +      { +         ErrorManager.handle +         ( +            new InvalidTypeException +            ( +               collection_out.get_origin(), +               collection_out_generic_type, +               Type.COLLECTION_TYPES +            ) +         ); + +         return null; +      } + +      collection_out_type = (CollectionType) collection_out_generic_type; + +      if +      ( +         !collection_out_type.get_content_type().can_be_used_as +         ( +            lambda_type.get_return_type() +         ) +      ) +      { +         /* TODO */ +      } + +      return +         new Map +         ( +            origin, +            lambda_function, +            collection_in, +            collection_out +         ); +   } + +   /**** Accessors ************************************************************/ +   @Override +   public void get_visited_by (final InstructionVisitor iv) +   throws Throwable +   { +      iv.visit_map(this); +   } + +   public Computation get_lambda_function () +   { +      return lambda_function; +   } + +   public Reference get_collection_in () +   { +      return collection_in; +   } + +   public Reference get_collection_out () +   { +      return collection_out; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append("(Map "); +      sb.append(lambda_function.toString()); +      sb.append(" "); +      sb.append(collection_in.toString()); +      sb.append(" "); +      sb.append(collection_out.toString()); +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java b/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java index 1cdbcf5..1c2fa85 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java @@ -16,6 +16,15 @@ public interface ComputationVisitor     public void visit_cast (final Cast n)     throws Throwable; +   public void visit_cons (final ConsComputation n) +   throws Throwable; + +   public void visit_fold (final Fold n) +   throws Throwable; + +   public void visit_car_cdr (final CarCdr n) +   throws Throwable; +     public void visit_cond_value (final CondValue n)     throws Throwable; diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java b/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java index 30acc7d..01ff4a4 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java @@ -47,6 +47,15 @@ public interface InstructionVisitor     public void visit_clear (final Clear c)     throws Throwable; +   public void visit_map (final Map c) +   throws Throwable; + +   public void visit_range (final Range c) +   throws Throwable; + +   public void visit_shuffle (final Shuffle c) +   throws Throwable; +     public void visit_reverse_list (final ReverseList n)     throws Throwable; diff --git a/src/core/src/tonkadur/fate/v1/lang/type/ConsType.java b/src/core/src/tonkadur/fate/v1/lang/type/ConsType.java index 1bcc17d..e01a91b 100644 --- a/src/core/src/tonkadur/fate/v1/lang/type/ConsType.java +++ b/src/core/src/tonkadur/fate/v1/lang/type/ConsType.java @@ -54,7 +54,7 @@ public class ConsType extends Type           return              car.can_be_used_as(dt.car) -            && cdr.can_be_used_as(dt.cdr) +            && cdr.can_be_used_as(dt.cdr);        }        return false; diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 index c4c9645..89ab79d 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 @@ -732,7 +732,7 @@ returns [Instruction result]     | MAP_KW value WS+ inr=value_reference WS+ outr=value_reference WS* R_PAREN     {        $result = -         Map.build +         tonkadur.fate.v1.lang.instruction.Map.build           (              CONTEXT.get_origin_at              ( @@ -784,8 +784,8 @@ returns [Instruction result]              ),              ($fun.result),              ($init.result), -            ($inr0.result) -            ($inr1.result) +            ($inr0.result), +            ($inr1.result),              ($outr.result)           );     } @@ -811,16 +811,16 @@ returns [Instruction result]              ($fun.result),              ($init.result),              ($def0.result), -            ($inr0.result) +            ($inr0.result),              ($def1.result), -            ($inr1.result) +            ($inr1.result),              ($outr.result)           );     }     | SUB_LIST_KW -      start=value WS+ -      end=value WS+ +      vstart=value WS+ +      vend=value WS+        inr=value_reference WS+        outr=value_reference WS*        R_PAREN @@ -833,8 +833,8 @@ returns [Instruction result]                 ($SUB_LIST_KW.getLine()),                 ($SUB_LIST_KW.getCharPositionInLine())              ), -            ($start.result), -            ($end.result), +            ($vstart.result), +            ($vend.result),              ($inr.result),              ($outr.result)           ); @@ -886,13 +886,13 @@ returns [Instruction result]                 ($SORT_KW.getCharPositionInLine())              ),              ($value.result), -            ($value_reference.result), +            ($value_reference.result)           );     }     | RANGE_KW -      start=value WS+ -      end=value WS+ +      vstart=value WS+ +      vend=value WS+        inc=value WS+        value_reference WS*        R_PAREN @@ -905,10 +905,10 @@ returns [Instruction result]                 ($RANGE_KW.getLine()),                 ($RANGE_KW.getCharPositionInLine())              ), -            ($start.result), -            ($end.result), +            ($vstart.result), +            ($vend.result),              ($inc.result), -            ($value_reference.result), +            ($value_reference.result)           );     } | 


