From bfded94070ef7bc2330acd086c5c5c8144bf99fd Mon Sep 17 00:00:00 2001 From: Nathanael Sensfelder Date: Mon, 24 Jul 2017 15:09:30 +0200 Subject: Lets users use projections in predicates. --- instr-to-kodkod/parser/PropertyParser.g4 | 108 +++++++++++++++++++++++++------ 1 file 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 list] + returns [List list, boolean has_joker] @init { final List result = new ArrayList(); + 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 ids; + + + if (($id_list.has_joker)) + { + final List columns; + final int params_length; + + ids = new ArrayList(); + columns = new ArrayList(); + + 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 ids; + + + if (($id_list.has_joker)) + { + final List columns; + final int params_length; + + ids = new ArrayList(); + columns = new ArrayList(); + + 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); } ; -- cgit v1.2.3-70-g09d2