diff options
author | 2021-06-27 23:21:42 +0200 | |
---|---|---|
committer | 2021-06-27 23:30:25 +0200 | |
commit | 7febe0b4781c5bb0fab34895ad642040ae143a8b (patch) | |
tree | 5bc49f9195b18a938382f2527ee4ab273527a07a /language/src/main/java/org/eclipse/viatra/solver | |
parent | Electric semicolons (diff) | |
download | refinery-7febe0b4781c5bb0fab34895ad642040ae143a8b.tar.gz refinery-7febe0b4781c5bb0fab34895ad642040ae143a8b.tar.zst refinery-7febe0b4781c5bb0fab34895ad642040ae143a8b.zip |
Add data constant support
Diffstat (limited to 'language/src/main/java/org/eclipse/viatra/solver')
4 files changed, 100 insertions, 40 deletions
diff --git a/language/src/main/java/org/eclipse/viatra/solver/language/Problem.xtext b/language/src/main/java/org/eclipse/viatra/solver/language/Problem.xtext index 466988d8..7e253ef5 100644 --- a/language/src/main/java/org/eclipse/viatra/solver/language/Problem.xtext +++ b/language/src/main/java/org/eclipse/viatra/solver/language/Problem.xtext | |||
@@ -8,7 +8,7 @@ Problem: | |||
8 | statements+=Statement*; | 8 | statements+=Statement*; |
9 | 9 | ||
10 | Statement: | 10 | Statement: |
11 | ClassDeclaration | EnumDeclaration | PredicateDefinition | Assertion | ScopeDeclaration; | 11 | ClassDeclaration | EnumDeclaration | PredicateDefinition | Assertion | NodeValueAssertion | ScopeDeclaration; |
12 | 12 | ||
13 | ClassDeclaration: | 13 | ClassDeclaration: |
14 | abstract?="abstract"? "class" | 14 | abstract?="abstract"? "class" |
@@ -56,23 +56,53 @@ Atom: | |||
56 | "(" (arguments+=Argument ("," arguments+=Argument)*)? ")"; | 56 | "(" (arguments+=Argument ("," arguments+=Argument)*)? ")"; |
57 | 57 | ||
58 | Argument: | 58 | Argument: |
59 | VariableOrNodeArgument | ConstantArgument; | ||
60 | |||
61 | VariableOrNodeArgument: | ||
59 | variableOrNode=[VariableOrNode|QualifiedName]; | 62 | variableOrNode=[VariableOrNode|QualifiedName]; |
60 | 63 | ||
64 | ConstantArgument: | ||
65 | constant=Constant; | ||
66 | |||
61 | Assertion: | 67 | Assertion: |
62 | (relation=[Relation|QualifiedName] | 68 | (relation=[Relation|QualifiedName] |
63 | "(" (arguments+=[Node|QualifiedName] ("," arguments+=[Node|QualifiedName])*)? ")" | 69 | "(" (arguments+=AssertionArgument ("," arguments+=AssertionArgument)*)? ")" |
64 | ":" value=LogicValue | | 70 | ":" value=LogicValue | |
65 | value=ShortLogicValue? | 71 | value=ShortLogicValue? |
66 | relation=[Relation|QualifiedName] | 72 | relation=[Relation|QualifiedName] |
67 | "(" (arguments+=[Node|QualifiedName] ("," arguments+=[Node|QualifiedName])*)? ")") | 73 | "(" (arguments+=AssertionArgument ("," arguments+=AssertionArgument)*)? ")") |
68 | "."; | 74 | "."; |
69 | 75 | ||
76 | AssertionArgument: | ||
77 | NodeAssertionArgument | ConstantAssertionArgument; | ||
78 | |||
79 | NodeAssertionArgument: | ||
80 | node=[Node|QualifiedName]; | ||
81 | |||
82 | ConstantAssertionArgument: | ||
83 | constant=Constant; | ||
84 | |||
70 | enum LogicValue: | 85 | enum LogicValue: |
71 | TRUE="true" | FALSE="false" | UNKNOWN="unknown"; | 86 | TRUE="true" | FALSE="false" | UNKNOWN="unknown"; |
72 | 87 | ||
73 | enum ShortLogicValue returns LogicValue: | 88 | enum ShortLogicValue returns LogicValue: |
74 | FALSE="!" | UNKNOWN="?"; | 89 | FALSE="!" | UNKNOWN="?"; |
75 | 90 | ||
91 | NodeValueAssertion: | ||
92 | node=[Node|QualifiedName] ":" value=Constant "."; | ||
93 | |||
94 | Constant: | ||
95 | IntConstant | RealConstant | StringConstant; | ||
96 | |||
97 | IntConstant: | ||
98 | intValue=Integer; | ||
99 | |||
100 | RealConstant: | ||
101 | realValue=Real; | ||
102 | |||
103 | StringConstant: | ||
104 | stringValue=STRING; | ||
105 | |||
76 | ScopeDeclaration: | 106 | ScopeDeclaration: |
77 | "scope" typeScopes+=TypeScope ("," typeScopes+=TypeScope)* "."; | 107 | "scope" typeScopes+=TypeScope ("," typeScopes+=TypeScope)* "."; |
78 | 108 | ||
@@ -102,11 +132,21 @@ UpperBound returns ecore::EInt: | |||
102 | QuotedOrUnquotedId: | 132 | QuotedOrUnquotedId: |
103 | QUOTED_ID | Identifier; | 133 | QUOTED_ID | Identifier; |
104 | 134 | ||
105 | QualifiedName: | 135 | QualifiedName hidden(): |
106 | QUOTED_ID | Identifier ("::" Identifier)* ("::" QUOTED_ID)?; | 136 | QUOTED_ID | Identifier ("::" Identifier)* ("::" QUOTED_ID)?; |
107 | 137 | ||
108 | Identifier: | 138 | Identifier: |
109 | ID | "true" | "false"; | 139 | ID | "true" | "false" | "e" | "E"; |
140 | |||
141 | Integer returns ecore::EInt hidden(): | ||
142 | "-"? INT; | ||
143 | |||
144 | Real returns ecore::EDouble hidden(): | ||
145 | "-"? INT ("." INT | ("." INT)? ("e" | "E") ("-" | "+")? INT); | ||
146 | |||
147 | @Override | ||
148 | terminal ID: | ||
149 | ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*; | ||
110 | 150 | ||
111 | @Override | 151 | @Override |
112 | terminal STRING: | 152 | terminal STRING: |
@@ -117,4 +157,4 @@ terminal QUOTED_ID: | |||
117 | 157 | ||
118 | @Override | 158 | @Override |
119 | terminal SL_COMMENT: | 159 | terminal SL_COMMENT: |
120 | ('%' | '//') !('\n'|'\r')* ('\r'? '\n')?; | 160 | ('%' | '//') !('\n' | '\r')* ('\r'? '\n')?; |
diff --git a/language/src/main/java/org/eclipse/viatra/solver/language/ProblemUtil.java b/language/src/main/java/org/eclipse/viatra/solver/language/ProblemUtil.java index 09f062f5..e0a72687 100644 --- a/language/src/main/java/org/eclipse/viatra/solver/language/ProblemUtil.java +++ b/language/src/main/java/org/eclipse/viatra/solver/language/ProblemUtil.java | |||
@@ -38,13 +38,13 @@ public final class ProblemUtil { | |||
38 | } | 38 | } |
39 | 39 | ||
40 | public static boolean isSingletonVariable(Variable variable) { | 40 | public static boolean isSingletonVariable(Variable variable) { |
41 | return variable.eContainingFeature() == ProblemPackage.Literals.ARGUMENT__SINGLETON_VARIABLE; | 41 | return variable.eContainingFeature() == ProblemPackage.Literals.VARIABLE_OR_NODE_ARGUMENT__SINGLETON_VARIABLE; |
42 | } | 42 | } |
43 | 43 | ||
44 | public static boolean isEnumLiteral(Node node) { | 44 | public static boolean isEnumLiteral(Node node) { |
45 | return node.eContainingFeature() == ProblemPackage.Literals.ENUM_DECLARATION__LITERALS; | 45 | return node.eContainingFeature() == ProblemPackage.Literals.ENUM_DECLARATION__LITERALS; |
46 | } | 46 | } |
47 | 47 | ||
48 | public static boolean isEnumNode(Node node) { | 48 | public static boolean isEnumNode(Node node) { |
49 | String name = node.getName(); | 49 | String name = node.getName(); |
50 | boolean isNameQuoted = name != null && name.startsWith(ENUM_NODE_NAME_QUOTE) | 50 | boolean isNameQuoted = name != null && name.startsWith(ENUM_NODE_NAME_QUOTE) |
diff --git a/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemDerivedStateComputer.java b/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemDerivedStateComputer.java index b885ce0e..fc03fa87 100644 --- a/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemDerivedStateComputer.java +++ b/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemDerivedStateComputer.java | |||
@@ -11,6 +11,7 @@ import org.eclipse.emf.ecore.EStructuralFeature; | |||
11 | import org.eclipse.viatra.solver.language.ProblemUtil; | 11 | import org.eclipse.viatra.solver.language.ProblemUtil; |
12 | import org.eclipse.viatra.solver.language.model.problem.Argument; | 12 | import org.eclipse.viatra.solver.language.model.problem.Argument; |
13 | import org.eclipse.viatra.solver.language.model.problem.Assertion; | 13 | import org.eclipse.viatra.solver.language.model.problem.Assertion; |
14 | import org.eclipse.viatra.solver.language.model.problem.AssertionArgument; | ||
14 | import org.eclipse.viatra.solver.language.model.problem.Atom; | 15 | import org.eclipse.viatra.solver.language.model.problem.Atom; |
15 | import org.eclipse.viatra.solver.language.model.problem.ClassDeclaration; | 16 | import org.eclipse.viatra.solver.language.model.problem.ClassDeclaration; |
16 | import org.eclipse.viatra.solver.language.model.problem.Conjunction; | 17 | import org.eclipse.viatra.solver.language.model.problem.Conjunction; |
@@ -19,12 +20,15 @@ import org.eclipse.viatra.solver.language.model.problem.ImplicitVariable; | |||
19 | import org.eclipse.viatra.solver.language.model.problem.Literal; | 20 | import org.eclipse.viatra.solver.language.model.problem.Literal; |
20 | import org.eclipse.viatra.solver.language.model.problem.NegativeLiteral; | 21 | import org.eclipse.viatra.solver.language.model.problem.NegativeLiteral; |
21 | import org.eclipse.viatra.solver.language.model.problem.Node; | 22 | import org.eclipse.viatra.solver.language.model.problem.Node; |
23 | import org.eclipse.viatra.solver.language.model.problem.NodeAssertionArgument; | ||
24 | import org.eclipse.viatra.solver.language.model.problem.NodeValueAssertion; | ||
22 | import org.eclipse.viatra.solver.language.model.problem.Parameter; | 25 | import org.eclipse.viatra.solver.language.model.problem.Parameter; |
23 | import org.eclipse.viatra.solver.language.model.problem.PredicateDefinition; | 26 | import org.eclipse.viatra.solver.language.model.problem.PredicateDefinition; |
24 | import org.eclipse.viatra.solver.language.model.problem.Problem; | 27 | import org.eclipse.viatra.solver.language.model.problem.Problem; |
25 | import org.eclipse.viatra.solver.language.model.problem.ProblemFactory; | 28 | import org.eclipse.viatra.solver.language.model.problem.ProblemFactory; |
26 | import org.eclipse.viatra.solver.language.model.problem.ProblemPackage; | 29 | import org.eclipse.viatra.solver.language.model.problem.ProblemPackage; |
27 | import org.eclipse.viatra.solver.language.model.problem.Statement; | 30 | import org.eclipse.viatra.solver.language.model.problem.Statement; |
31 | import org.eclipse.viatra.solver.language.model.problem.VariableOrNodeArgument; | ||
28 | import org.eclipse.xtext.linking.impl.LinkingHelper; | 32 | import org.eclipse.xtext.linking.impl.LinkingHelper; |
29 | import org.eclipse.xtext.naming.IQualifiedNameConverter; | 33 | import org.eclipse.xtext.naming.IQualifiedNameConverter; |
30 | import org.eclipse.xtext.naming.QualifiedName; | 34 | import org.eclipse.xtext.naming.QualifiedName; |
@@ -97,7 +101,16 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer { | |||
97 | Set<String> nodeNames = new HashSet<>(); | 101 | Set<String> nodeNames = new HashSet<>(); |
98 | for (Statement statement : problem.getStatements()) { | 102 | for (Statement statement : problem.getStatements()) { |
99 | if (statement instanceof Assertion) { | 103 | if (statement instanceof Assertion) { |
100 | addNodeNames(nodeNames, nodeScope, statement, ProblemPackage.Literals.ASSERTION__ARGUMENTS, | 104 | Assertion assertion = (Assertion) statement; |
105 | for (AssertionArgument argument : assertion.getArguments()) { | ||
106 | if (argument instanceof NodeAssertionArgument) { | ||
107 | addNodeNames(nodeNames, nodeScope, argument, | ||
108 | ProblemPackage.Literals.NODE_ASSERTION_ARGUMENT__NODE, | ||
109 | ProblemDerivedStateComputer::validNodeName); | ||
110 | } | ||
111 | } | ||
112 | } else if (statement instanceof NodeValueAssertion) { | ||
113 | addNodeNames(nodeNames, nodeScope, statement, ProblemPackage.Literals.NODE_VALUE_ASSERTION__NODE, | ||
101 | ProblemDerivedStateComputer::validNodeName); | 114 | ProblemDerivedStateComputer::validNodeName); |
102 | } else if (statement instanceof PredicateDefinition) { | 115 | } else if (statement instanceof PredicateDefinition) { |
103 | PredicateDefinition predicateDefinition = (PredicateDefinition) statement; | 116 | PredicateDefinition predicateDefinition = (PredicateDefinition) statement; |
@@ -114,9 +127,11 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer { | |||
114 | continue; | 127 | continue; |
115 | } | 128 | } |
116 | for (Argument argument : atom.getArguments()) { | 129 | for (Argument argument : atom.getArguments()) { |
117 | addNodeNames(nodeNames, nodeScope, argument, | 130 | if (argument instanceof VariableOrNodeArgument) { |
118 | ProblemPackage.Literals.ARGUMENT__VARIABLE_OR_NODE, | 131 | addNodeNames(nodeNames, nodeScope, argument, |
119 | ProblemDerivedStateComputer::validQuotedId); | 132 | ProblemPackage.Literals.VARIABLE_OR_NODE_ARGUMENT__VARIABLE_OR_NODE, |
133 | ProblemDerivedStateComputer::validQuotedId); | ||
134 | } | ||
120 | } | 135 | } |
121 | } | 136 | } |
122 | } | 137 | } |
@@ -189,29 +204,31 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer { | |||
189 | 204 | ||
190 | protected void createSigletonVariablesAndCollectVariables(Atom atom, Set<String> knownVariables, | 205 | protected void createSigletonVariablesAndCollectVariables(Atom atom, Set<String> knownVariables, |
191 | Set<String> newVariables) { | 206 | Set<String> newVariables) { |
192 | IScope scope = scopeProvider.getScope(atom, ProblemPackage.Literals.ARGUMENT__VARIABLE_OR_NODE); | 207 | for (Argument argument : atom.getArguments()) { |
193 | List<INode> nodes = NodeModelUtils.findNodesForFeature(atom, ProblemPackage.Literals.ATOM__ARGUMENTS); | 208 | if (argument instanceof VariableOrNodeArgument) { |
194 | int nodesSize = nodes.size(); | 209 | VariableOrNodeArgument variableOrNodeArgument = (VariableOrNodeArgument) argument; |
195 | List<Argument> arguments = atom.getArguments(); | 210 | IScope scope = scopeProvider.getScope(variableOrNodeArgument, |
196 | int argumentsSize = arguments.size(); | 211 | ProblemPackage.Literals.VARIABLE_OR_NODE_ARGUMENT__VARIABLE_OR_NODE); |
197 | for (int i = 0; i < nodesSize; i++) { | 212 | List<INode> nodes = NodeModelUtils.findNodesForFeature(variableOrNodeArgument, |
198 | INode node = nodes.get(i); | 213 | ProblemPackage.Literals.VARIABLE_OR_NODE_ARGUMENT__VARIABLE_OR_NODE); |
199 | String variableName = linkingHelper.getCrossRefNodeAsString(node, true); | 214 | for (INode node : nodes) { |
200 | if (!validId(variableName)) { | 215 | String variableName = linkingHelper.getCrossRefNodeAsString(node, true); |
201 | continue; | 216 | if (!validId(variableName)) { |
202 | } | 217 | continue; |
203 | QualifiedName qualifiedName = qualifiedNameConverter.toQualifiedName(variableName); | 218 | } |
204 | if (scope.getSingleElement(qualifiedName) != null) { | 219 | QualifiedName qualifiedName = qualifiedNameConverter.toQualifiedName(variableName); |
205 | continue; | 220 | if (scope.getSingleElement(qualifiedName) != null) { |
206 | } | 221 | continue; |
207 | if (ProblemUtil.isSingletonVariableName(variableName)) { | 222 | } |
208 | if (i < argumentsSize) { | 223 | if (ProblemUtil.isSingletonVariableName(variableName)) { |
209 | createSingletonVariable(arguments.get(i), variableName); | 224 | createSingletonVariable(variableOrNodeArgument, variableName); |
225 | break; | ||
226 | } | ||
227 | if (!knownVariables.contains(variableName)) { | ||
228 | newVariables.add(variableName); | ||
229 | break; | ||
230 | } | ||
210 | } | 231 | } |
211 | continue; | ||
212 | } | ||
213 | if (!knownVariables.contains(variableName)) { | ||
214 | newVariables.add(variableName); | ||
215 | } | 232 | } |
216 | } | 233 | } |
217 | } | 234 | } |
@@ -229,7 +246,7 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer { | |||
229 | } | 246 | } |
230 | } | 247 | } |
231 | 248 | ||
232 | protected void createSingletonVariable(Argument argument, String variableName) { | 249 | protected void createSingletonVariable(VariableOrNodeArgument argument, String variableName) { |
233 | if (validId(variableName)) { | 250 | if (validId(variableName)) { |
234 | ImplicitVariable variable = createNamedVariable(variableName); | 251 | ImplicitVariable variable = createNamedVariable(variableName); |
235 | argument.setSingletonVariable(variable); | 252 | argument.setSingletonVariable(variable); |
@@ -281,7 +298,10 @@ public class ProblemDerivedStateComputer implements IDerivedStateComputer { | |||
281 | return; | 298 | return; |
282 | } | 299 | } |
283 | for (Argument argument : atom.getArguments()) { | 300 | for (Argument argument : atom.getArguments()) { |
284 | argument.setSingletonVariable(null); | 301 | if (argument instanceof VariableOrNodeArgument) { |
302 | VariableOrNodeArgument variableOrNodeArgument = (VariableOrNodeArgument) argument; | ||
303 | variableOrNodeArgument.setSingletonVariable(null); | ||
304 | } | ||
285 | } | 305 | } |
286 | } | 306 | } |
287 | 307 | ||
diff --git a/language/src/main/java/org/eclipse/viatra/solver/language/scoping/ProblemScopeProvider.java b/language/src/main/java/org/eclipse/viatra/solver/language/scoping/ProblemScopeProvider.java index fc4034ae..3748e81d 100644 --- a/language/src/main/java/org/eclipse/viatra/solver/language/scoping/ProblemScopeProvider.java +++ b/language/src/main/java/org/eclipse/viatra/solver/language/scoping/ProblemScopeProvider.java | |||
@@ -10,7 +10,6 @@ import java.util.List; | |||
10 | import org.eclipse.emf.ecore.EObject; | 10 | import org.eclipse.emf.ecore.EObject; |
11 | import org.eclipse.emf.ecore.EReference; | 11 | import org.eclipse.emf.ecore.EReference; |
12 | import org.eclipse.viatra.solver.language.ProblemUtil; | 12 | import org.eclipse.viatra.solver.language.ProblemUtil; |
13 | import org.eclipse.viatra.solver.language.model.problem.Argument; | ||
14 | import org.eclipse.viatra.solver.language.model.problem.ClassDeclaration; | 13 | import org.eclipse.viatra.solver.language.model.problem.ClassDeclaration; |
15 | import org.eclipse.viatra.solver.language.model.problem.ExistentialQuantifier; | 14 | import org.eclipse.viatra.solver.language.model.problem.ExistentialQuantifier; |
16 | import org.eclipse.viatra.solver.language.model.problem.PredicateDefinition; | 15 | import org.eclipse.viatra.solver.language.model.problem.PredicateDefinition; |
@@ -18,6 +17,7 @@ import org.eclipse.viatra.solver.language.model.problem.ProblemPackage; | |||
18 | import org.eclipse.viatra.solver.language.model.problem.ReferenceDeclaration; | 17 | import org.eclipse.viatra.solver.language.model.problem.ReferenceDeclaration; |
19 | import org.eclipse.viatra.solver.language.model.problem.Relation; | 18 | import org.eclipse.viatra.solver.language.model.problem.Relation; |
20 | import org.eclipse.viatra.solver.language.model.problem.Variable; | 19 | import org.eclipse.viatra.solver.language.model.problem.Variable; |
20 | import org.eclipse.viatra.solver.language.model.problem.VariableOrNodeArgument; | ||
21 | import org.eclipse.xtext.EcoreUtil2; | 21 | import org.eclipse.xtext.EcoreUtil2; |
22 | import org.eclipse.xtext.scoping.IScope; | 22 | import org.eclipse.xtext.scoping.IScope; |
23 | import org.eclipse.xtext.scoping.Scopes; | 23 | import org.eclipse.xtext.scoping.Scopes; |
@@ -34,7 +34,7 @@ public class ProblemScopeProvider extends AbstractProblemScopeProvider { | |||
34 | @Override | 34 | @Override |
35 | public IScope getScope(EObject context, EReference reference) { | 35 | public IScope getScope(EObject context, EReference reference) { |
36 | IScope scope = super.getScope(context, reference); | 36 | IScope scope = super.getScope(context, reference); |
37 | if (reference == ProblemPackage.Literals.ARGUMENT__VARIABLE_OR_NODE) { | 37 | if (reference == ProblemPackage.Literals.VARIABLE_OR_NODE_ARGUMENT__VARIABLE_OR_NODE) { |
38 | return getVariableScope(context, scope); | 38 | return getVariableScope(context, scope); |
39 | } else if (reference == ProblemPackage.Literals.REFERENCE_DECLARATION__OPPOSITE) { | 39 | } else if (reference == ProblemPackage.Literals.REFERENCE_DECLARATION__OPPOSITE) { |
40 | return getOppositeScope(context, scope); | 40 | return getOppositeScope(context, scope); |
@@ -45,8 +45,8 @@ public class ProblemScopeProvider extends AbstractProblemScopeProvider { | |||
45 | protected IScope getVariableScope(EObject context, IScope delegateScope) { | 45 | protected IScope getVariableScope(EObject context, IScope delegateScope) { |
46 | List<Variable> variables = new ArrayList<>(); | 46 | List<Variable> variables = new ArrayList<>(); |
47 | EObject currentContext = context; | 47 | EObject currentContext = context; |
48 | if (context instanceof Argument) { | 48 | if (context instanceof VariableOrNodeArgument) { |
49 | Argument argument = (Argument) context; | 49 | VariableOrNodeArgument argument = (VariableOrNodeArgument) context; |
50 | Variable singletonVariable = argument.getSingletonVariable(); | 50 | Variable singletonVariable = argument.getSingletonVariable(); |
51 | if (singletonVariable != null) { | 51 | if (singletonVariable != null) { |
52 | variables.add(singletonVariable); | 52 | variables.add(singletonVariable); |