| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src/core')
33 files changed, 366 insertions, 180 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 60f5efb..5fc97ac 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/AmbiguousWord.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/AmbiguousWord.java @@ -5,8 +5,8 @@ import tonkadur.parser.Origin;  import tonkadur.fate.v1.parser.ParserData;  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;  import tonkadur.fate.v1.lang.meta.VariableFromWord; @@ -41,7 +41,7 @@ public class AmbiguousWord extends Computation        final String as_string     )     { -      super(origin, Type.ANY); +      super(origin, new FutureType(origin, new ArrayList<>()));        this.parser = parser;        this.as_string = as_string; @@ -63,7 +63,7 @@ public class AmbiguousWord extends Computation     {        if (result == null)        { -         return Type.ANY; +         return type;        }        return result.get_type(); @@ -82,12 +82,16 @@ public class AmbiguousWord extends Computation           System.exit(-1);        } + +      type.resolve_to(result.get_type());     }     @Override     public void expect_string ()     {        result = Constant.build_string(get_origin(), as_string); + +      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 b7683d2..7d5b4e3 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/CondValue.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/CondValue.java @@ -50,26 +50,6 @@ public class CondValue extends Computation     )     throws ParsingError     { -      Type hint; - -      hint = null; - -      for (final Cons<Computation, Computation> entry: branches) -      { -         if (entry.get_cdr().get_type().can_be_used_as(Type.STRING)) -         { -            hint = Type.STRING; - -            break; -         } -         else if (entry.get_cdr().get_type() != Type.ANY) -         { -            hint = entry.get_cdr().get_type(); - -            break; -         } -      } -        for (final Cons<Computation, Computation> entry: branches)        {           entry.get_car().expect_non_string(); @@ -82,12 +62,7 @@ public class CondValue extends Computation           }        } -      if (hint == null) -      { -         hint = new FutureType(origin, new ArrayList<Type>()); -      } - -      return new CondValue(origin, hint, branches); +      return new CondValue(origin, new FutureType(origin), branches);     }     /**** Accessors ************************************************************/ @@ -95,52 +70,46 @@ public class CondValue extends Computation     public void expect_non_string ()     throws ParsingError     { -      if (get_type() instanceof FutureType) -      { -         final Computation a; -         Type hint; - -         a = branches.get(0).get_cdr(); +      final Computation a; +      Type hint; -         a.expect_non_string(); +      a = branches.get(0).get_cdr(); -         hint = a.get_type(); +      a.expect_non_string(); -         for (final Cons<Computation, Computation> entry: branches) -         { -            entry.get_cdr().expect_non_string(); +      hint = a.get_type(); -            hint = RecurrentChecks.assert_can_be_used_as(entry.get_cdr(), hint); -         } +      for (final Cons<Computation, Computation> entry: branches) +      { +         entry.get_cdr().expect_non_string(); -         ((FutureType) get_type()).resolve_to(hint); +         hint = RecurrentChecks.assert_can_be_used_as(entry.get_cdr(), hint);        } + +      ((FutureType) get_type()).resolve_to(hint);     }     @Override     public void expect_string ()     throws ParsingError     { -      if (get_type() instanceof FutureType) -      { -         final Computation a; -         Type hint; - -         a = branches.get(0).get_cdr(); +      final Computation a; +      Type hint; -         a.expect_non_string(); +      a = branches.get(0).get_cdr(); -         hint = a.get_type(); +      a.expect_non_string(); -         for (final Cons<Computation, Computation> entry: branches) -         { -            entry.get_cdr().expect_non_string(); +      hint = a.get_type(); -            hint = RecurrentChecks.assert_can_be_used_as(entry.get_cdr(), hint); -         } +      for (final Cons<Computation, Computation> entry: branches) +      { +         entry.get_cdr().expect_non_string(); -         ((FutureType) get_type()).resolve_to(hint); +         hint = RecurrentChecks.assert_can_be_used_as(entry.get_cdr(), hint);        } + +      ((FutureType) get_type()).resolve_to(hint);     }     @Override diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/ExtraComputationInstance.java b/src/core/src/tonkadur/fate/v1/lang/computation/ExtraComputationInstance.java index 7cb5178..43d733a 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/ExtraComputationInstance.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/ExtraComputationInstance.java @@ -45,6 +45,12 @@ public class ExtraComputationInstance extends GenericComputation     )     throws ParsingError     { +      RecurrentChecks.propagate_expected_types +      ( +         parameters, +         computation.get_signature() +      ); +        RecurrentChecks.assert_computations_matches_signature        (           origin, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/FieldAccess.java b/src/core/src/tonkadur/fate/v1/lang/computation/FieldAccess.java index 5096ff8..2bb24fd 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/FieldAccess.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/FieldAccess.java @@ -59,6 +59,8 @@ public class FieldAccess extends Computation     {        Type current_type; +      parent.expect_non_string(); +        current_type = parent.get_type();        while (current_type.get_act_as_type().equals(PointerType.ARCHETYPE)) 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 0097537..6a3e726 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/IfElseValue.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/IfElseValue.java @@ -51,18 +51,49 @@ public class IfElseValue extends Computation     )     throws ParsingError     { -      final Type type; +      condition.expect_non_string();        RecurrentChecks.assert_can_be_used_as(condition, Type.BOOL); -      type = -         RecurrentChecks.assert_can_be_used_as(if_false, if_true.get_type()); - -      return new IfElseValue(origin, type, condition, if_true, if_false); +      return +         new IfElseValue +         ( +            origin, +            new FutureType(origin), +            condition, +            if_true, +            if_false +         );     }     /**** Accessors ************************************************************/     @Override +   public void expect_non_string () +   throws ParsingError +   { +      if_true.expect_non_string(); +      if_false.expect_non_string(); + +      ((FutureType) get_type()).resolve_to +      ( +         RecurrentChecks.assert_can_be_used_as(if_false, if_true.get_type()) +      ); +   } + +   @Override +   public void expect_string () +   throws ParsingError +   { +      if_true.expect_string(); +      if_false.expect_string(); + +      ((FutureType) get_type()).resolve_to +      ( +         RecurrentChecks.assert_can_be_used_as(if_false, if_true.get_type()) +      ); +   } + +   @Override     public void get_visited_by (final ComputationVisitor cv)     throws Throwable     { 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 7ea988b..fa9aec7 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/LambdaExpression.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/LambdaExpression.java @@ -52,6 +52,11 @@ public class LambdaExpression extends Computation        final List<Type> signature;        final LambdaType type; +      // TODO: is there any way to avoid that? Finding out the expected type +      // of the lambda expression and using the returned type as a basis for +      // what is expected? +      function.expect_string(); +        signature = new ArrayList<Type>();        for (final Variable v: parameters) 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 f5be874..06b5c8a 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/Let.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/Let.java @@ -44,6 +44,20 @@ public class Let extends Computation     /**** Accessors ************************************************************/     @Override +   public void expect_non_string () +   throws ParsingError +   { +      computation.expect_non_string(); +   } + +   @Override +   public void expect_string () +   throws ParsingError +   { +      computation.expect_string(); +   } + +   @Override     public void get_visited_by (final ComputationVisitor cv)     throws Throwable     { 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 84ca06e..a91b035 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/SetFieldsComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/SetFieldsComputation.java @@ -21,12 +21,7 @@ public class SetFieldsComputation extends Computation     /***************************************************************************/     /**** PROTECTED ************************************************************/     /***************************************************************************/ - -   /***************************************************************************/ -   /**** PUBLIC ***************************************************************/ -   /***************************************************************************/ -   /**** Constructors *********************************************************/ -   public SetFieldsComputation +   protected SetFieldsComputation     (        final Origin origin,        final Computation target, @@ -39,6 +34,52 @@ public class SetFieldsComputation extends Computation        this.field_assignments = field_assignments;     } +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   public static SetFieldsComputation build +   ( +      final Origin origin, +      final Computation target, +      final List<Cons<Origin, Cons<String, Computation>>> field_assignments +   ) +   { +      // A bit of a lazy solution: build field references, then extract the data +      final List<Cons<String, Computation>> assignments; + +      target.expect_non_string(); + +      assignments = new ArrayList<Cons<String, Computation>>(); + +      for +      ( +         final Cons<Origin, Cons<String, Computation>> entry: field_assignments +      ) +      { +         final FieldAccess fa; +         final Computation cp; + +         fa = +            FieldAccess.build +            ( +               entry.get_car(), +               target, +               entry.get_cdr().get_car() +            ); + +         cp = entry.get_cdr().get_cdr(); + +         RecurrentChecks.handle_expected_type_propagation(cp, fa.get_type()); +         RecurrentChecks.assert_can_be_used_as(cp, fa.get_type()); + +         assignments.add(new Cons(fa.get_field_name(), cp)); +      } + +      return new SetFieldsComputation(origin, target, assignments); +   } + +   /**** Constructors *********************************************************/ +     /**** Accessors ************************************************************/     @Override     public void get_visited_by (final ComputationVisitor cv) 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 afcdf12..8f7561b 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/SwitchValue.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/SwitchValue.java @@ -56,32 +56,77 @@ public class SwitchValue extends Computation     throws ParsingError     {        final Type target_type; -      final Type first_type; -      Type candidate_hint, hint; +      Type candidate_hint;        target_type = target.get_type(); +      target_type.expect_string(); -      candidate_hint =  branches.get(0).get_car().get_type(); -      hint = branches.get(0).get_cdr().get_type(); +      candidate_hint = branches.get(0).get_car().get_type();        for (final Cons<Computation, Computation> entry: branches)        { +         entry.get_car().expect_string(); +           candidate_hint =              RecurrentChecks.assert_can_be_used_as              (                 entry.get_car(),                 candidate_hint              ); +      } + +      return +         new SwitchValue +         ( +            origin, +            new FutureType(origin), +            target, +            branches, +            default_value +         ); +   } + +   /**** Accessors ************************************************************/ +   @Override +   public void expect_non_string () +   throws ParsingError +   { +      Type hint; + +      default_value.expect_non_string(); + +      hint = default_value.get_type(); + +      for (final Cons<Computation, Computation> entry: branches) +      { +         entry.get_cdr().expect_non_string();           hint = RecurrentChecks.assert_can_be_used_as(entry.get_cdr(), hint);        } -      hint = RecurrentChecks.assert_can_be_used_as(default_value, hint); +      ((FutureType) get_type()).resolve_to(hint); +   } + +   @Override +   public void expect_string () +   throws ParsingError +   { +      Type hint; + +      default_value.expect_string(); + +      hint = default_value.get_type(); -      return new SwitchValue(origin, hint, target, branches, default_value); +      for (final Cons<Computation, Computation> entry: branches) +      { +         entry.get_cdr().expect_string(); + +         hint = RecurrentChecks.assert_can_be_used_as(entry.get_cdr(), hint); +      } + +      ((FutureType) get_type()).resolve_to(hint);     } -   /**** Accessors ************************************************************/     @Override     public void get_visited_by (final ComputationVisitor cv)     throws Throwable diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/LambdaEvaluation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/LambdaEvaluation.java index dc5fcb5..0431e11 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/LambdaEvaluation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/LambdaEvaluation.java @@ -105,31 +105,11 @@ public class LambdaEvaluation extends GenericComputation        call_parameters.remove(0); -      /* String vs Variable resolution */ -      try -      { -         (new Merge<Type, Computation, Boolean>() -         { -            @Override -            public Boolean risky_lambda (final Type t, final Computation p) -            throws ParsingError -            { -               if (t.can_be_used_as(Type.STRING)) -               { -                  p.expect_string(); -               } -               else -               { -                  p.expect_non_string(); -               } -               return Boolean.TRUE; -            } -         }).risky_merge(lambda_signature, call_parameters); -      } -      catch (final Throwable e) -      { -         // Will be handled better in the check below. -      } +      RecurrentChecks.propagate_expected_types +      ( +         call_parameters, +         lambda_signature +      );        RecurrentChecks.assert_computations_matches_signature        ( diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Operation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Operation.java index 48cf0a9..e443959 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Operation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Operation.java @@ -488,6 +488,11 @@ public class Operation extends GenericComputation        operator_min_arity = operator.get_minimum_arity();        operands_size = operands.size(); +      for (final Computation c: operands) +      { +         c.expect_non_string(); +      } +        if        (           (operands_size < operator_min_arity) diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Assert.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Assert.java index 3ec088e..7e06e87 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Assert.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Assert.java @@ -47,6 +47,9 @@ public class Assert extends Instruction     )     throws ParsingError     { +      condition.expect_non_string(); +      message.expect_string(); +        RecurrentChecks.assert_can_be_used_as(condition, Type.BOOL);        return new Assert(origin, condition, message); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/CondInstruction.java b/src/core/src/tonkadur/fate/v1/lang/instruction/CondInstruction.java index b7eb9bb..e179a9d 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/CondInstruction.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/CondInstruction.java @@ -49,6 +49,7 @@ public class CondInstruction extends Instruction     {        for (final Cons<Computation, Instruction> branch: branches)        { +         branch.get_car().expect_non_string();           RecurrentChecks.assert_can_be_used_as(branch.get_car(), Type.BOOL);        } 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 3d5d7ce..437dbbf 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Display.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Display.java @@ -31,6 +31,8 @@ public class Display extends Instruction     {        super(origin); +      content.expect_string(); +        this.content = content;     } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/DoWhile.java b/src/core/src/tonkadur/fate/v1/lang/instruction/DoWhile.java index 4fe170f..e34dd94 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/DoWhile.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/DoWhile.java @@ -49,6 +49,8 @@ public class DoWhile extends Instruction     )     throws ParsingError     { +      condition.expect_non_string(); +        RecurrentChecks.assert_can_be_used_as(condition, Type.BOOL);        return new DoWhile(origin, condition, body); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/EventOption.java b/src/core/src/tonkadur/fate/v1/lang/instruction/EventOption.java index 8cfc0a9..d2d4fc3 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/EventOption.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/EventOption.java @@ -70,6 +70,12 @@ public class EventOption extends Instruction     )     throws ParsingError     { +      RecurrentChecks.propagate_expected_types +      ( +         parameters, +         event.get_signature() +      ); +        RecurrentChecks.assert_computations_matches_signature        (           origin, diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/ExtraInstructionInstance.java b/src/core/src/tonkadur/fate/v1/lang/instruction/ExtraInstructionInstance.java index ecfa012..e485ffa 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/ExtraInstructionInstance.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/ExtraInstructionInstance.java @@ -46,6 +46,12 @@ public class ExtraInstructionInstance extends GenericInstruction     )     throws ParsingError     { +      RecurrentChecks.propagate_expected_types +      ( +         parameters, +         instruction.get_signature() +      ); +        RecurrentChecks.assert_computations_matches_signature        (           origin, diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/For.java b/src/core/src/tonkadur/fate/v1/lang/instruction/For.java index b6734b2..d17c30b 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/For.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/For.java @@ -57,6 +57,8 @@ public class For extends Instruction     )     throws ParsingError     { +      condition.expect_non_string(); +        RecurrentChecks.assert_can_be_used_as(condition, Type.BOOL);        return new For(origin, condition, pre, body, post); 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 c3c049b..63188ad 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/ForEach.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/ForEach.java @@ -39,6 +39,8 @@ public class ForEach extends Instruction     {        super(origin); +      collection.expect_non_string(); +        this.collection = collection;        this.var_name = var_name;        this.body = body; diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/IfElseInstruction.java b/src/core/src/tonkadur/fate/v1/lang/instruction/IfElseInstruction.java index 477b227..fef4920 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/IfElseInstruction.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/IfElseInstruction.java @@ -51,6 +51,8 @@ public class IfElseInstruction extends Instruction     )     throws ParsingError     { +      condition.expect_non_string(); +        RecurrentChecks.assert_can_be_used_as(condition, Type.BOOL);        return new IfElseInstruction(origin, condition, if_true, if_false); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/IfInstruction.java b/src/core/src/tonkadur/fate/v1/lang/instruction/IfInstruction.java index 0f29115..b5a5d96 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/IfInstruction.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/IfInstruction.java @@ -49,6 +49,8 @@ public class IfInstruction extends Instruction     )     throws ParsingError     { +      condition.expect_non_string(); +        RecurrentChecks.assert_can_be_used_as(condition, Type.BOOL);        return new IfInstruction(origin, condition, if_true); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/PromptInteger.java b/src/core/src/tonkadur/fate/v1/lang/instruction/PromptInteger.java index 9ddf4fb..a869bae 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/PromptInteger.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/PromptInteger.java @@ -56,6 +56,11 @@ public class PromptInteger extends Instruction     )     throws ParsingError     { +      target.expect_non_string(); +      min.expect_non_string(); +      max.expect_non_string(); +      label.expect_string(); +        RecurrentChecks.assert_can_be_used_as(min, Type.INT);        RecurrentChecks.assert_can_be_used_as(max, Type.INT);        RecurrentChecks.assert_can_be_used_as(label, Type.TEXT); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/PromptString.java b/src/core/src/tonkadur/fate/v1/lang/instruction/PromptString.java index 23f1d35..ccb447d 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/PromptString.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/PromptString.java @@ -56,6 +56,11 @@ public class PromptString extends Instruction     )     throws ParsingError     { +      target.expect_non_string(); +      min.expect_non_string(); +      max.expect_non_string(); +      label.expect_string(); +        RecurrentChecks.assert_can_be_used_as(min, Type.INT);        RecurrentChecks.assert_can_be_used_as(max, Type.INT);        RecurrentChecks.assert_can_be_used_as(label, Type.TEXT); 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 c65f490..40195a4 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceCall.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceCall.java @@ -51,6 +51,23 @@ public class SequenceCall extends Instruction        return parameters;     } +   public void perform_signature_checks (final List<Type> signature) +   throws ParsingError +   { +      RecurrentChecks.propagate_expected_types +      ( +         parameters, +         signature +      ); + +      RecurrentChecks.assert_computations_matches_signature +      ( +         get_origin(), +         parameters, +         signature +      ); +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () 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 fb95d84..3df941c 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceJump.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceJump.java @@ -34,6 +34,23 @@ public class SequenceJump extends Instruction     }     /**** Accessors ************************************************************/ +   public void perform_signature_checks (final List<Type> signature) +   throws ParsingError +   { +      RecurrentChecks.propagate_expected_types +      ( +         parameters, +         signature +      ); + +      RecurrentChecks.assert_computations_matches_signature +      ( +         get_origin(), +         parameters, +         signature +      ); +   } +     @Override     public void get_visited_by (final InstructionVisitor iv)     throws Throwable diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableCall.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableCall.java index e834aaf..0e4a654 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableCall.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableCall.java @@ -57,6 +57,10 @@ public class SequenceVariableCall extends Instruction     {        final List<Type> signature; +      sequence.expect_non_string(); + +      // TODO: change this system, since we'd rather use the signature to tell +      // the parameters what to expect.        ((SequenceType) sequence.get_type()).propose_signature_from_parameters        (           parameters diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableJump.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableJump.java index 483ff95..f0a0cae 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableJump.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableJump.java @@ -57,6 +57,10 @@ public class SequenceVariableJump extends Instruction     {        final List<Type> signature; +      sequence.expect_non_string(); + +      // TODO: change this system, since we'd rather use the signature to tell +      // the parameters what to expect.        ((SequenceType) sequence.get_type()).propose_signature_from_parameters        (           parameters 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 fff2a2b..cb66542 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/SetFields.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SetFields.java @@ -21,22 +21,62 @@ public class SetFields extends Instruction     /***************************************************************************/     /**** PROTECTED ************************************************************/     /***************************************************************************/ +   protected SetFields +   ( +      final Origin origin, +      final Computation target, +      final List<Cons<String, Computation>> field_assignments +   ) +   { +      super(origin); + +      this.target = target; +      this.field_assignments = field_assignments; +   }     /***************************************************************************/     /**** PUBLIC ***************************************************************/     /***************************************************************************/     /**** Constructors *********************************************************/ -   public SetFields +   public static SetFieldsComputation build     (        final Origin origin,        final Computation target, -      final List<Cons<String, Computation>> field_assignments +      final List<Cons<Origin, Cons<String, Computation>>> field_assignments     )     { -      super(origin); +      // A bit of a lazy solution: build field references, then extract the data +      final List<Cons<String, Computation>> assignments; -      this.target = target; -      this.field_assignments = field_assignments; +      target.expect_non_string(); + +      assignments = new ArrayList<Cons<String, Computation>>(); + +      for +      ( +         final Cons<Origin, Cons<String, Computation>> entry: field_assignments +      ) +      { +         final FieldAccess fa; +         final Computation cp; + +         fa = +            FieldAccess.build +            ( +               entry.get_car(), +               target, +               entry.get_cdr().get_car() +            ); + +         cp = entry.get_cdr().get_cdr(); + +         RecurrentChecks.handle_expected_type_propagation(cp, fa.get_type()); +         RecurrentChecks.assert_can_be_used_as(cp, fa.get_type()); + +         assignments.add(new Cons(fa.get_field_name(), cp)); +      } + +      return new SetFields(origin, target, assignments);     }     /**** Accessors ************************************************************/ diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java index 672756a..d077c26 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java @@ -46,6 +46,8 @@ public class SetValue extends Instruction     )     throws ParsingError     { +      value_reference.expect_non_string(); +        RecurrentChecks.assert_can_be_used_as(element, value_reference);        return new SetValue(origin, element, value_reference); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SwitchInstruction.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SwitchInstruction.java index 6c0b021..87a0836 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/SwitchInstruction.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SwitchInstruction.java @@ -57,11 +57,15 @@ public class SwitchInstruction extends Instruction     {        final Type target_type; +      target.expect_string(); +        target_type = target.get_type();        for (final Cons<Computation, Instruction> branch: branches)        { -         RecurrentChecks.assert_can_be_used_as(branch.get_car(), Type.BOOL); +         branch.get_car().expect_string(); + +         RecurrentChecks.assert_can_be_used_as(branch.get_car(), target_type);        }        return 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 e612a08..f1479d0 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/TextOption.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/TextOption.java @@ -31,6 +31,8 @@ public class TextOption extends Instruction     {        super(origin); +      text.expect_string(); +        this.text = text;        this.effects = effects;     } diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/While.java b/src/core/src/tonkadur/fate/v1/lang/instruction/While.java index b29b496..14e0c1b 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/While.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/While.java @@ -49,6 +49,8 @@ public class While extends Instruction     )     throws ParsingError     { +      condition.expect_non_string(); +        RecurrentChecks.assert_can_be_used_as(condition, Type.BOOL);        return new While(origin, condition, body); diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 index 8c5a052..ac3023f 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 @@ -845,37 +845,6 @@ returns [Instruction result]     | IMP_SET_FIELDS_KW computation WS* field_value_list WS* R_PAREN     { -      /* -       * A bit of a lazy solution: build field references, then extract the data -       */ -      final List<Cons<String, Computation>> assignments; - -      assignments = new ArrayList<Cons<String, Computation>>(); - -      for -      ( -         final Cons<Origin, Cons<String, Computation>> entry: -            ($field_value_list.result) -      ) -      { -         final FieldAccess fa; -         final Computation cp; - -         fa = -            FieldAccess.build -            ( -               entry.get_car(), -               ($computation.result), -               entry.get_cdr().get_car() -            ); - -         cp = entry.get_cdr().get_cdr(); - -         RecurrentChecks.assert_can_be_used_as(cp, fa.get_type()); - -         assignments.add(new Cons(fa.get_field_name(), cp)); -      } -        $result =           new SetFields           ( @@ -885,7 +854,7 @@ returns [Instruction result]                 ($IMP_SET_FIELDS_KW.getCharPositionInLine())              ),              ($computation.result), -            assignments +            ($field_value_list.result)           );     } @@ -2062,17 +2031,33 @@ returns [Computation result]  :     WORD     { -      $result = -         new AmbiguousWord -         ( -            PARSER, -            PARSER.get_origin_at +      if ($WORD.text.matches("[0-9]+(\.[0-9]+)?")) +      { +         return +            Constant.build              ( -               ($WORD.getLine()), -               ($WORD.getCharPositionInLine()) -            ), -            ($WORD.text) -         ); +               PARSER.get_origin_at +               ( +                  ($WORD.getLine()), +                  ($WORD.getCharPositionInLine()) +               ), +               ($WORD.text) +            ); +      } +      else +      { +         $result = +            new AmbiguousWord +            ( +               PARSER, +               PARSER.get_origin_at +               ( +                  ($WORD.getLine()), +                  ($WORD.getCharPositionInLine()) +               ), +               ($WORD.text) +            ); +      }     }     | VARIABLE_KW WORD WS* R_PAREN @@ -2246,37 +2231,6 @@ returns [Computation result]     | SET_FIELDS_KW computation WS* field_value_list WS* R_PAREN     { -      /* -       * A bit of a lazy solution: build field references, then extract the data -       */ -      final List<Cons<String, Computation>> assignments; - -      assignments = new ArrayList<Cons<String, Computation>>(); - -      for -      ( -         final Cons<Origin, Cons<String, Computation>> entry: -            ($field_value_list.result) -      ) -      { -         final FieldAccess fa; -         final Computation cp; - -         fa = -            FieldAccess.build -            ( -               entry.get_car(), -               ($computation.result), -               entry.get_cdr().get_car() -            ); - -         cp = entry.get_cdr().get_cdr(); - -         RecurrentChecks.assert_can_be_used_as(cp, fa.get_type()); - -         assignments.add(new Cons(fa.get_field_name(), cp)); -      } -        $result =           new SetFieldsComputation           ( @@ -2286,7 +2240,7 @@ returns [Computation result]                 ($SET_FIELDS_KW.getCharPositionInLine())              ),              ($computation.result), -            assignments +            ($field_value_list.result)           );     } | 


