aboutsummaryrefslogtreecommitdiffstats
path: root/language/src/main/java/org/eclipse/viatra/solver
diff options
context:
space:
mode:
Diffstat (limited to 'language/src/main/java/org/eclipse/viatra/solver')
-rw-r--r--language/src/main/java/org/eclipse/viatra/solver/language/Problem.xtext32
-rw-r--r--language/src/main/java/org/eclipse/viatra/solver/language/ProblemUtil.java11
-rw-r--r--language/src/main/java/org/eclipse/viatra/solver/language/naming/NamingUtil.java10
-rw-r--r--language/src/main/java/org/eclipse/viatra/solver/language/resource/NodeNameCollector.java47
-rw-r--r--language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemLocationInFileProvider.java2
-rw-r--r--language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemResourceDescriptionStrategy.java3
6 files changed, 28 insertions, 77 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 9e032a13..d4fa6f35 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,8 @@ Problem:
8 statements+=Statement*; 8 statements+=Statement*;
9 9
10Statement: 10Statement:
11 ClassDeclaration | EnumDeclaration | PredicateDefinition | Assertion | NodeValueAssertion | ScopeDeclaration; 11 ClassDeclaration | EnumDeclaration | PredicateDefinition | Assertion | NodeValueAssertion | ScopeDeclaration |
12 UniqueDeclaration;
12 13
13ClassDeclaration: 14ClassDeclaration:
14 abstract?="abstract"? "class" 15 abstract?="abstract"? "class"
@@ -25,7 +26,7 @@ EnumLiteral returns Node:
25 name=Identifier; 26 name=Identifier;
26 27
27ReferenceDeclaration: 28ReferenceDeclaration:
28 (containment?="contains" | "refers")? 29 (-> (containment?="contains" | "refers"))?
29 referenceType=[Relation|QualifiedName] 30 referenceType=[Relation|QualifiedName]
30 ("[" multiplicity=Multiplicity "]")? 31 ("[" multiplicity=Multiplicity "]")?
31 name=Identifier 32 name=Identifier
@@ -35,7 +36,7 @@ PredicateDefinition:
35 (error?="error" "pred"? | "pred") 36 (error?="error" "pred"? | "pred")
36 name=Identifier 37 name=Identifier
37 "(" (parameters+=Parameter ("," parameters+=Parameter)*)? ")" 38 "(" (parameters+=Parameter ("," parameters+=Parameter)*)? ")"
38 ("<=>" bodies+=Conjunction (";" bodies+=Conjunction)*)? 39 ("<->" bodies+=Conjunction (";" bodies+=Conjunction)*)?
39 "."; 40 ".";
40 41
41Parameter: 42Parameter:
@@ -65,6 +66,7 @@ ConstantArgument:
65 constant=Constant; 66 constant=Constant;
66 67
67Assertion: 68Assertion:
69 default?="default"?
68 (relation=[Relation|QualifiedName] 70 (relation=[Relation|QualifiedName]
69 "(" (arguments+=AssertionArgument ("," arguments+=AssertionArgument)*)? ")" 71 "(" (arguments+=AssertionArgument ("," arguments+=AssertionArgument)*)? ")"
70 ":" value=LogicValue | 72 ":" value=LogicValue |
@@ -74,16 +76,19 @@ Assertion:
74 "."; 76 ".";
75 77
76AssertionArgument: 78AssertionArgument:
77 NodeAssertionArgument | ConstantAssertionArgument; 79 NodeAssertionArgument | WildcardAssertionArgument | ConstantAssertionArgument;
78 80
79NodeAssertionArgument: 81NodeAssertionArgument:
80 node=[Node|QualifiedName]; 82 node=[Node|QualifiedName];
81 83
84WildcardAssertionArgument:
85 {WildcardAssertionArgument} "*";
86
82ConstantAssertionArgument: 87ConstantAssertionArgument:
83 constant=Constant; 88 constant=Constant;
84 89
85enum LogicValue: 90enum LogicValue:
86 TRUE="true" | FALSE="false" | UNKNOWN="unknown"; 91 TRUE="true" | FALSE="false" | UNKNOWN="unknown" | ERROR="error";
87 92
88enum ShortLogicValue returns LogicValue: 93enum ShortLogicValue returns LogicValue:
89 FALSE="!" | UNKNOWN="?"; 94 FALSE="!" | UNKNOWN="?";
@@ -126,14 +131,18 @@ RangeMultiplicity:
126ExactMultiplicity: 131ExactMultiplicity:
127 exactValue=INT; 132 exactValue=INT;
128 133
134UniqueDeclaration:
135 "unique" nodes+=EnumLiteral ("," nodes+=EnumLiteral)* ".";
136
129UpperBound returns ecore::EInt: 137UpperBound returns ecore::EInt:
130 INT | "*"; 138 INT | "*";
131 139
132QualifiedName hidden(): 140QualifiedName hidden():
133 QUOTED_ID | Identifier ("::" Identifier)*; 141 Identifier ("::" Identifier)*;
134 142
135Identifier: 143Identifier:
136 ID | "true" | "false"; 144 ID | "true" | "false" | "unknown" | "error" | "class" | "abstract" | "extends" | "enum" | "pred" | "scope" |
145 "unique" | "default" | "problem" | "contains" | "refers";
137 146
138Integer returns ecore::EInt hidden(): 147Integer returns ecore::EInt hidden():
139 "-"? INT; 148 "-"? INT;
@@ -143,18 +152,11 @@ Real returns ecore::EDouble:
143 152
144@Override 153@Override
145terminal ID: 154terminal ID:
146 ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*; 155 ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*;
147 156
148terminal EXPONENTIAL: 157terminal EXPONENTIAL:
149 INT ("e" | "E") ("+" | "-")? INT; 158 INT ("e" | "E") ("+" | "-")? INT;
150 159
151@Override 160@Override
152terminal STRING:
153 '"' ('\\' . /* 'b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\' */ | !('\\' | '"'))* '"';
154
155terminal QUOTED_ID:
156 "'" ('\\' . /* 'b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\' */ | !('\\' | "'"))* "'";
157
158@Override
159terminal SL_COMMENT: 161terminal SL_COMMENT:
160 ('%' | '//') !('\n' | '\r')* ('\r'? '\n')?; 162 ('%' | '//') !('\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 2d7fede6..1581186c 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
@@ -16,7 +16,6 @@ import org.eclipse.viatra.solver.language.model.problem.ProblemPackage;
16import org.eclipse.viatra.solver.language.model.problem.ReferenceDeclaration; 16import org.eclipse.viatra.solver.language.model.problem.ReferenceDeclaration;
17import org.eclipse.viatra.solver.language.model.problem.Relation; 17import org.eclipse.viatra.solver.language.model.problem.Relation;
18import org.eclipse.viatra.solver.language.model.problem.Variable; 18import org.eclipse.viatra.solver.language.model.problem.Variable;
19import org.eclipse.viatra.solver.language.naming.NamingUtil;
20import org.eclipse.viatra.solver.language.scoping.ProblemGlobalScopeProvider; 19import org.eclipse.viatra.solver.language.scoping.ProblemGlobalScopeProvider;
21 20
22import com.google.common.collect.ImmutableList; 21import com.google.common.collect.ImmutableList;
@@ -32,12 +31,10 @@ public final class ProblemUtil {
32 return variable.eContainingFeature() == ProblemPackage.Literals.VARIABLE_OR_NODE_ARGUMENT__SINGLETON_VARIABLE; 31 return variable.eContainingFeature() == ProblemPackage.Literals.VARIABLE_OR_NODE_ARGUMENT__SINGLETON_VARIABLE;
33 } 32 }
34 33
35 public static boolean isEnumLiteral(Node node) { 34 public static boolean isUniqueNode(Node node) {
36 return node.eContainingFeature() == ProblemPackage.Literals.ENUM_DECLARATION__LITERALS; 35 var containingFeature = node.eContainingFeature();
37 } 36 return containingFeature == ProblemPackage.Literals.UNIQUE_DECLARATION__NODES
38 37 || containingFeature == ProblemPackage.Literals.ENUM_DECLARATION__LITERALS;
39 public static boolean isEnumNode(Node node) {
40 return NamingUtil.isQuotedName(node.getName()) || isEnumLiteral(node);
41 } 38 }
42 39
43 public static boolean isNewNode(Node node) { 40 public static boolean isNewNode(Node node) {
diff --git a/language/src/main/java/org/eclipse/viatra/solver/language/naming/NamingUtil.java b/language/src/main/java/org/eclipse/viatra/solver/language/naming/NamingUtil.java
index decc014a..edd455bb 100644
--- a/language/src/main/java/org/eclipse/viatra/solver/language/naming/NamingUtil.java
+++ b/language/src/main/java/org/eclipse/viatra/solver/language/naming/NamingUtil.java
@@ -4,8 +4,6 @@ import java.util.regex.Pattern;
4 4
5public final class NamingUtil { 5public final class NamingUtil {
6 private static final String SINGLETON_VARIABLE_PREFIX = "_"; 6 private static final String SINGLETON_VARIABLE_PREFIX = "_";
7
8 private static final String ENUM_NODE_NAME_QUOTE = "'";
9 7
10 private static final Pattern ID_REGEX = Pattern.compile("[_a-zA-Z][_0-9a-zA-Z]*"); 8 private static final Pattern ID_REGEX = Pattern.compile("[_a-zA-Z][_0-9a-zA-Z]*");
11 9
@@ -20,16 +18,8 @@ public final class NamingUtil {
20 public static boolean isSingletonVariableName(String name) { 18 public static boolean isSingletonVariableName(String name) {
21 return name != null && name.startsWith(SINGLETON_VARIABLE_PREFIX); 19 return name != null && name.startsWith(SINGLETON_VARIABLE_PREFIX);
22 } 20 }
23
24 public static boolean isQuotedName(String name) {
25 return name != null && name.startsWith(ENUM_NODE_NAME_QUOTE) && name.endsWith(ENUM_NODE_NAME_QUOTE);
26 }
27 21
28 public static boolean isValidId(String name) { 22 public static boolean isValidId(String name) {
29 return name != null && ID_REGEX.matcher(name).matches(); 23 return name != null && ID_REGEX.matcher(name).matches();
30 } 24 }
31
32 public static boolean isValidNodeName(String name) {
33 return isValidId(name) || isQuotedName(name);
34 }
35} 25}
diff --git a/language/src/main/java/org/eclipse/viatra/solver/language/resource/NodeNameCollector.java b/language/src/main/java/org/eclipse/viatra/solver/language/resource/NodeNameCollector.java
index 597dd92d..e9533c25 100644
--- a/language/src/main/java/org/eclipse/viatra/solver/language/resource/NodeNameCollector.java
+++ b/language/src/main/java/org/eclipse/viatra/solver/language/resource/NodeNameCollector.java
@@ -2,24 +2,16 @@ package org.eclipse.viatra.solver.language.resource;
2 2
3import java.util.List; 3import java.util.List;
4import java.util.Set; 4import java.util.Set;
5import java.util.function.Predicate;
6 5
7import org.eclipse.emf.ecore.EObject; 6import org.eclipse.emf.ecore.EObject;
8import org.eclipse.emf.ecore.EStructuralFeature; 7import org.eclipse.emf.ecore.EStructuralFeature;
9import org.eclipse.viatra.solver.language.model.problem.Argument;
10import org.eclipse.viatra.solver.language.model.problem.Assertion; 8import org.eclipse.viatra.solver.language.model.problem.Assertion;
11import org.eclipse.viatra.solver.language.model.problem.AssertionArgument; 9import org.eclipse.viatra.solver.language.model.problem.AssertionArgument;
12import org.eclipse.viatra.solver.language.model.problem.Atom;
13import org.eclipse.viatra.solver.language.model.problem.Conjunction;
14import org.eclipse.viatra.solver.language.model.problem.Literal;
15import org.eclipse.viatra.solver.language.model.problem.NegativeLiteral;
16import org.eclipse.viatra.solver.language.model.problem.NodeAssertionArgument; 10import org.eclipse.viatra.solver.language.model.problem.NodeAssertionArgument;
17import org.eclipse.viatra.solver.language.model.problem.NodeValueAssertion; 11import org.eclipse.viatra.solver.language.model.problem.NodeValueAssertion;
18import org.eclipse.viatra.solver.language.model.problem.PredicateDefinition;
19import org.eclipse.viatra.solver.language.model.problem.Problem; 12import org.eclipse.viatra.solver.language.model.problem.Problem;
20import org.eclipse.viatra.solver.language.model.problem.ProblemPackage; 13import org.eclipse.viatra.solver.language.model.problem.ProblemPackage;
21import org.eclipse.viatra.solver.language.model.problem.Statement; 14import org.eclipse.viatra.solver.language.model.problem.Statement;
22import org.eclipse.viatra.solver.language.model.problem.VariableOrNodeArgument;
23import org.eclipse.viatra.solver.language.naming.NamingUtil; 15import org.eclipse.viatra.solver.language.naming.NamingUtil;
24import org.eclipse.xtext.linking.impl.LinkingHelper; 16import org.eclipse.xtext.linking.impl.LinkingHelper;
25import org.eclipse.xtext.naming.IQualifiedNameConverter; 17import org.eclipse.xtext.naming.IQualifiedNameConverter;
@@ -64,57 +56,26 @@ public class NodeNameCollector {
64 collectAssertionNodeNames((Assertion) statement); 56 collectAssertionNodeNames((Assertion) statement);
65 } else if (statement instanceof NodeValueAssertion) { 57 } else if (statement instanceof NodeValueAssertion) {
66 collectNodeValueAssertionNodeNames((NodeValueAssertion) statement); 58 collectNodeValueAssertionNodeNames((NodeValueAssertion) statement);
67 } else if (statement instanceof PredicateDefinition) {
68 collectPredicateDefinitionNodeNames((PredicateDefinition) statement);
69 } 59 }
70 } 60 }
71 61
72 protected void collectAssertionNodeNames(Assertion assertion) { 62 protected void collectAssertionNodeNames(Assertion assertion) {
73 for (AssertionArgument argument : assertion.getArguments()) { 63 for (AssertionArgument argument : assertion.getArguments()) {
74 if (argument instanceof NodeAssertionArgument) { 64 if (argument instanceof NodeAssertionArgument) {
75 collectNodeNames(argument, ProblemPackage.Literals.NODE_ASSERTION_ARGUMENT__NODE, 65 collectNodeNames(argument, ProblemPackage.Literals.NODE_ASSERTION_ARGUMENT__NODE);
76 NamingUtil::isValidNodeName);
77 } 66 }
78 } 67 }
79 } 68 }
80 69
81 protected void collectNodeValueAssertionNodeNames(NodeValueAssertion nodeValueAssertion) { 70 protected void collectNodeValueAssertionNodeNames(NodeValueAssertion nodeValueAssertion) {
82 collectNodeNames(nodeValueAssertion, ProblemPackage.Literals.NODE_VALUE_ASSERTION__NODE, 71 collectNodeNames(nodeValueAssertion, ProblemPackage.Literals.NODE_VALUE_ASSERTION__NODE);
83 NamingUtil::isValidNodeName);
84 } 72 }
85 73
86 protected void collectPredicateDefinitionNodeNames(PredicateDefinition predicateDefinition) { 74 private void collectNodeNames(EObject eObject, EStructuralFeature feature) {
87 for (Conjunction body : predicateDefinition.getBodies()) {
88 for (Literal literal : body.getLiterals()) {
89 collectLiteralNodeNames(literal);
90 }
91 }
92 }
93
94 protected void collectLiteralNodeNames(Literal literal) {
95 Atom atom = null;
96 if (literal instanceof Atom) {
97 atom = (Atom) literal;
98 } else if (literal instanceof NegativeLiteral) {
99 var negativeLiteral = (NegativeLiteral) literal;
100 atom = negativeLiteral.getAtom();
101 }
102 if (atom == null) {
103 return;
104 }
105 for (Argument argument : atom.getArguments()) {
106 if (argument instanceof VariableOrNodeArgument) {
107 collectNodeNames(argument, ProblemPackage.Literals.VARIABLE_OR_NODE_ARGUMENT__VARIABLE_OR_NODE,
108 NamingUtil::isQuotedName);
109 }
110 }
111 }
112
113 private void collectNodeNames(EObject eObject, EStructuralFeature feature, Predicate<String> condition) {
114 List<INode> nodes = NodeModelUtils.findNodesForFeature(eObject, feature); 75 List<INode> nodes = NodeModelUtils.findNodesForFeature(eObject, feature);
115 for (INode node : nodes) { 76 for (INode node : nodes) {
116 var nodeName = linkingHelper.getCrossRefNodeAsString(node, true); 77 var nodeName = linkingHelper.getCrossRefNodeAsString(node, true);
117 if (!condition.test(nodeName)) { 78 if (!NamingUtil.isValidId(nodeName)) {
118 continue; 79 continue;
119 } 80 }
120 var qualifiedName = qualifiedNameConverter.toQualifiedName(nodeName); 81 var qualifiedName = qualifiedNameConverter.toQualifiedName(nodeName);
diff --git a/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemLocationInFileProvider.java b/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemLocationInFileProvider.java
index 94dbdfee..80bbdb0f 100644
--- a/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemLocationInFileProvider.java
+++ b/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemLocationInFileProvider.java
@@ -20,7 +20,7 @@ public class ProblemLocationInFileProvider extends DefaultLocationInFileProvider
20 } 20 }
21 21
22 protected ITextRegion getNodeTextRegion(Node node, RegionDescription query) { 22 protected ITextRegion getNodeTextRegion(Node node, RegionDescription query) {
23 if (ProblemUtil.isEnumLiteral(node)) { 23 if (ProblemUtil.isUniqueNode(node)) {
24 return super.doGetTextRegion(node, query); 24 return super.doGetTextRegion(node, query);
25 } 25 }
26 if (ProblemUtil.isNewNode(node)) { 26 if (ProblemUtil.isNewNode(node)) {
diff --git a/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemResourceDescriptionStrategy.java b/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemResourceDescriptionStrategy.java
index da737e3d..012606d6 100644
--- a/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemResourceDescriptionStrategy.java
+++ b/language/src/main/java/org/eclipse/viatra/solver/language/resource/ProblemResourceDescriptionStrategy.java
@@ -45,6 +45,7 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti
45 while (parent != null && parent != problem) { 45 while (parent != null && parent != problem) {
46 var parentQualifiedName = getNameAsQualifiedName(parent); 46 var parentQualifiedName = getNameAsQualifiedName(parent);
47 if (parentQualifiedName == null) { 47 if (parentQualifiedName == null) {
48 parent = parent.eContainer();
48 continue; 49 continue;
49 } 50 }
50 qualifiedName = parentQualifiedName.append(qualifiedName); 51 qualifiedName = parentQualifiedName.append(qualifiedName);
@@ -82,7 +83,7 @@ public class ProblemResourceDescriptionStrategy extends DefaultResourceDescripti
82 if (eObject instanceof Node) { 83 if (eObject instanceof Node) {
83 var node = (Node) eObject; 84 var node = (Node) eObject;
84 // Only enum literals and new nodes are visible across problem files. 85 // Only enum literals and new nodes are visible across problem files.
85 return ProblemUtil.isEnumLiteral(node) || ProblemUtil.isNewNode(node); 86 return ProblemUtil.isUniqueNode(node) || ProblemUtil.isNewNode(node);
86 } 87 }
87 return true; 88 return true;
88 } 89 }