| 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 /src/core | |
| parent | 824a949c83db04f6388239abe9acd687ca65d0a4 (diff) | |
...
Diffstat (limited to 'src/core')
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)        { | 


