summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-08-13 22:39:21 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-08-13 22:39:21 +0200
commit0e26f43837b10506f6c687bdf9f247f359a97dbd (patch)
tree833b6d1218d6d645a90ebb66a44af3372aea0032
parent824a949c83db04f6388239abe9acd687ca65d0a4 (diff)
...
-rw-r--r--src/core/src/tonkadur/fate/v1/error/UnknownSequenceException.java13
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/Sequence.java66
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/World.java56
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/LocalVariable.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/meta/DeclarationCollection.java5
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g426
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)
{