summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2021-07-10 14:57:43 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2021-07-10 14:57:43 +0200
commit8366ec19f6ab2ee73aed12556dcbc0194d9d7e74 (patch)
treedd27d15def3a8a37f07a250edead6d909c38d321 /src/core
parent4ebf541afc7aeb44ff509450e9ccec8f1d03cf3b (diff)
Still working on type propagation...
Diffstat (limited to 'src/core')
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/AmbiguousWord.java10
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/CondValue.java77
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/ExtraComputationInstance.java6
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/FieldAccess.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/IfElseValue.java41
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/LambdaExpression.java5
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/Let.java14
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/SetFieldsComputation.java53
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/SwitchValue.java59
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/LambdaEvaluation.java30
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/generic/Operation.java5
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/Assert.java3
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/CondInstruction.java1
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/Display.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/DoWhile.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/EventOption.java6
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/ExtraInstructionInstance.java6
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/For.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/ForEach.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/IfElseInstruction.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/IfInstruction.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/PromptInteger.java5
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/PromptString.java5
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/SequenceCall.java17
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/SequenceJump.java17
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableCall.java4
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableJump.java4
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/SetFields.java50
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/SwitchInstruction.java6
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/TextOption.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/While.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g4102
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)
);
}