summaryrefslogtreecommitdiff |
diff options
-rw-r--r-- | src/hastabel/PropertyParser.g4 | 79 | ||||
-rw-r--r-- | src/hastabel/lang/Predicate.java | 89 | ||||
-rw-r--r-- | src/hastabel/lang/Type.java | 13 |
3 files changed, 179 insertions, 2 deletions
diff --git a/src/hastabel/PropertyParser.g4 b/src/hastabel/PropertyParser.g4 index b0685ad..581c445 100644 --- a/src/hastabel/PropertyParser.g4 +++ b/src/hastabel/PropertyParser.g4 @@ -180,6 +180,8 @@ predicate [Variable current_node] ids.add(0, current_node); } + predicate.mark_as_used(); + $result = predicate.as_formula(ids); } ; @@ -222,6 +224,8 @@ function [Variable current_node] ids.add(0, current_node); } + predicate.mark_as_used_as_function(); + $result = predicate.as_function(ids); } ; @@ -269,6 +273,8 @@ regex_special_predicate [Variable current_node] WORLD.invalidate(); } + string_matches.mark_as_used(); + $result = string_matches.as_formula(Arrays.asList(params)); } ; @@ -399,6 +405,7 @@ variable_declaration WORLD.invalidate(); } + t.mark_as_used(); $variable = WORLD.get_variables_manager().add_variable(t, ($var.text)); if (($variable) == null) @@ -492,6 +499,8 @@ ctl_verifies_operator [Variable current_node] WORLD.invalidate(); } + node_type.mark_as_used(); + root_node = WORLD.get_variables_manager().new_anonymous_variable(node_type); @@ -549,6 +558,8 @@ ax_operator [Variable current_node] WORLD.invalidate(); } + node_type.mark_as_used(); + next_node = WORLD.get_variables_manager().new_anonymous_variable(node_type); @@ -588,6 +599,8 @@ ax_operator [Variable current_node] WORLD.invalidate(); } + node_connect.mark_as_used(); + $result = Formula.forall ( @@ -616,6 +629,8 @@ ex_operator [Variable current_node] WORLD.invalidate(); } + node_type.mark_as_used(); + next_node = WORLD.get_variables_manager().new_anonymous_variable(node_type); @@ -655,6 +670,8 @@ ex_operator [Variable current_node] WORLD.invalidate(); } + node_connect.mark_as_used(); + $result = Formula.exists ( @@ -683,6 +700,8 @@ ag_operator [Variable current_node] WORLD.invalidate(); } + node_type.mark_as_used(); + next_node = WORLD.get_variables_manager().new_anonymous_variable(node_type); @@ -725,6 +744,10 @@ ag_operator [Variable current_node] WORLD.invalidate(); } + path_type.mark_as_used(); + contains_node.mark_as_used(); + is_path_of.mark_as_used(); + next_path = WORLD.get_variables_manager().new_anonymous_variable(path_type); @@ -769,6 +792,8 @@ eg_operator [Variable current_node] WORLD.invalidate(); } + node_type.mark_as_used(); + next_node = WORLD.get_variables_manager().new_anonymous_variable(node_type); @@ -812,6 +837,10 @@ eg_operator [Variable current_node] WORLD.invalidate(); } + path_type.mark_as_used(); + contains_node.mark_as_used(); + is_path_of.mark_as_used(); + next_path = WORLD.get_variables_manager().new_anonymous_variable(path_type); @@ -856,6 +885,8 @@ af_operator [Variable current_node] WORLD.invalidate(); } + node_type.mark_as_used(); + next_node = WORLD.get_variables_manager().new_anonymous_variable(node_type); @@ -899,6 +930,11 @@ af_operator [Variable current_node] WORLD.invalidate(); } + path_type.mark_as_used(); + contains_node.mark_as_used(); + is_path_of.mark_as_used(); + + next_path = WORLD.get_variables_manager().new_anonymous_variable(path_type); @@ -943,6 +979,8 @@ ef_operator [Variable current_node] WORLD.invalidate(); } + node_type.mark_as_used(); + next_node = WORLD.get_variables_manager().new_anonymous_variable(node_type); @@ -986,6 +1024,10 @@ ef_operator [Variable current_node] WORLD.invalidate(); } + path_type.mark_as_used(); + contains_node.mark_as_used(); + is_path_of.mark_as_used(); + next_path = WORLD.get_variables_manager().new_anonymous_variable(path_type); @@ -1030,6 +1072,8 @@ au_operator [Variable current_node] WORLD.invalidate(); } + node_type.mark_as_used(); + f1_node = WORLD.get_variables_manager().new_anonymous_variable(node_type); @@ -1084,6 +1128,11 @@ au_operator [Variable current_node] WORLD.invalidate(); } + path_type.mark_as_used(); + contains_node.mark_as_used(); + is_path_of.mark_as_used(); + is_before.mark_as_used(); + next_path = WORLD.get_variables_manager().new_anonymous_variable(path_type); @@ -1137,6 +1186,8 @@ eu_operator [Variable current_node] WORLD.invalidate(); } + node_type.mark_as_used(); + f1_node = WORLD.get_variables_manager().new_anonymous_variable(node_type); @@ -1191,6 +1242,11 @@ eu_operator [Variable current_node] WORLD.invalidate(); } + path_type.mark_as_used(); + contains_node.mark_as_used(); + is_path_of.mark_as_used(); + is_before.mark_as_used(); + next_path = WORLD.get_variables_manager().new_anonymous_variable(path_type); @@ -1245,6 +1301,8 @@ depth_no_parent_operator [Variable current_node] WORLD.invalidate(); } + node_type.mark_as_used(); + node_for_f = WORLD.get_variables_manager().new_anonymous_variable(node_type); @@ -1260,7 +1318,7 @@ depth_no_parent_operator [Variable current_node] (WS)* R_PAREN { - final Type path_type; + final Type path_type, depth_type; final Variable next_path, node_of_path; final hastabel.lang.Predicate depth, is_path_of, is_lower_than, contains_node, is_before; @@ -1280,6 +1338,7 @@ depth_no_parent_operator [Variable current_node] } path_type = WORLD.get_types_manager().get("path"); + depth_type = WORLD.get_types_manager().get("depth"); depth = WORLD.get_predicates_manager().get("depth"); is_path_of = WORLD.get_predicates_manager().get("is_path_of"); contains_node = WORLD.get_predicates_manager().get("contains_node"); @@ -1299,6 +1358,14 @@ depth_no_parent_operator [Variable current_node] WORLD.invalidate(); } + path_type.mark_as_used(); + depth_type.mark_as_used(); + depth.mark_as_used(); + contains_node.mark_as_used(); + is_path_of.mark_as_used(); + is_before.mark_as_used(); + is_lower_than.mark_as_used(); + next_path = WORLD.get_variables_manager().new_anonymous_variable(path_type); @@ -1390,7 +1457,7 @@ depth_no_change_operator [Variable current_node] (WS)* R_PAREN { - final Type path_type; + final Type path_type, depth_type; final Variable next_path, node_of_path; final hastabel.lang.Predicate depth, is_path_of, contains_node, is_before; @@ -1410,6 +1477,7 @@ depth_no_change_operator [Variable current_node] } path_type = WORLD.get_types_manager().get("path"); + depth_type = WORLD.get_types_manager().get("path"); depth = WORLD.get_predicates_manager().get("depth"); is_path_of = WORLD.get_predicates_manager().get("is_path_of"); contains_node = WORLD.get_predicates_manager().get("contains_node"); @@ -1427,6 +1495,13 @@ depth_no_change_operator [Variable current_node] WORLD.invalidate(); } + path_type.mark_as_used(); + depth_type.mark_as_used(); + depth.mark_as_used(); + contains_node.mark_as_used(); + is_path_of.mark_as_used(); + is_before.mark_as_used(); + next_path = WORLD.get_variables_manager().new_anonymous_variable(path_type); diff --git a/src/hastabel/lang/Predicate.java b/src/hastabel/lang/Predicate.java index bfdd701..47b9ed8 100644 --- a/src/hastabel/lang/Predicate.java +++ b/src/hastabel/lang/Predicate.java @@ -14,6 +14,7 @@ public class Predicate private final Collection<List<Type>> signatures; private final Set<List<Element>> members; private final String name; + private boolean is_used; public Predicate (final List<Type> signature, final String name) { @@ -23,6 +24,8 @@ public class Predicate this.name = name; members = new HashSet<List<Element>>(); + + is_used = false; } public Predicate (final Collection<List<Type>> signatures, final String name) @@ -116,6 +119,72 @@ public class Predicate return members; } + public Set<List<Type>> get_relevant_signatures () + { + final Set<List<Type>> result; + + result = new HashSet<List<Type>>(); + + for (final List<Type> signature: signatures) + { + boolean relevant_signature; + + relevant_signature = true; + + for (final Type sig_type: signature) + { + if (!sig_type.is_used()) + { + relevant_signature = false; + + break; + } + } + + if (relevant_signature) + { + result.add(signature); + } + } + + return result; + } + + public Set<List<Element>> get_relevant_members + ( + final Set<List<Type>> relevant_signatures + ) + { + final Set<List<Element>> result; + + Set<List<Element>> current_members, next_members; + + next_members = members; + + result = new HashSet<List<Element>>(); + + for (final List<Type> signature: relevant_signatures) + { + current_members = next_members; + + next_members = new HashSet<List<Element>>(); + + for (final List<Element> member: current_members) + { + if (is_compatible_with_signature(member, signature)) + { + result.add(member); + } + else + { + next_members.add(member); + } + } + } + + return result; + } + public Predicate shallow_copy () { return new Predicate(signatures, name); @@ -173,6 +242,26 @@ public class Predicate return sb.toString(); } + public void mark_as_used () + { + is_used = true; + } + + public void mark_as_used_as_function () + { + for (final List<Type> signature: signatures) + { + signature.get(signature.size() - 1).mark_as_used(); + } + + is_used = true; + } + + public boolean is_used () + { + return is_used; + } + @Override public String toString () { diff --git a/src/hastabel/lang/Type.java b/src/hastabel/lang/Type.java index 9676605..89a2cd2 100644 --- a/src/hastabel/lang/Type.java +++ b/src/hastabel/lang/Type.java @@ -12,6 +12,7 @@ public class Type private final Set<Type> sub_types; private final Type super_type; private final String name; + private boolean is_used; public Type (final Type super_type, final String name) { @@ -19,6 +20,8 @@ public class Type this.elements = new HashSet<Element>(); this.sub_types = new HashSet<Type>(); this.super_type = super_type; + + is_used = false; } public void add_sub_type (final Type t) @@ -36,6 +39,16 @@ public class Type return name; } + public void mark_as_used () + { + is_used = true; + } + + public boolean is_used () + { + return is_used; + } + public void add_element (final Element e) { elements.add(e); |