summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-09-07 22:01:15 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-09-07 22:01:15 +0200
commitb9736f781266169a02c4833d4d87459781352e9c (patch)
tree35952b9ba32b65c9eedc15e2060b31917824cbd1
parentc4b0897e196dfdb685ee6c7aa542e7a0084db953 (diff)
...
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/CarCdr.java3
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/ConsComputation.java4
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/Fold.java20
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/Map.java215
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java9
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java9
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/type/ConsType.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g430
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)
);
}