| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src/core')
16 files changed, 156 insertions, 34 deletions
| diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/AmbiguousWord.java b/src/core/src/tonkadur/fate/v1/lang/computation/AmbiguousWord.java index 5fc97ac..e1098bb 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/AmbiguousWord.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/AmbiguousWord.java @@ -8,6 +8,7 @@ import tonkadur.fate.v1.lang.type.Type;  import tonkadur.fate.v1.lang.type.FutureType;  import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.ComputationVisitor;  import tonkadur.fate.v1.lang.meta.VariableFromWord;  public class AmbiguousWord extends Computation @@ -41,7 +42,7 @@ public class AmbiguousWord extends Computation        final String as_string     )     { -      super(origin, new FutureType(origin, new ArrayList<>())); +      super(origin, new FutureType(origin));        this.parser = parser;        this.as_string = as_string; @@ -83,7 +84,7 @@ public class AmbiguousWord extends Computation           System.exit(-1);        } -      type.resolve_to(result.get_type()); +      ((FutureType) type).resolve_to(result.get_type());     }     @Override @@ -91,7 +92,7 @@ public class AmbiguousWord extends Computation     {        result = Constant.build_string(get_origin(), as_string); -      type.resolve_to(result.get_type()); +      ((FutureType) type).resolve_to(result.get_type());     }     public String get_value_as_string () diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/CondValue.java b/src/core/src/tonkadur/fate/v1/lang/computation/CondValue.java index 7d5b4e3..26384d0 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/CondValue.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/CondValue.java @@ -55,11 +55,6 @@ public class CondValue extends Computation           entry.get_car().expect_non_string();           RecurrentChecks.assert_can_be_used_as(entry.get_car(), Type.BOOL); - -         if (hint != null) -         { -            hint = RecurrentChecks.assert_can_be_used_as(entry.get_cdr(), hint); -         }        }        return new CondValue(origin, new FutureType(origin), branches); diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/IfElseValue.java b/src/core/src/tonkadur/fate/v1/lang/computation/IfElseValue.java index 6a3e726..b1e86fb 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/IfElseValue.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/IfElseValue.java @@ -4,6 +4,7 @@ import tonkadur.parser.Origin;  import tonkadur.parser.ParsingError;  import tonkadur.fate.v1.lang.type.Type; +import tonkadur.fate.v1.lang.type.FutureType;  import tonkadur.fate.v1.lang.meta.ComputationVisitor;  import tonkadur.fate.v1.lang.meta.Computation; diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/LambdaExpression.java b/src/core/src/tonkadur/fate/v1/lang/computation/LambdaExpression.java index fa9aec7..96eec02 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/LambdaExpression.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/LambdaExpression.java @@ -4,6 +4,7 @@ import java.util.ArrayList;  import java.util.List;  import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError;  import tonkadur.fate.v1.lang.meta.ComputationVisitor;  import tonkadur.fate.v1.lang.meta.Computation; @@ -48,6 +49,7 @@ public class LambdaExpression extends Computation        final List<Variable> parameters,        final Computation function     ) +   throws ParsingError     {        final List<Type> signature;        final LambdaType type; diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Let.java b/src/core/src/tonkadur/fate/v1/lang/computation/Let.java index 06b5c8a..d093b80 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/Let.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/Let.java @@ -5,6 +5,7 @@ import java.util.List;  import tonkadur.functional.Cons;  import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError;  import tonkadur.fate.v1.lang.meta.ComputationVisitor;  import tonkadur.fate.v1.lang.meta.Computation; diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/SetFieldsComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/SetFieldsComputation.java index a91b035..7284063 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/SetFieldsComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/SetFieldsComputation.java @@ -1,14 +1,16 @@  package tonkadur.fate.v1.lang.computation;  import java.util.List; +import java.util.ArrayList;  import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError;  import tonkadur.functional.Cons;  import tonkadur.fate.v1.lang.meta.ComputationVisitor;  import tonkadur.fate.v1.lang.meta.Computation; -import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class SetFieldsComputation extends Computation  { @@ -43,6 +45,7 @@ public class SetFieldsComputation extends Computation        final Computation target,        final List<Cons<Origin, Cons<String, Computation>>> field_assignments     ) +   throws Throwable     {        // A bit of a lazy solution: build field references, then extract the data        final List<Cons<String, Computation>> assignments; diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/SwitchValue.java b/src/core/src/tonkadur/fate/v1/lang/computation/SwitchValue.java index 8f7561b..4e98afa 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/SwitchValue.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/SwitchValue.java @@ -8,6 +8,7 @@ import tonkadur.parser.Origin;  import tonkadur.parser.ParsingError;  import tonkadur.fate.v1.lang.type.Type; +import tonkadur.fate.v1.lang.type.FutureType;  import tonkadur.fate.v1.lang.meta.ComputationVisitor;  import tonkadur.fate.v1.lang.meta.Computation; @@ -59,7 +60,8 @@ public class SwitchValue extends Computation        Type candidate_hint;        target_type = target.get_type(); -      target_type.expect_string(); + +      target.expect_string();        candidate_hint = branches.get(0).get_car().get_type(); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Display.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Display.java index 437dbbf..0e59669 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Display.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Display.java @@ -5,6 +5,7 @@ import java.util.Collections;  import tonkadur.error.ErrorManager;  import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError;  import tonkadur.fate.v1.lang.type.Type; @@ -23,7 +24,7 @@ public class Display extends Instruction     /**** PROTECTED ************************************************************/     /***************************************************************************/     /**** Constructors *********************************************************/ -   public Display +   protected Display     (        final Origin origin,        final Computation content @@ -31,8 +32,6 @@ public class Display extends Instruction     {        super(origin); -      content.expect_string(); -        this.content = content;     } @@ -40,6 +39,17 @@ public class Display extends Instruction     /**** PUBLIC ***************************************************************/     /***************************************************************************/     /**** Constructors *********************************************************/ +   public static Display build +   ( +      final Origin origin, +      final Computation content +   ) +   throws ParsingError +   { +      content.expect_string(); + +      return new Display(origin, content); +   }     /**** Accessors ************************************************************/     @Override diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/ForEach.java b/src/core/src/tonkadur/fate/v1/lang/instruction/ForEach.java index 63188ad..7a578da 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/ForEach.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/ForEach.java @@ -6,8 +6,7 @@ import java.util.List;  import tonkadur.error.ErrorManager;  import tonkadur.parser.Origin; - -import tonkadur.fate.v1.error.InvalidTypeException; +import tonkadur.parser.ParsingError;  import tonkadur.fate.v1.lang.type.Type; @@ -26,10 +25,10 @@ public class ForEach extends Instruction     protected final List<Instruction> body;     /***************************************************************************/ -   /**** PUBLIC ***************************************************************/ +   /**** PROTECTED ************************************************************/     /***************************************************************************/     /**** Constructors *********************************************************/ -   public ForEach +   protected ForEach     (        final Origin origin,        final Computation collection, @@ -39,13 +38,29 @@ public class ForEach extends Instruction     {        super(origin); -      collection.expect_non_string(); -        this.collection = collection;        this.var_name = var_name;        this.body = body;     } +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   public static ForEach build +   ( +      final Origin origin, +      final Computation collection, +      final String var_name, +      final List<Instruction> body +   ) +   throws ParsingError +   { +      collection.expect_non_string(); + +      return new ForEach(origin, collection, var_name, body); +   } +     /**** Accessors ************************************************************/     @Override     public void get_visited_by (final InstructionVisitor iv) diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceCall.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceCall.java index 40195a4..1b93aba 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceCall.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceCall.java @@ -3,9 +3,13 @@ package tonkadur.fate.v1.lang.instruction;  import java.util.List;  import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.type.Type;  import tonkadur.fate.v1.lang.meta.Computation;  import tonkadur.fate.v1.lang.meta.InstructionVisitor; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  import tonkadur.fate.v1.lang.meta.Instruction;  public class SequenceCall extends Instruction @@ -51,6 +55,7 @@ public class SequenceCall extends Instruction        return parameters;     } +   // TODO: call this at some point.     public void perform_signature_checks (final List<Type> signature)     throws ParsingError     { diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceJump.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceJump.java index 3df941c..9d8513c 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceJump.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceJump.java @@ -3,10 +3,14 @@ package tonkadur.fate.v1.lang.instruction;  import java.util.List;  import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.type.Type;  import tonkadur.fate.v1.lang.meta.Computation;  import tonkadur.fate.v1.lang.meta.InstructionVisitor;  import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class SequenceJump extends Instruction  { @@ -34,6 +38,7 @@ public class SequenceJump extends Instruction     }     /**** Accessors ************************************************************/ +   // TODO: call this at some point.     public void perform_signature_checks (final List<Type> signature)     throws ParsingError     { diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SetFields.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SetFields.java index cb66542..7a9dbd4 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/SetFields.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SetFields.java @@ -1,14 +1,19 @@  package tonkadur.fate.v1.lang.instruction;  import java.util.List; +import java.util.ArrayList;  import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError;  import tonkadur.functional.Cons; -import tonkadur.fate.v1.lang.meta.InstructionVisitor; -import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.computation.FieldAccess; +  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.RecurrentChecks;  public class SetFields extends Instruction  { @@ -38,12 +43,13 @@ public class SetFields extends Instruction     /**** PUBLIC ***************************************************************/     /***************************************************************************/     /**** Constructors *********************************************************/ -   public static SetFieldsComputation build +   public static SetFields build     (        final Origin origin,        final Computation target,        final List<Cons<Origin, Cons<String, Computation>>> field_assignments     ) +   throws Throwable     {        // A bit of a lazy solution: build field references, then extract the data        final List<Cons<String, Computation>> assignments; diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/TextOption.java b/src/core/src/tonkadur/fate/v1/lang/instruction/TextOption.java index f1479d0..411f795 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/TextOption.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/TextOption.java @@ -3,6 +3,7 @@ package tonkadur.fate.v1.lang.instruction;  import java.util.List;  import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError;  import tonkadur.fate.v1.lang.type.Type; @@ -19,10 +20,10 @@ public class TextOption extends Instruction     protected final List<Instruction> effects;     /***************************************************************************/ -   /**** PUBLIC ***************************************************************/ +   /**** PROTECTED ************************************************************/     /***************************************************************************/     /**** Constructors *********************************************************/ -   public TextOption +   protected TextOption     (        final Origin origin,        final Computation text, @@ -31,12 +32,27 @@ public class TextOption extends Instruction     {        super(origin); -      text.expect_string(); -        this.text = text;        this.effects = effects;     } +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   public static TextOption build +   ( +      final Origin origin, +      final Computation text, +      final List<Instruction> effects +   ) +   throws ParsingError +   { +      text.expect_string(); + +      return new TextOption(origin, text, effects); +   } +     /**** Accessors ************************************************************/     @Override diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/RecurrentChecks.java b/src/core/src/tonkadur/fate/v1/lang/meta/RecurrentChecks.java index b8ab9a6..40a85bb 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/RecurrentChecks.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/RecurrentChecks.java @@ -361,6 +361,59 @@ public class RecurrentChecks        }     } +   public static void handle_expected_type_propagation +   ( +      final Computation computation, +      final Type type +   ) +   throws ParsingError +   { +      if +      ( +         type.can_be_used_as(Type.TEXT) +         || type.can_be_used_as(Type.STRING) +      ) +      { +         computation.expect_string(); +      } +      else +      { +         computation.expect_non_string(); +      } +   } + +   public static void propagate_expected_types +   ( +      final List<Computation> computations, +      final List<Type> types +   ) +   throws ParsingError +   { +      try +      { +         (new Merge<Computation, Type, Boolean>() +         { +            @Override +            public Boolean risky_lambda (final Computation c, final Type p) +            throws ParsingError +            { +               handle_expected_type_propagation(c, p); + +               return Boolean.TRUE; +            } +         }).risky_merge(computations, types); +      } +      catch (final ParsingError e) +      { +         throw e; +      } +      catch (final Throwable e) +      { +         e.printStackTrace(); +         System.exit(-1); +      } +   } +     public static void assert_is_a_lambda_function (final Computation l)     throws ParsingError     { diff --git a/src/core/src/tonkadur/fate/v1/lang/type/FutureType.java b/src/core/src/tonkadur/fate/v1/lang/type/FutureType.java index 5a24c16..5e0650b 100644 --- a/src/core/src/tonkadur/fate/v1/lang/type/FutureType.java +++ b/src/core/src/tonkadur/fate/v1/lang/type/FutureType.java @@ -75,6 +75,13 @@ public class FutureType extends Type        FUTURE_TYPES.add(this);     } +   public FutureType (final Origin origin) +   { +      super(origin, null, "Future Type", new ArrayList<Type>()); + +      FUTURE_TYPES.add(this); +   } +     /**** Accessors ************************************************************/     public Type get_base_type () diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 index ac3023f..adcae9b 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 @@ -695,7 +695,7 @@ returns [Instruction result]        PARSER.decrease_local_variables_hierarchy();        $result = -         new ForEach +         ForEach.build           (              PARSER.get_origin_at              ( @@ -846,7 +846,7 @@ returns [Instruction result]     | IMP_SET_FIELDS_KW computation WS* field_value_list WS* R_PAREN     {        $result = -         new SetFields +         SetFields.build           (              PARSER.get_origin_at              ( @@ -947,7 +947,7 @@ returns [Instruction result]     | paragraph     {        $result = -         new Display +         Display.build           (              ($paragraph.result.get_origin()),              ($paragraph.result) @@ -1103,7 +1103,7 @@ returns [Instruction result]        PARSER.decrease_local_variables_hierarchy();        $result = -         new TextOption +         TextOption.build           (              PARSER.get_origin_at              ( @@ -1376,7 +1376,7 @@ returns [Instruction result]        PARSER.decrease_local_variables_hierarchy();        PARSER.disable_restricted_stack_of(pcd);        $result = -         new ForEach +         ForEach.build           (              PARSER.get_origin_at              ( @@ -2031,9 +2031,9 @@ returns [Computation result]  :     WORD     { -      if ($WORD.text.matches("[0-9]+(\.[0-9]+)?")) +      if ($WORD.text.matches("[0-9]+(\\.[0-9]+)?"))        { -         return +         $result =              Constant.build              (                 PARSER.get_origin_at @@ -2232,7 +2232,7 @@ returns [Computation result]     | SET_FIELDS_KW computation WS* field_value_list WS* R_PAREN     {        $result = -         new SetFieldsComputation +         SetFieldsComputation.build           (              PARSER.get_origin_at              ( | 


