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