| summaryrefslogtreecommitdiff |
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-08-13 22:39:21 +0200 |
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-08-13 22:39:21 +0200 |
| commit | 0e26f43837b10506f6c687bdf9f247f359a97dbd (patch) | |
| tree | 833b6d1218d6d645a90ebb66a44af3372aea0032 | |
| parent | 824a949c83db04f6388239abe9acd687ca65d0a4 (diff) | |
...
6 files changed, 133 insertions, 35 deletions
diff --git a/src/core/src/tonkadur/fate/v1/error/UnknownSequenceException.java b/src/core/src/tonkadur/fate/v1/error/UnknownSequenceException.java index 8a617f9..bb12260 100644 --- a/src/core/src/tonkadur/fate/v1/error/UnknownSequenceException.java +++ b/src/core/src/tonkadur/fate/v1/error/UnknownSequenceException.java @@ -1,18 +1,23 @@ package tonkadur.fate.v1.error; import java.util.Collection; +import java.util.List; + +import tonkadur.functional.Cons; import tonkadur.error.ErrorLevel; import tonkadur.parser.Origin; import tonkadur.parser.ParsingError; +import tonkadur.fate.v1.lang.meta.Computation; + public class UnknownSequenceException extends ParsingError { /***************************************************************************/ /**** MEMBERS **************************************************************/ /***************************************************************************/ - protected final Collection<Origin> all_occurrences; + protected final Collection<Cons<Origin, List<Computation>>> all_occurrences; protected final String sequence_name; /***************************************************************************/ @@ -22,7 +27,7 @@ public class UnknownSequenceException extends ParsingError ( final Origin first_occurrence, final String sequence_name, - final Collection<Origin> all_occurrences + final Collection<Cons<Origin, List<Computation>>> all_occurrences ) { super @@ -56,14 +61,14 @@ public class UnknownSequenceException extends ParsingError sb.append("Here is a complete list of all calls to this sequence:"); sb.append(System.lineSeparator()); - for (final Origin occurrence: all_occurrences) + for (final Cons<Origin, List<Computation>> occurrence: all_occurrences) { /* * Because sequences can be defined at any point, the context does * not matter much, so let's just point out locations instead. */ sb.append("- "); - sb.append(occurrence.get_location().toString()); + sb.append(occurrence.get_car().get_location().toString()); sb.append(System.lineSeparator()); } } diff --git a/src/core/src/tonkadur/fate/v1/lang/Sequence.java b/src/core/src/tonkadur/fate/v1/lang/Sequence.java index 34b1dc5..f475b9d 100644 --- a/src/core/src/tonkadur/fate/v1/lang/Sequence.java +++ b/src/core/src/tonkadur/fate/v1/lang/Sequence.java @@ -13,10 +13,15 @@ import tonkadur.parser.Context; import tonkadur.parser.Location; import tonkadur.parser.Origin; -import tonkadur.fate.v1.error.InvalidTypeException; +import tonkadur.fate.v1.error.InvalidArityException; +import tonkadur.fate.v1.error.IncompatibleTypeException; +import tonkadur.fate.v1.error.IncomparableTypeException; import tonkadur.fate.v1.lang.meta.DeclaredEntity; import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.Computation; + +import tonkadur.fate.v1.lang.type.Type; public class Sequence extends DeclaredEntity { @@ -76,6 +81,65 @@ public class Sequence extends DeclaredEntity return null; } + public boolean assert_can_take_parameters + ( + final Origin origin, + final List<Computation> parameters + ) + throws Throwable + { + final Iterator<Computation> param_it; + final Iterator<Variable> sign_it; + boolean result; + + if (signature.size() != parameters.size()) + { + ErrorManager.handle + ( + new InvalidArityException + ( + origin, + parameters.size(), + signature.size(), + signature.size() + ) + ); + + return false; + } + + result = true; + param_it = parameters.iterator(); + sign_it = signature.iterator(); + + while (param_it.hasNext()) + { + final Type param_type, sign_type; + + param_type = param_it.next().get_type(); + sign_type = sign_it.next().get_type(); + + if (param_type.can_be_used_as(sign_type)) + { + continue; + } + + ErrorManager.handle + ( + new IncompatibleTypeException(origin, param_type, sign_type) + ); + + if (param_type.generate_comparable_to(sign_type).equals(Type.ANY)) + { + ErrorManager.handle + ( + new IncomparableTypeException(origin, param_type, sign_type) + ); + } + } + + return true; + } /**** Misc. ****************************************************************/ @Override diff --git a/src/core/src/tonkadur/fate/v1/lang/World.java b/src/core/src/tonkadur/fate/v1/lang/World.java index a7da2f0..4b19cce 100644 --- a/src/core/src/tonkadur/fate/v1/lang/World.java +++ b/src/core/src/tonkadur/fate/v1/lang/World.java @@ -8,6 +8,8 @@ import java.util.List; import java.util.Map; import java.util.Set; +import tonkadur.functional.Cons; + import tonkadur.error.ErrorManager; import tonkadur.parser.Context; @@ -16,6 +18,7 @@ import tonkadur.parser.Origin; import tonkadur.fate.v1.error.UnknownSequenceException; +import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.DeclarationCollection; import tonkadur.fate.v1.lang.meta.ExtensionInstruction; import tonkadur.fate.v1.lang.meta.ExtensionComputation; @@ -31,7 +34,8 @@ public class World protected final Set<String> loaded_files; protected final Set<String> required_extensions; - protected final Map<String, List<Origin>> sequence_uses; + protected final Map<String, List<Cons<Origin, List<Computation>>>> + sequence_uses; protected final Map<String, ExtensionComputation> extension_value_nodes; protected final Map<String, ExtensionInstruction> extension_instructions; protected final Map<String, ExtensionInstruction> @@ -55,7 +59,9 @@ public class World loaded_files = new HashSet<String>(); required_extensions = new HashSet<String>(); - sequence_uses = new HashMap<String, List<Origin>>(); + sequence_uses = + new HashMap<String, List<Cons<Origin, List<Computation>>>>(); + extension_value_nodes = new HashMap<String, ExtensionComputation>(); extension_instructions = new HashMap<String, ExtensionInstruction>(); extension_first_level_instructions = @@ -111,20 +117,25 @@ public class World } /**** Sequence Calls ****/ - public void add_sequence_call (final Origin origin, final String sequence) + public void add_sequence_use + ( + final Origin origin, + final String sequence, + final List<Computation> parameters + ) { - List<Origin> list_of_uses; + List<Cons<Origin, List<Computation>>> list_of_uses; list_of_uses = sequence_uses.get(sequence); if (list_of_uses == null) { - list_of_uses = new ArrayList<Origin>(); + list_of_uses = new ArrayList<Cons<Origin, List<Computation>>>(); sequence_uses.put(sequence, list_of_uses); } - list_of_uses.add(origin); + list_of_uses.add(new Cons(origin, parameters)); } /**** Extension Stuff ****/ @@ -140,9 +151,7 @@ public class World return extension_first_level_instructions; } - public Map<String, ExtensionComputation> extension_value_nodes - ( - ) + public Map<String, ExtensionComputation> extension_value_nodes () { return extension_value_nodes; } @@ -185,7 +194,7 @@ public class World /**** Misc. ****************************************************************/ public boolean assert_sanity () - throws UnknownSequenceException + throws Throwable { boolean is_sane; @@ -278,21 +287,25 @@ public class World } protected boolean assert_sane_sequence_uses () - throws UnknownSequenceException + throws Throwable { + Sequence seq; + boolean is_sane; is_sane = true; for ( - final Map.Entry<String, List<Origin>> entry: + final Map.Entry<String, List<Cons<Origin, List<Computation>>>> entry: sequence_uses.entrySet() ) { - if (!sequences().has(entry.getKey())) + seq = sequences().get_or_null(entry.getKey()); + + if (seq == null) { - final List<Origin> occurrences; + final List<Cons<Origin, List<Computation>>> occurrences; occurrences = entry.getValue(); @@ -307,12 +320,25 @@ public class World ( new UnknownSequenceException ( - occurrences.get(0), + occurrences.get(0).get_car(), entry.getKey(), ((occurrences.size() == 1) ? null : occurrences) ) ); } + else + { + for (final Cons<Origin, List<Computation>> use: entry.getValue()) + { + if + ( + !seq.assert_can_take_parameters(use.get_car(), use.get_cdr()) + ) + { + is_sane = false; + } + } + } } return is_sane; diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/LocalVariable.java b/src/core/src/tonkadur/fate/v1/lang/instruction/LocalVariable.java index 7a87d7d..0ffdfd2 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/LocalVariable.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/LocalVariable.java @@ -20,7 +20,7 @@ public class LocalVariable extends Instruction /**** PUBLIC ***************************************************************/ /***************************************************************************/ /**** Constructors *********************************************************/ - protected LocalVariable (final Variable variable) + public LocalVariable (final Variable variable) { super(variable.get_origin()); diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/DeclarationCollection.java b/src/core/src/tonkadur/fate/v1/lang/meta/DeclarationCollection.java index 376befe..0250981 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/DeclarationCollection.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/DeclarationCollection.java @@ -80,6 +80,11 @@ public class DeclarationCollection <Declared extends DeclaredEntity> return result; } + public Declared get_or_null (final String name) + { + return collection.get(name); + } + /**** Misc. ****************************************************************/ public String toString () { diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 index 9d23055..66ffb0f 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 @@ -9,7 +9,9 @@ options { package tonkadur.fate.v1.parser; + import java.util.ArrayDeque; import java.util.Arrays; + import java.util.Deque; import java.util.Map; import java.util.HashMap; @@ -25,10 +27,10 @@ options import tonkadur.fate.v1.Utils; + import tonkadur.fate.v1.error.DuplicateLocalVariableException; import tonkadur.fate.v1.error.IllegalReferenceNameException; import tonkadur.fate.v1.error.InvalidTypeException; import tonkadur.fate.v1.error.UnknownExtensionContentException; - import tonkadur.fate.v1.error.UnknownVariableScopeException; import tonkadur.fate.v1.lang.*; import tonkadur.fate.v1.lang.instruction.*; @@ -53,7 +55,7 @@ fate_file [Context context, World world] { CONTEXT = context; WORLD = world; - LOCAL_VARIABLES = new ArrayDeque<HashMap<String, Variable>>(); + LOCAL_VARIABLES = new ArrayDeque<Map<String, Variable>>(); BREAKABLE_LEVELS = 0; LOCAL_VARIABLES.push(new HashMap<String, Variable>()); @@ -142,7 +144,7 @@ first_level_fate_instr: ($general_fate_sequence.result) ), ($new_reference_name.result), - ($variable_list.result) + ($variable_list.result).get_entries() ); WORLD.sequences().add(new_sequence); @@ -255,7 +257,7 @@ first_level_fate_instr: for ( - final TypedEntryList.TypedEntry te: + final Variable te: ($variable_list.result).get_entries() ) { @@ -441,6 +443,7 @@ returns [Instruction result] final Map<String, Variable> variable_map; start_origin = + CONTEXT.get_origin_at ( ($LOCAL_KW.getLine()), ($LOCAL_KW.getCharPositionInLine()) @@ -741,13 +744,6 @@ returns [Instruction result] elem_type = Type.ANY; - variable_map = local_variables.peekfirst(); - - if (local_variables == null) - { - local_variables = new typedentrylist(); - } - collection_type = ($value_reference.result).get_type(); if (collection_type instanceof CollectionType) @@ -786,7 +782,9 @@ returns [Instruction result] ($new_reference_name.result) ); - if (variable_map.containskey(($new_reference_name.result))) + variable_map = LOCAL_VARIABLES.peekFirst(); + + if (variable_map.containsKey(($new_reference_name.result))) { ErrorManager.handle ( @@ -2336,7 +2334,7 @@ returns [Computation result] ($LAMBDA_KW.getLine()), ($LAMBDA_KW.getCharPositionInLine()) ), - ($variable_list.result), + ($variable_list.result).get_entries(), ($value.result) ); @@ -2523,7 +2521,7 @@ returns [Reference result] ($WORD.getCharPositionInLine()) ); - target_var = LOCAL_VARIABLE.peekFirst().get(subrefs[0]); + target_var = LOCAL_VARIABLES.peekFirst().get(subrefs[0]); if (target_var == null) { |


