diff options
author | Garami Bence <85867500+garamibence@users.noreply.github.com> | 2021-10-12 17:09:32 +0200 |
---|---|---|
committer | Garami Bence <85867500+garamibence@users.noreply.github.com> | 2021-10-20 18:54:11 +0200 |
commit | 97b13eee9a8053afa8fd29ecc8887394040332d3 (patch) | |
tree | c4d37ca2ed70d5f55181f746a3516a0e5a5d4a9d /language | |
parent | Merge pull request #3 from golej-marci/language-to-store (diff) | |
download | refinery-97b13eee9a8053afa8fd29ecc8887394040332d3.tar.gz refinery-97b13eee9a8053afa8fd29ecc8887394040332d3.tar.zst refinery-97b13eee9a8053afa8fd29ecc8887394040332d3.zip |
Add syntax for direct rules and direct predicates
Xtext and Class diagram extended.
Diffstat (limited to 'language')
-rw-r--r-- | language/src/main/java/tools/refinery/language/Problem.xtext | 50 |
1 files changed, 46 insertions, 4 deletions
diff --git a/language/src/main/java/tools/refinery/language/Problem.xtext b/language/src/main/java/tools/refinery/language/Problem.xtext index 6b46ee86..c4c890e3 100644 --- a/language/src/main/java/tools/refinery/language/Problem.xtext +++ b/language/src/main/java/tools/refinery/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 | NodeValueAssertion | ScopeDeclaration | | 11 | ClassDeclaration | EnumDeclaration | PredicateDefinition | RuleDefinition | Assertion | NodeValueAssertion | ScopeDeclaration | |
12 | UniqueDeclaration; | 12 | UniqueDeclaration; |
13 | 13 | ||
14 | ClassDeclaration: | 14 | ClassDeclaration: |
@@ -32,30 +32,72 @@ ReferenceDeclaration: | |||
32 | name=Identifier | 32 | name=Identifier |
33 | ("opposite" opposite=[ReferenceDeclaration|QualifiedName])?; | 33 | ("opposite" opposite=[ReferenceDeclaration|QualifiedName])?; |
34 | 34 | ||
35 | enum PredicateKind: | ||
36 | DIRECT="direct"; | ||
37 | |||
35 | PredicateDefinition: | 38 | PredicateDefinition: |
36 | (error?="error" "pred"? | "pred") | 39 | (error?="error" "pred"? | kind=PredicateKind? "pred") |
37 | name=Identifier | 40 | name=Identifier |
38 | "(" (parameters+=Parameter ("," parameters+=Parameter)*)? ")" | 41 | "(" (parameters+=Parameter ("," parameters+=Parameter)*)? ")" |
39 | ("<->" bodies+=Conjunction (";" bodies+=Conjunction)*)? | 42 | ("<->" bodies+=Conjunction (";" bodies+=Conjunction)*)? |
40 | "."; | 43 | "."; |
41 | 44 | ||
45 | enum RuleKind: | ||
46 | DIRECT="direct"; | ||
47 | |||
48 | RuleDefinition: | ||
49 | kind=RuleKind "rule" | ||
50 | name=Identifier | ||
51 | "(" (parameters+=Parameter ("," parameters+=Parameter)*)? ")" | ||
52 | (":" bodies+=Conjunction (";" bodies+=Conjunction)* | ||
53 | "~>" action=Action)? | ||
54 | "."; | ||
55 | |||
42 | Parameter: | 56 | Parameter: |
43 | parameterType=[Relation|QualifiedName]? name=Identifier; | 57 | parameterType=[Relation|QualifiedName]? name=Identifier; |
44 | 58 | ||
45 | Conjunction: | 59 | Conjunction: |
46 | literals+=Literal ("," literals+=Literal)*; | 60 | literals+=Literal ("," literals+=Literal)*; |
47 | 61 | ||
62 | Action: | ||
63 | actionLiterals+=ActionLiteral ("," actionLiterals+=ActionLiteral)*; | ||
64 | |||
48 | Literal: | 65 | Literal: |
49 | Atom | NegativeLiteral; | 66 | Atom | ValueLiteral | NegativeLiteral; |
67 | |||
68 | ValueLiteral: | ||
69 | atom=Atom | ||
70 | (refinement?=":"|"=") | ||
71 | values+=LogicConstant ("|" values+=LogicConstant)*; | ||
50 | 72 | ||
51 | NegativeLiteral: | 73 | NegativeLiteral: |
52 | "!" atom=Atom; | 74 | "!" atom=Atom; |
53 | 75 | ||
76 | ActionLiteral: | ||
77 | ValueActionLiteral | DeleteActionLiteral | NewActionLiteral; | ||
78 | |||
79 | ValueActionLiteral: | ||
80 | atom=Atom | ||
81 | (refinement?=":"|"=") | ||
82 | value=LogicValue; | ||
83 | |||
84 | DeleteActionLiteral: | ||
85 | "delete" variableOrNode=[VariableOrNode|QualifiedName]; | ||
86 | |||
87 | NewActionLiteral: | ||
88 | "new" variable=NewVariable; | ||
89 | |||
90 | NewVariable: | ||
91 | name=Identifier; | ||
92 | |||
54 | Atom: | 93 | Atom: |
55 | relation=[Relation|QualifiedName] | 94 | relation=[Relation|QualifiedName] |
56 | transitiveClosure?="+"? | 95 | transitiveClosure?="+"? |
57 | "(" (arguments+=Argument ("," arguments+=Argument)*)? ")"; | 96 | "(" (arguments+=Argument ("," arguments+=Argument)*)? ")"; |
58 | 97 | ||
98 | LogicConstant: | ||
99 | value=LogicValue; | ||
100 | |||
59 | Argument: | 101 | Argument: |
60 | VariableOrNodeArgument | ConstantArgument; | 102 | VariableOrNodeArgument | ConstantArgument; |
61 | 103 | ||
@@ -142,7 +184,7 @@ QualifiedName hidden(): | |||
142 | 184 | ||
143 | Identifier: | 185 | Identifier: |
144 | ID | "true" | "false" | "unknown" | "error" | "class" | "abstract" | "extends" | "enum" | "pred" | "scope" | | 186 | ID | "true" | "false" | "unknown" | "error" | "class" | "abstract" | "extends" | "enum" | "pred" | "scope" | |
145 | "unique" | "default" | "problem" | "contains" | "refers"; | 187 | "unique" | "default" | "problem" | "contains" | "refers" | "new" | "delete"; |
146 | 188 | ||
147 | Integer returns ecore::EInt hidden(): | 189 | Integer returns ecore::EInt hidden(): |
148 | "-"? INT; | 190 | "-"? INT; |