| 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 /src | |
| parent | c7a589fd4daac4aaddf4e325a86eb48c0bc8aa0d (diff) | |
Adds car, cdr, cons.
Diffstat (limited to 'src')
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           );     } | 


