| summaryrefslogtreecommitdiff |
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2021-07-10 21:04:17 +0200 |
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2021-07-10 21:04:17 +0200 |
| commit | 77f2ecece36ce3e99286eb80625bc9a7eaf12a65 (patch) | |
| tree | e3b816103e6857159430cfa632fcdd420a60aca1 | |
| parent | 8366ec19f6ab2ee73aed12556dcbc0194d9d7e74 (diff) | |
...
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 ( |


