Difference between revisions of "M2M/ATL/Syntax"

From Eclipsepedia

< M2M‎ | ATL
Jump to: navigation, search
(created a page for the ATL syntax)
 
m
Line 1: Line 1:
 
This page presents the [[ATL]] textual syntax.
 
This page presents the [[ATL]] textual syntax.
  
The authoritative ATL syntax is its specification in [[TCS]]: [http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.m2m/org.eclipse.m2m.atl/dsls/ATL/Syntax/ATL.tcs?root=Modeling_Project&view=markup ATL.tcs]. The following EBNF grammar has been automatically generated from this specification:
+
The authoritative ATL syntax is its specification in [[TCS]]: [http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.m2m/org.eclipse.m2m.atl/dsls/ATL/Syntax/ATL.tcs?root=Modeling_Project&view=markup ATL.tcs]. The following EBNF grammar has been automatically generated from this specification and manually beautified:
  
unit ::= module | library | query;
+
unit ::= module | library | query;
+
 
module ::= 'module' IDENTIFIER ';' 'create' oclModel (',' oclModel)* ('refining' | 'from') oclModel (',' oclModel)* ';' (libraryRef libraryRef*)? (moduleElement moduleElement*)?;
+
module ::= 'module' IDENTIFIER ';' 'create' oclModel (',' oclModel)* ('refining' | 'from') oclModel (',' oclModel)* ';' libraryRef* moduleElement*;
+
 
library ::= 'library' IDENTIFIER ';' (libraryRef libraryRef*)? (helper helper*)?;
+
library ::= 'library' IDENTIFIER ';' libraryRef* helper*;
+
 
query ::= 'query' IDENTIFIER '=' oclExpression ';' (libraryRef libraryRef*)? (helper helper*)?;
+
query ::= 'query' IDENTIFIER '=' oclExpression ';' libraryRef* helper*;
+
 
libraryRef ::= 'uses' IDENTIFIER ';';
+
libraryRef ::= 'uses' IDENTIFIER ';';
+
 
moduleElement ::= helper | rule;
+
moduleElement ::= helper | rule;
+
 
helper ::= 'helper' oclFeatureDefinition ';';
+
helper ::= 'helper' oclFeatureDefinition ';';
+
 
oclFeatureDefinition ::= oclContextDefinition? 'def' ':' oclFeature;
+
oclFeatureDefinition ::= oclContextDefinition? 'def' ':' oclFeature;
+
 
oclContextDefinition ::= 'context' oclType;
+
oclContextDefinition ::= 'context' oclType;
+
 
oclFeature ::= operation | attribute;
+
oclFeature ::= operation | attribute;
+
 
operation ::= IDENTIFIER '(' (parameter (',' parameter)*)? ')' ':' oclType '=' oclExpression;
+
operation ::= IDENTIFIER '(' (parameter (',' parameter)*)? ')' ':' oclType '=' oclExpression;
+
 
parameter ::= IDENTIFIER ':' oclType;
+
parameter ::= IDENTIFIER ':' oclType;
+
 
attribute ::= IDENTIFIER ':' oclType '=' oclExpression;
+
attribute ::= IDENTIFIER ':' oclType '=' oclExpression;
+
 
rule ::= calledRule | matchedRule;
+
rule ::= calledRule | matchedRule;
+
 
matchedRule ::= lazyMatchedRule | matchedRule_abstractContents;
+
matchedRule ::= lazyMatchedRule | matchedRule_abstractContents;
+
 
lazyMatchedRule ::= 'unique'? 'lazy' 'abstract'? 'refining'? 'rule' IDENTIFIER ('extends' IDENTIFIER)? '{' inPattern ('using' '{' (ruleVariableDeclaration ruleVariableDeclaration*)? '}')? outPattern? actionBlock? '}';
+
lazyMatchedRule ::= 'unique'? 'lazy' 'abstract'? 'refining'? 'rule' IDENTIFIER ('extends' IDENTIFIER)? '{' inPattern ('using' '{' ruleVariableDeclaration* '}')? outPattern? actionBlock? '}';
+
 
ruleVariableDeclaration ::= IDENTIFIER ':' oclType '=' oclExpression ';';
+
ruleVariableDeclaration ::= IDENTIFIER ':' oclType '=' oclExpression ';';
+
 
calledRule ::= 'entrypoint'? 'endpoint'? 'rule' IDENTIFIER '(' (parameter (',' parameter)*)? ')' '{' ('using' '{' (ruleVariableDeclaration ruleVariableDeclaration*)? '}')? outPattern? actionBlock? '}';
+
calledRule ::= 'entrypoint'? 'endpoint'? 'rule' IDENTIFIER '(' (parameter (',' parameter)*)? ')' '{' ('using' '{' ruleVariableDeclaration* '}')? outPattern? actionBlock? '}';
+
 
inPattern ::= 'from' inPatternElement (',' inPatternElement)* ('(' oclExpression ')')?;
+
inPattern ::= 'from' inPatternElement (',' inPatternElement)* ('(' oclExpression ')')?;
+
 
inPatternElement ::= simpleInPatternElement;
+
inPatternElement ::= simpleInPatternElement;
+
 
simpleInPatternElement ::= IDENTIFIER ':' oclType ('in' (IDENTIFIER (',' IDENTIFIER)*)?)?;
+
simpleInPatternElement ::= IDENTIFIER ':' oclType ('in' IDENTIFIER (',' IDENTIFIER)*)?;
+
 
outPattern ::= 'to' outPatternElement (',' outPatternElement)*;
+
outPattern ::= 'to' outPatternElement (',' outPatternElement)*;
+
 
outPatternElement ::= simpleOutPatternElement | forEachOutPatternElement;
+
outPatternElement ::= simpleOutPatternElement | forEachOutPatternElement;
+
 
simpleOutPatternElement ::= IDENTIFIER ':' oclType ('in' IDENTIFIER)? ('mapsTo' IDENTIFIER)? ('(' (binding (',' binding)*)? ')')?;
+
simpleOutPatternElement ::= IDENTIFIER ':' oclType ('in' IDENTIFIER)? ('mapsTo' IDENTIFIER)? ('(' (binding (',' binding)*)? ')')?;
+
 
forEachOutPatternElement ::= IDENTIFIER ':' 'distinct' oclType 'foreach' '(' iterator 'in' oclExpression ')' ('mapsTo' IDENTIFIER)? ('(' (binding (',' binding)*)? ')')?;
+
forEachOutPatternElement ::= IDENTIFIER ':' 'distinct' oclType 'foreach' '(' iterator 'in' oclExpression ')' ('mapsTo' IDENTIFIER)? ('(' (binding (',' binding)*)? ')')?;
+
 
binding ::= IDENTIFIER '<-' oclExpression;
+
binding ::= IDENTIFIER '<-' oclExpression;
+
 
actionBlock ::= 'do' '{' (statement statement*)? '}';
+
actionBlock ::= 'do' '{' statement* '}';
+
 
statement ::= ifStat | expressionStat | bindingStat | forStat;
+
statement ::= ifStat | expressionStat | bindingStat | forStat;
+
 
bindingStat ::= oclExpression '<-' oclExpression ';';
+
bindingStat ::= oclExpression '<-' oclExpression ';';
+
 
expressionStat ::= oclExpression ';';
+
expressionStat ::= oclExpression ';';
+
 
ifStat ::= 'if' '(' oclExpression ')' (statement | '{' (statement statement*)? '}') ('else' (statement | '{' (statement statement*)? '}'))?;
+
ifStat ::= 'if' '(' oclExpression ')' (statement | '{' statement* '}') ('else' (statement | '{' statement* '}'))?;
+
 
forStat ::= 'for' '(' iterator 'in' oclExpression ')' '{' (statement statement*)? '}';
+
forStat ::= 'for' '(' iterator 'in' oclExpression ')' '{' statement* '}';
+
 
oclModel ::= IDENTIFIER ':' IDENTIFIER;
+
oclModel ::= IDENTIFIER ':' IDENTIFIER;
+
 
oclModelElement ::= IDENTIFIER '!' IDENTIFIER;
+
oclModelElement ::= IDENTIFIER '!' IDENTIFIER;
+
 
oclExpression ::= priority_5 | letExp;
+
oclExpression ::= priority_5 | letExp;
+
 
iteratorExp ::= IDENTIFIER '(' iterator (',' iterator)* '|' oclExpression ')';
+
iteratorExp ::= IDENTIFIER '(' iterator (',' iterator)* '|' oclExpression ')';
+
 
iterateExp ::= 'iterate' '(' iterator (',' iterator)* ';' variableDeclaration '|' oclExpression ')';
+
iterateExp ::= 'iterate' '(' iterator (',' iterator)* ';' variableDeclaration '|' oclExpression ')';
+
 
collectionOperationCallExp ::= IDENTIFIER '(' (oclExpression (',' oclExpression)*)? ')';
+
collectionOperationCallExp ::= IDENTIFIER '(' (oclExpression (',' oclExpression)*)? ')';
+
 
operationCallExp ::= IDENTIFIER '(' (oclExpression (',' oclExpression)*)? ')';
+
operationCallExp ::= IDENTIFIER '(' (oclExpression (',' oclExpression)*)? ')';
+
 
navigationOrAttributeCallExp ::= IDENTIFIER;
+
navigationOrAttributeCallExp ::= IDENTIFIER;
+
 
iterator ::= IDENTIFIER;
+
iterator ::= IDENTIFIER;
+
 
oclUndefinedExp ::= 'OclUndefined';
+
oclUndefinedExp ::= 'OclUndefined';
+
 
primitiveExp ::= numericExp | booleanExp | stringExp;
+
primitiveExp ::= numericExp | booleanExp | stringExp;
+
 
numericExp ::= integerExp | realExp;
+
numericExp ::= integerExp | realExp;
+
 
booleanExp ::= 'true' | 'false';
+
booleanExp ::= 'true' | 'false';
+
 
integerExp ::= INTEGER;
+
integerExp ::= INTEGER;
+
 
realExp ::= FLOAT;
+
realExp ::= FLOAT;
+
 
stringExp ::= STRING;
+
stringExp ::= STRING;
+
 
ifExp ::= 'if' oclExpression 'then' oclExpression 'else' oclExpression 'endif';
+
ifExp ::= 'if' oclExpression 'then' oclExpression 'else' oclExpression 'endif';
+
 
variableExp ::= IDENTIFIER;
+
variableExp ::= IDENTIFIER;
+
 
superExp ::= 'super';
+
superExp ::= 'super';
+
 
letExp ::= 'let' variableDeclaration 'in' oclExpression;
+
letExp ::= 'let' variableDeclaration 'in' oclExpression;
+
 
variableDeclaration ::= IDENTIFIER ':' oclType '=' oclExpression;
+
variableDeclaration ::= IDENTIFIER ':' oclType '=' oclExpression;
+
 
enumLiteralExp ::= '#' IDENTIFIER;
+
enumLiteralExp ::= '#' IDENTIFIER;
+
 
collectionExp ::= bagExp | setExp | orderedSetExp | sequenceExp;
+
collectionExp ::= bagExp | setExp | orderedSetExp | sequenceExp;
+
 
bagExp ::= 'Bag' '{' (oclExpression (',' oclExpression)*)? '}';
+
bagExp ::= 'Bag' '{' (oclExpression (',' oclExpression)*)? '}';
+
 
setExp ::= 'Set' '{' (oclExpression (',' oclExpression)*)? '}';
+
setExp ::= 'Set' '{' (oclExpression (',' oclExpression)*)? '}';
+
 
orderedSetExp ::= 'OrderedSet' '{' (oclExpression (',' oclExpression)*)? '}';
+
orderedSetExp ::= 'OrderedSet' '{' (oclExpression (',' oclExpression)*)? '}';
+
 
sequenceExp ::= 'Sequence' '{' (oclExpression (',' oclExpression)*)? '}';
+
sequenceExp ::= 'Sequence' '{' (oclExpression (',' oclExpression)*)? '}';
+
 
mapExp ::= 'Map' '{' (mapElement (',' mapElement)*)? '}';
+
mapExp ::= 'Map' '{' (mapElement (',' mapElement)*)? '}';
+
 
mapElement ::= '(' oclExpression ',' oclExpression ')';
+
mapElement ::= '(' oclExpression ',' oclExpression ')';
+
 
tupleExp ::= 'Tuple' '{' (tuplePart (',' tuplePart)*)? '}';
+
tupleExp ::= 'Tuple' '{' (tuplePart (',' tuplePart)*)? '}';
+
 
tuplePart ::= IDENTIFIER (':' oclType)? '=' oclExpression;
+
tuplePart ::= IDENTIFIER (':' oclType)? '=' oclExpression;
+
 
oclType ::= oclModelElement | oclAnyType | tupleType | mapType | primitive | collectionType | oclType_abstractContents;
+
oclType ::= oclModelElement | oclAnyType | tupleType | mapType | primitive | collectionType | oclType_abstractContents;
+
 
oclAnyType ::= oclAnyType_abstractContents;
+
oclAnyType ::= oclAnyType_abstractContents;
+
 
tupleType ::= 'TupleType' '(' (tupleTypeAttribute (',' tupleTypeAttribute)*)? ')';
+
tupleType ::= 'TupleType' '(' (tupleTypeAttribute (',' tupleTypeAttribute)*)? ')';
+
 
tupleTypeAttribute ::= IDENTIFIER ':' oclType;
+
tupleTypeAttribute ::= IDENTIFIER ':' oclType;
+
 
mapType ::= 'Map' '(' oclType ',' oclType ')';
+
mapType ::= 'Map' '(' oclType ',' oclType ')';
+
 
primitive ::= numericType | booleanType | stringType;
+
primitive ::= numericType | booleanType | stringType;
+
 
numericType ::= integerType | realType;
+
numericType ::= integerType | realType;
+
 
integerType ::= 'Integer';
+
integerType ::= 'Integer';
+
 
realType ::= 'Real';
+
realType ::= 'Real';
+
 
booleanType ::= 'Boolean';
+
booleanType ::= 'Boolean';
+
 
stringType ::= 'String';
+
stringType ::= 'String';
+
 
collectionType ::= bagType | setType | orderedSetType | sequenceType | collectionType_abstractContents;
+
collectionType ::= bagType | setType | orderedSetType | sequenceType | collectionType_abstractContents;
+
 
bagType ::= 'Bag' '(' oclType ')';
+
bagType ::= 'Bag' '(' oclType ')';
+
 
setType ::= 'Set' '(' oclType ')';
+
setType ::= 'Set' '(' oclType ')';
+
 
orderedSetType ::= 'OrderedSet' '(' oclType ')';
+
orderedSetType ::= 'OrderedSet' '(' oclType ')';
+
 
sequenceType ::= 'Sequence' '(' oclType ')';
+
sequenceType ::= 'Sequence' '(' oclType ')';
+
 
priority_0 ::= primary_oclExpression ('.' (operationCallExp | navigationOrAttributeCallExp) | '->' (iteratorExp | iterateExp | collectionOperationCallExp))*;
+
priority_0 ::= primary_oclExpression ('.' (operationCallExp | navigationOrAttributeCallExp) | '->' (iteratorExp | iterateExp | collectionOperationCallExp))*;
+
 
priority_1 ::= 'not' priority_0 | '-' priority_0 | priority_0;
+
priority_1 ::= 'not' priority_0 | '-' priority_0 | priority_0;
+
 
priority_2 ::= priority_1 ('*' priority_1 | '/' priority_1 | 'div' priority_1 | 'mod' priority_1)*;
+
priority_2 ::= priority_1 ('*' priority_1 | '/' priority_1 | 'div' priority_1 | 'mod' priority_1)*;
+
 
priority_3 ::= priority_2 ('+' priority_2 | '-' priority_2)*;
+
priority_3 ::= priority_2 ('+' priority_2 | '-' priority_2)*;
+
 
priority_4 ::= priority_3 ('=' priority_3 | '>' priority_3 | '<' priority_3 | '>=' priority_3 | '<=' priority_3 | '<>' priority_3)*;
+
priority_4 ::= priority_3 ('=' priority_3 | '>' priority_3 | '<' priority_3 | '>=' priority_3 | '<=' priority_3 | '<>' priority_3)*;
+
 
priority_5 ::= priority_4 ('and' priority_4 | 'or' priority_4 | 'xor' priority_4 | 'implies' priority_4)*;
+
priority_5 ::= priority_4 ('and' priority_4 | 'or' priority_4 | 'xor' priority_4 | 'implies' priority_4)*;
+
 
matchedRule_abstractContents ::= 'nodefault'? 'abstract'? 'refining'? 'rule' IDENTIFIER ('extends' IDENTIFIER)? '{' inPattern ('using' '{' (ruleVariableDeclaration ruleVariableDeclaration*)? '}')? outPattern? actionBlock? '}';
+
matchedRule_abstractContents ::= 'nodefault'? 'abstract'? 'refining'? 'rule' IDENTIFIER ('extends' IDENTIFIER)? '{' inPattern ('using' '{' ruleVariableDeclaration* '}')? outPattern? actionBlock? '}';
+
 
oclType_abstractContents ::= 'OclType';
+
oclType_abstractContents ::= 'OclType';
+
 
oclAnyType_abstractContents ::= 'OclAny';
+
oclAnyType_abstractContents ::= 'OclAny';
+
 
collectionType_abstractContents ::= 'Collection' '(' oclType ')';
+
collectionType_abstractContents ::= 'Collection' '(' oclType ')';
+
 
primary_oclExpression ::= variableExp | oclUndefinedExp | primitiveExp | ifExp | superExp | enumLiteralExp | collectionExp | mapExp | tupleExp | oclType | '(' oclExpression ')';
+
primary_oclExpression ::= variableExp | oclUndefinedExp | primitiveExp | ifExp | superExp | enumLiteralExp | collectionExp | mapExp | tupleExp | oclType | '(' oclExpression ')';

Revision as of 09:05, 14 October 2010

This page presents the ATL textual syntax.

The authoritative ATL syntax is its specification in TCS: ATL.tcs. The following EBNF grammar has been automatically generated from this specification and manually beautified:

unit ::= module | library | query;

module ::= 'module' IDENTIFIER ';' 'create' oclModel (',' oclModel)* ('refining' | 'from') oclModel (',' oclModel)* ';' libraryRef* moduleElement*;

library ::= 'library' IDENTIFIER ';' libraryRef* helper*;

query ::= 'query' IDENTIFIER '=' oclExpression ';' libraryRef* helper*;

libraryRef ::= 'uses' IDENTIFIER ';';

moduleElement ::= helper | rule;

helper ::= 'helper' oclFeatureDefinition ';';

oclFeatureDefinition ::= oclContextDefinition? 'def' ':' oclFeature;

oclContextDefinition ::= 'context' oclType;

oclFeature ::= operation | attribute;

operation ::= IDENTIFIER '(' (parameter (',' parameter)*)? ')' ':' oclType '=' oclExpression;

parameter ::= IDENTIFIER ':' oclType;

attribute ::= IDENTIFIER ':' oclType '=' oclExpression;

rule ::= calledRule | matchedRule;

matchedRule ::= lazyMatchedRule | matchedRule_abstractContents;

lazyMatchedRule ::= 'unique'? 'lazy' 'abstract'? 'refining'? 'rule' IDENTIFIER ('extends' IDENTIFIER)? '{' inPattern ('using' '{' ruleVariableDeclaration* '}')? outPattern? actionBlock? '}';

ruleVariableDeclaration ::= IDENTIFIER ':' oclType '=' oclExpression ';';

calledRule ::= 'entrypoint'? 'endpoint'? 'rule' IDENTIFIER '(' (parameter (',' parameter)*)? ')' '{' ('using' '{' ruleVariableDeclaration* '}')? outPattern? actionBlock? '}';

inPattern ::= 'from' inPatternElement (',' inPatternElement)* ('(' oclExpression ')')?;

inPatternElement ::= simpleInPatternElement;

simpleInPatternElement ::= IDENTIFIER ':' oclType ('in' IDENTIFIER (',' IDENTIFIER)*)?;

outPattern ::= 'to' outPatternElement (',' outPatternElement)*;

outPatternElement ::= simpleOutPatternElement | forEachOutPatternElement;

simpleOutPatternElement ::= IDENTIFIER ':' oclType ('in' IDENTIFIER)? ('mapsTo' IDENTIFIER)? ('(' (binding (',' binding)*)? ')')?;

forEachOutPatternElement ::= IDENTIFIER ':' 'distinct' oclType 'foreach' '(' iterator 'in' oclExpression ')' ('mapsTo' IDENTIFIER)? ('(' (binding (',' binding)*)? ')')?;

binding ::= IDENTIFIER '<-' oclExpression;

actionBlock ::= 'do' '{' statement* '}';

statement ::= ifStat | expressionStat | bindingStat | forStat;

bindingStat ::= oclExpression '<-' oclExpression ';';

expressionStat ::= oclExpression ';';

ifStat ::= 'if' '(' oclExpression ')' (statement | '{' statement* '}') ('else' (statement | '{' statement* '}'))?;

forStat ::= 'for' '(' iterator 'in' oclExpression ')' '{' statement* '}';

oclModel ::= IDENTIFIER ':' IDENTIFIER;

oclModelElement ::= IDENTIFIER '!' IDENTIFIER;

oclExpression ::= priority_5 | letExp;

iteratorExp ::= IDENTIFIER '(' iterator (',' iterator)* '|' oclExpression ')';

iterateExp ::= 'iterate' '(' iterator (',' iterator)* ';' variableDeclaration '|' oclExpression ')';

collectionOperationCallExp ::= IDENTIFIER '(' (oclExpression (',' oclExpression)*)? ')';

operationCallExp ::= IDENTIFIER '(' (oclExpression (',' oclExpression)*)? ')';

navigationOrAttributeCallExp ::= IDENTIFIER;

iterator ::= IDENTIFIER;

oclUndefinedExp ::= 'OclUndefined';

primitiveExp ::= numericExp | booleanExp | stringExp;

numericExp ::= integerExp | realExp;

booleanExp ::= 'true' | 'false';

integerExp ::= INTEGER;

realExp ::= FLOAT;

stringExp ::= STRING;

ifExp ::= 'if' oclExpression 'then' oclExpression 'else' oclExpression 'endif';

variableExp ::= IDENTIFIER;

superExp ::= 'super';

letExp ::= 'let' variableDeclaration 'in' oclExpression;

variableDeclaration ::= IDENTIFIER ':' oclType '=' oclExpression;

enumLiteralExp ::= '#' IDENTIFIER;

collectionExp ::= bagExp | setExp | orderedSetExp | sequenceExp;

bagExp ::= 'Bag' '{' (oclExpression (',' oclExpression)*)? '}';

setExp ::= 'Set' '{' (oclExpression (',' oclExpression)*)? '}';

orderedSetExp ::= 'OrderedSet' '{' (oclExpression (',' oclExpression)*)? '}';

sequenceExp ::= 'Sequence' '{' (oclExpression (',' oclExpression)*)? '}';

mapExp ::= 'Map' '{' (mapElement (',' mapElement)*)? '}';

mapElement ::= '(' oclExpression ',' oclExpression ')';

tupleExp ::= 'Tuple' '{' (tuplePart (',' tuplePart)*)? '}';

tuplePart ::= IDENTIFIER (':' oclType)? '=' oclExpression;

oclType ::= oclModelElement | oclAnyType | tupleType | mapType | primitive | collectionType | oclType_abstractContents;

oclAnyType ::= oclAnyType_abstractContents;

tupleType ::= 'TupleType' '(' (tupleTypeAttribute (',' tupleTypeAttribute)*)? ')';

tupleTypeAttribute ::= IDENTIFIER ':' oclType;

mapType ::= 'Map' '(' oclType ',' oclType ')';

primitive ::= numericType | booleanType | stringType;

numericType ::= integerType | realType;

integerType ::= 'Integer';

realType ::= 'Real';

booleanType ::= 'Boolean';

stringType ::= 'String';

collectionType ::= bagType | setType | orderedSetType | sequenceType | collectionType_abstractContents;

bagType ::= 'Bag' '(' oclType ')';

setType ::= 'Set' '(' oclType ')';

orderedSetType ::= 'OrderedSet' '(' oclType ')';

sequenceType ::= 'Sequence' '(' oclType ')';

priority_0 ::= primary_oclExpression ('.' (operationCallExp | navigationOrAttributeCallExp) | '->' (iteratorExp | iterateExp | collectionOperationCallExp))*;

priority_1 ::= 'not' priority_0 | '-' priority_0 | priority_0;

priority_2 ::= priority_1 ('*' priority_1 | '/' priority_1 | 'div' priority_1 | 'mod' priority_1)*;

priority_3 ::= priority_2 ('+' priority_2 | '-' priority_2)*;

priority_4 ::= priority_3 ('=' priority_3 | '>' priority_3 | '<' priority_3 | '>=' priority_3 | '<=' priority_3 | '<>' priority_3)*;

priority_5 ::= priority_4 ('and' priority_4 | 'or' priority_4 | 'xor' priority_4 | 'implies' priority_4)*;

matchedRule_abstractContents ::= 'nodefault'? 'abstract'? 'refining'? 'rule' IDENTIFIER ('extends' IDENTIFIER)? '{' inPattern ('using' '{' ruleVariableDeclaration* '}')? outPattern? actionBlock? '}';

oclType_abstractContents ::= 'OclType';

oclAnyType_abstractContents ::= 'OclAny';

collectionType_abstractContents ::= 'Collection' '(' oclType ')';

primary_oclExpression ::= variableExp | oclUndefinedExp | primitiveExp | ifExp | superExp | enumLiteralExp | collectionExp | mapExp | tupleExp | oclType | '(' oclExpression ')';