summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2017-07-26 14:32:28 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2017-07-26 14:32:28 +0200
commit5f06e34bc24876739c1d4af1d45f7cb322a19559 (patch)
tree38363a28b472610d5dc8391baeba2d98e731fa2c /instr-to-kodkod/parser/PropertyParser.g4
parent1eb79a5c6ae03500a2816a34983e5d4cc700de33 (diff)
First shot at (logic, not VHDL) functions.
Diffstat (limited to 'instr-to-kodkod/parser/PropertyParser.g4')
-rw-r--r--instr-to-kodkod/parser/PropertyParser.g4195
1 files changed, 105 insertions, 90 deletions
diff --git a/instr-to-kodkod/parser/PropertyParser.g4 b/instr-to-kodkod/parser/PropertyParser.g4
index 82eb429..29e91d2 100644
--- a/instr-to-kodkod/parser/PropertyParser.g4
+++ b/instr-to-kodkod/parser/PropertyParser.g4
@@ -116,7 +116,7 @@ tag_item
}
;
-id_or_string
+id_or_string_or_fun [Variable current_node]
returns [Expression value]
:
@@ -138,9 +138,15 @@ id_or_string
$value = Main.get_string_manager().get_string_as_relation(($STRING.text));
System.out.println("Using (STR \"" + ($STRING.text) + "\" " + ($value) + ")");
}
+
+ |
+ function[current_node]
+ {
+ $value = ($function.result);
+ }
;
-id_list
+id_list [Variable current_node]
returns [List<Expression> list, boolean has_joker]
@init
@@ -152,14 +158,14 @@ id_list
:
(
(WS)+
- id_or_string
+ id_or_string_or_fun[current_node]
{
- if (($id_or_string.value) == (Expression) null)
+ if (($id_or_string_or_fun.value) == (Expression) null)
{
used_joker = true;
}
- result.add(($id_or_string.value));
+ result.add(($id_or_string_or_fun.value));
}
)*
@@ -169,16 +175,12 @@ id_list
}
;
-/******************************************************************************/
-/** Structural Level **********************************************************/
-/******************************************************************************/
-
-sl_predicate
+predicate [Variable current_node]
returns [Formula result]:
(WS)* L_PAREN
ID
- id_list
+ id_list[current_node]
(WS)* R_PAREN
{
@@ -198,7 +200,7 @@ sl_predicate
(
"[F] The property uses an unknown predicate: \""
+ ($ID.text)
- + "\" at structural level. (l."
+ + "\" (l."
+ ($ID.getLine())
+ " c."
+ ($ID.getCharPositionInLine())
@@ -212,17 +214,30 @@ sl_predicate
{
final List<IntExpression> columns;
final int params_length;
+ final int offset;
ids = new ArrayList<Expression>();
columns = new ArrayList<IntExpression>();
params_length = ($id_list.list).size();
+ if (current_node == null)
+ {
+ offset = 0;
+ }
+ else
+ {
+ offset = 1;
+
+ ids.add(current_node);
+ columns.add(IntConstant.constant(0));
+ }
+
for (int i = 0; i < params_length; ++i)
{
if (($id_list.list).get(i) != (Expression) null)
{
- columns.add(IntConstant.constant(i));
+ columns.add(IntConstant.constant(i + offset));
ids.add(($id_list.list).get(i));
}
}
@@ -237,12 +252,85 @@ sl_predicate
{
predicate = predicate_as_relation;
ids = ($id_list.list);
+
+ if (current_node != null)
+ {
+ ids.add(0, current_node);
+ }
}
$result = Expression.product(ids).in(predicate);
}
;
+function [Variable current_node]
+ returns [Expression result]:
+
+ (WS)* L_BRAKT
+ ID
+ id_list[current_node]
+ (WS)* R_BRAKT
+
+ {
+ final Expression predicate;
+ final List<Expression> ids;
+ final Relation predicate_as_relation;
+
+ predicate_as_relation =
+ Main.get_model().get_predicate_as_relation
+ (
+ ($ID.text)
+ );
+
+ if (predicate_as_relation == (Relation) null)
+ {
+ System.err.println
+ (
+ "[F] The property uses an unknown predicate: \""
+ + ($ID.text)
+ + "\" (l."
+ + ($ID.getLine())
+ + " c."
+ + ($ID.getCharPositionInLine())
+ + ")."
+ );
+
+ System.exit(-1);
+ }
+
+ if (($id_list.has_joker))
+ {
+ System.err.println
+ (
+ "[F] The property uses a joker inside a function: \""
+ + ($ID.text)
+ + "\" (l."
+ + ($ID.getLine())
+ + " c."
+ + ($ID.getCharPositionInLine())
+ + ")."
+ );
+
+ System.exit(-1);
+ }
+ else
+ {
+ predicate = predicate_as_relation;
+ ids = ($id_list.list);
+
+ if (current_node != null)
+ {
+ ids.add(0, current_node);
+ }
+
+ $result = Expression.product(ids).join(predicate);
+ }
+ }
+;
+
+/******************************************************************************/
+/** Structural Level **********************************************************/
+/******************************************************************************/
sl_non_empty_formula_list
returns [List<Formula> list]
@@ -466,9 +554,9 @@ sl_ctl_verifies_operator
sl_formula
returns [Formula result]:
- sl_predicate
+ predicate[null]
{
- $result = ($sl_predicate.result);
+ $result = ($predicate.result);
}
| sl_and_operator
@@ -510,79 +598,6 @@ sl_formula
/******************************************************************************/
/** Behavioral Level **********************************************************/
/******************************************************************************/
-bl_predicate [Variable current_node]
- returns [Formula result]:
-
- (WS)* L_PAREN
- ID
- id_list
- (WS)* R_PAREN
-
- {
- final Expression predicate;
- final List<Expression> ids;
- final Relation predicate_as_relation;
-
- predicate_as_relation =
- Main.get_model().get_predicate_as_relation
- (
- ($ID.text)
- );
-
- if (predicate_as_relation == (Relation) null)
- {
- System.err.println
- (
- "[F] The property uses an unknown predicate: \""
- + ($ID.text)
- + "\" at behavioral level (l."
- + ($ID.getLine())
- + " c."
- + ($ID.getCharPositionInLine())
- + ")."
- );
-
- System.exit(-1);
- }
-
- if (($id_list.has_joker))
- {
- final List<IntExpression> columns;
- final int params_length;
-
- ids = new ArrayList<Expression>();
- columns = new ArrayList<IntExpression>();
-
- params_length = ($id_list.list).size();
-
- /* We always keep the node id. */
- columns.add(IntConstant.constant(0));
-
- for (int i = 0; i < params_length; ++i)
- {
- if (($id_list.list).get(i) != (Expression) null)
- {
- columns.add(IntConstant.constant(i + 1)); // Offset for the node
- ids.add(($id_list.list).get(i));
- }
- }
-
- predicate =
- predicate_as_relation.project
- (
- columns.toArray(new IntExpression[columns.size()])
- );
- }
- else
- {
- predicate = predicate_as_relation;
- ids = ($id_list.list);
- }
-
- $result = current_node.product(Expression.product(ids)).in(predicate);
- }
-;
-
bl_formula_list [Variable current_node]
returns [List<Formula> list]
@@ -1017,9 +1032,9 @@ bl_eu_operator [Variable current_node]
bl_formula [Variable current_node]
returns [Formula result]:
- bl_predicate[current_node]
+ predicate[current_node]
{
- $result = ($bl_predicate.result);
+ $result = ($predicate.result);
}
| bl_and_operator[current_node]
{