| 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 | |
| parent | c4b0897e196dfdb685ee6c7aa542e7a0084db953 (diff) | |
...
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) ); } |


