| summaryrefslogtreecommitdiff |
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2021-07-10 14:57:43 +0200 |
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2021-07-10 14:57:43 +0200 |
| commit | 8366ec19f6ab2ee73aed12556dcbc0194d9d7e74 (patch) | |
| tree | dd27d15def3a8a37f07a250edead6d909c38d321 | |
| parent | 4ebf541afc7aeb44ff509450e9ccec8f1d03cf3b (diff) | |
Still working on type propagation...
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) ); } |


