| summaryrefslogtreecommitdiff |
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2017-07-24 15:09:30 +0200 |
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2017-07-24 15:09:30 +0200 |
| commit | bfded94070ef7bc2330acd086c5c5c8144bf99fd (patch) | |
| tree | cd54f13e499f0298546ea1659d0d60e08f85d8b3 | |
| parent | 66cfd64a7ed0c3809e033b0976c17e95bc6c50ca (diff) | |
Lets users use projections in predicates.
| -rw-r--r-- | instr-to-kodkod/parser/PropertyParser.g4 | 108 |
1 files changed, 88 insertions, 20 deletions
diff --git a/instr-to-kodkod/parser/PropertyParser.g4 b/instr-to-kodkod/parser/PropertyParser.g4 index dcc20c8..b44fbe2 100644 --- a/instr-to-kodkod/parser/PropertyParser.g4 +++ b/instr-to-kodkod/parser/PropertyParser.g4 @@ -97,11 +97,12 @@ tag_item ; id_list - returns [List<Variable> list] + returns [List<Variable> list, boolean has_joker] @init { final List<Variable> result = new ArrayList<Variable>(); + boolean used_joker = false; } : @@ -109,12 +110,21 @@ id_list (WS)+ ID { - result.add(Main.get_variable_manager().get_variable(($ID.text))); + if (($ID.text).equals("_")) + { + used_joker = true; + result.add((Variable) null); + } + else + { + result.add(Main.get_variable_manager().get_variable(($ID.text))); + } } )* { $list = result; + $has_joker = used_joker; } ; @@ -131,14 +141,45 @@ sl_predicate (WS)* R_PAREN { - $result = - Expression.product - ( - ($id_list.list) - ).in - ( - Main.get_model().get_predicate_as_relation(($ID.text)) - ); + final Expression predicate; + final List<Variable> ids; + + + if (($id_list.has_joker)) + { + final List<IntConstant> columns; + final int params_length; + + ids = new ArrayList<Variable>(); + columns = new ArrayList<IntConstant>(); + + params_length = ($id_list.list).size(); + + for (int i = 0; i < params_length; ++i) + { + if (($id_list.list).get(i) != (Variable) null) + { + columns.add(IntConstant.constant(i)); + ids.add(($id_list.list).get(i)); + } + } + + predicate = + Main.get_model().get_predicate_as_relation + ( + ($ID.text) + ).project + ( + (IntExpression[]) columns.toArray() + ); + } + else + { + predicate = Main.get_model().get_predicate_as_relation(($ID.text)); + ids = ($id_list.list); + } + + $result = Expression.product(ids).in(predicate); } ; @@ -367,18 +408,45 @@ bl_predicate [Variable current_node] (WS)* R_PAREN { - $result = - current_node.product - ( - Expression.product + final Expression predicate; + final List<Variable> ids; + + + if (($id_list.has_joker)) + { + final List<IntConstant> columns; + final int params_length; + + ids = new ArrayList<Variable>(); + columns = new ArrayList<IntConstant>(); + + params_length = ($id_list.list).size(); + + for (int i = 0; i < params_length; ++i) + { + if (($id_list.list).get(i) != (Variable) null) + { + columns.add(IntConstant.constant(i + 1)); // Offset for the node + ids.add(($id_list.list).get(i)); + } + } + + predicate = + Main.get_model().get_predicate_as_relation ( - ($id_list.list) - ) - ).in - ( - Main.get_model().get_predicate_as_relation(($ID.text)) - ); + ($ID.text) + ).project + ( + (IntExpression[]) columns.toArray() + ); + } + else + { + predicate = Main.get_model().get_predicate_as_relation(($ID.text)); + ids = ($id_list.list); + } + $result = current_node.product(Expression.product(ids)).in(predicate); } ; |


