| summaryrefslogtreecommitdiff |
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-09-07 12:24:58 +0200 |
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-09-07 12:24:58 +0200 |
| commit | 6f0b536009a1e87068e20d025775aa6e736a7d3d (patch) | |
| tree | 4d006c752bf4ee8877ceb7e63ac8a864b5a663ec | |
| parent | c7a589fd4daac4aaddf4e325a86eb48c0bc8aa0d (diff) | |
Adds car, cdr, cons.
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 ); } |


