summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-09-07 12:24:58 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-09-07 12:24:58 +0200
commit6f0b536009a1e87068e20d025775aa6e736a7d3d (patch)
tree4d006c752bf4ee8877ceb7e63ac8a864b5a663ec
parentc7a589fd4daac4aaddf4e325a86eb48c0bc8aa0d (diff)
Adds car, cdr, cons.
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/CarCdr.java124
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/ConsComputation.java74
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/type/ConsType.java115
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/type/Type.java3
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g410
5 files changed, 322 insertions, 4 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
new file mode 100644
index 0000000..1f5ad9c
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/CarCdr.java
@@ -0,0 +1,124 @@
+package tonkadur.fate.v1.lang.computation;
+
+import java.util.Collections;
+
+import tonkadur.parser.Origin;
+
+import tonkadur.error.ErrorManager;
+
+import tonkadur.fate.v1.error.InvalidTypeException;
+
+import tonkadur.fate.v1.lang.meta.ComputationVisitor;
+import tonkadur.fate.v1.lang.meta.Computation;
+
+import tonkadur.fate.v1.lang.type.ConsType;
+import tonkadur.fate.v1.lang.type.Type;
+
+public class CarCdr extends Computation
+{
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final Computation parent;
+ protected final boolean is_car;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected CarCdr
+ (
+ final Origin origin,
+ final Computation parent,
+ final boolean is_car,
+ final Type type
+ )
+ {
+ super(origin, type);
+
+ this.parent = parent;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ public static CarCdr build
+ (
+ final Origin origin,
+ final Computation parent,
+ final boolean is_car
+ )
+ throws InvalidTypeException
+ {
+ Type current_type;
+
+ current_type = parent.get_type();
+
+ if (!(current_type instanceof ConsType))
+ {
+ ErrorManager.handle
+ (
+ new InvalidTypeException
+ (
+ origin,
+ current_type,
+ Collections.singletonList(Type.CONS)
+ )
+ );
+
+ current_type = Type.ANY;
+ }
+ else if (is_car)
+ {
+ current_type = ((ConsType) current_type).get_car_type();
+ }
+ else
+ {
+ current_type = ((ConsType) current_type).get_cdr_type();
+ }
+
+ return new CarCdr(origin, parent, current_type, is_car, field);
+ }
+
+ /**** Accessors ************************************************************/
+ @Override
+ public void get_visited_by (final ComputationVisitor cv)
+ throws Throwable
+ {
+ cv.visit_car_cdr(this);
+ }
+
+ public Computation get_parent ()
+ {
+ return parent;
+ }
+
+ public boolean is_car ()
+ {
+ return is_car;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ if (is_car)
+ {
+ sb.append("(car (");
+ }
+ else
+ {
+ sb.append("(cdr (");
+ }
+
+ sb.append(type.get_name());
+ sb.append(") ");
+ sb.append(parent);
+ sb.append(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/ConsComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/ConsComputation.java
new file mode 100644
index 0000000..28f8f60
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/ConsComputation.java
@@ -0,0 +1,74 @@
+package tonkadur.fate.v1.lang.computation;
+
+import tonkadur.parser.Origin;
+
+import tonkadur.fate.v1.lang.type.ConsType;
+
+import tonkadur.fate.v1.lang.meta.ComputationVisitor;
+import tonkadur.fate.v1.lang.meta.Computation;
+
+public class ConsComputation extends Computation
+{
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final Computation car;
+ protected final Computation cdr;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ public ConsComputation
+ (
+ final Origin origin,
+ final Computation car,
+ final Computation cdr
+ )
+ {
+ super
+ (
+ origin,
+ new ConsType(origin, car.get_type(), cdr.get_type, "auto generated")
+ );
+
+ this.car = car;
+ this.cdr = cdr;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Accessors ************************************************************/
+ @Override
+ public void get_visited_by (final ComputationVisitor cv)
+ throws Throwable
+ {
+ cv.visit_cons_computation(this);
+ }
+
+ public Computation get_car ()
+ {
+ return car;
+ }
+
+ public Computation get_cdr ()
+ {
+ return cdr;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("(Cons ");
+ sb.append(car.toString());
+ sb.append(" ");
+ sb.append(car.toString());
+ sb.append(") ");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/type/ConsType.java b/src/core/src/tonkadur/fate/v1/lang/type/ConsType.java
new file mode 100644
index 0000000..1bcc17d
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/type/ConsType.java
@@ -0,0 +1,115 @@
+package tonkadur.fate.v1.lang.type;
+
+import tonkadur.parser.Origin;
+
+import tonkadur.fate.v1.lang.meta.DeclaredEntity;
+
+public class ConsType extends Type
+{
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final Type car;
+ protected final Type cdr;
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+
+ /**** Constructors *********************************************************/
+ public ConsType
+ (
+ final Origin origin,
+ final Type car,
+ final Type cdr,
+ final String name
+ )
+ {
+ super(origin, null, name);
+
+ this.car = car;
+ this.cdr = cdr;
+ }
+
+ /**** Accessors ************************************************************/
+ public Type get_car_type ()
+ {
+ return car;
+ }
+
+ public Type get_cdr_type ()
+ {
+ return cdr;
+ }
+
+ /**** Compatibility ********************************************************/
+ @Override
+ public boolean can_be_used_as (final Type t)
+ {
+ if (t instanceof ConsType)
+ {
+ final ConsType dt;
+
+ dt = (ConsType) t;
+
+ return
+ car.can_be_used_as(dt.car)
+ && cdr.can_be_used_as(dt.cdr)
+ }
+
+ return false;
+ }
+
+ /*
+ * This is for the very special case where a type is used despite not being
+ * even a sub-type of the expected one. Using this rather expensive function,
+ * the most restrictive shared type will be returned. If no such type exists,
+ * the ANY time is returned.
+ */
+ @Override
+ public DeclaredEntity generate_comparable_to (final DeclaredEntity de)
+ {
+ final Type resulting_car, resulting_cdr;
+ final ConsType dt;
+
+ if (!(de instanceof ConsType))
+ {
+ return Type.ANY;
+ }
+
+ dt = (ConsType) de;
+
+ resulting_car = (Type) car.generate_comparable_to(dt.car);
+ resulting_cdr = (Type) cdr.generate_comparable_to(dt.cdr);
+
+ return new ConsType(get_origin(), resulting_car, resulting_cdr, name);
+ }
+
+ @Override
+ public Type get_act_as_type ()
+ {
+ return Type.CONS;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public Type generate_alias (final Origin origin, final String name)
+ {
+ return new ConsType(origin, car, cdr, name);
+ }
+
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("(Cons ");
+ sb.append(car.toString());
+ sb.append(" ");
+ sb.append(cdr.toString());
+ sb.append(")::");
+ sb.append(name);
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/type/Type.java b/src/core/src/tonkadur/fate/v1/lang/type/Type.java
index fefe7cd..ac4bcb3 100644
--- a/src/core/src/tonkadur/fate/v1/lang/type/Type.java
+++ b/src/core/src/tonkadur/fate/v1/lang/type/Type.java
@@ -21,6 +21,7 @@ public class Type extends DeclaredEntity
{
public static final Type ANY;
public static final Type BOOL;
+ public static final Type CONS;
public static final Type DICT;
public static final Type FLOAT;
public static final Type INT;
@@ -48,6 +49,7 @@ public class Type extends DeclaredEntity
ANY = new Type(base, null, "undetermined type");
BOOL = new Type(base, null, "bool");
+ CONS = new Type(base, null, "cons");
DICT = new Type(base, null, "dict");
FLOAT = new Type(base, null, "float");
INT = new Type(base, null, "int");
@@ -61,6 +63,7 @@ public class Type extends DeclaredEntity
ALL_TYPES = new HashSet<Type>();
ALL_TYPES.add(ANY);
ALL_TYPES.add(BOOL);
+ ALL_TYPES.add(CONS);
ALL_TYPES.add(DICT);
ALL_TYPES.add(FLOAT);
ALL_TYPES.add(INT);
diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
index 74705ba..25882ea 100644
--- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
+++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
@@ -2955,28 +2955,30 @@ returns [Computation result]
| CAR_KW value WS* R_PAREN
{
$result =
- Car.build
+ CarCdr.build
(
CONTEXT.get_origin_at
(
($CAR_KW.getLine()),
($CAR_KW.getCharPositionInLine())
),
- ($value.result)
+ ($value.result),
+ true
);
}
| CDR_KW value WS* R_PAREN
{
$result =
- Cdr.build
+ CarCdr.build
(
CONTEXT.get_origin_at
(
($CDR_KW.getLine()),
($CDR_KW.getCharPositionInLine())
),
- ($value.result)
+ ($value.result),
+ false
);
}