blob: acc2a520018b543cacbac7b908c77e3848770f53 [file] [log] [blame]
grammar org.eclipse.qvtd.doc.MiniOCLCS with org.eclipse.xtext.common.Terminals
generate minioclcs "http://www.eclipse.org/qvtd/doc/MiniOCLCS"
RootCS:
imports+=ImportCS*
(packages+=PackageCS
| constraints+=ConstraintsDefCS)*
;
ImportCS:
'import' (alias=ID ':') uri=STRING ';'
;
PackageCS:
'package' name=ID '{'
(packages+=PackageCS
//|classifiers+=ClassifierCS
| classes+=ClassCS
)*
'}'
;
//ClassifierCS:
// ClassCS | DatatypeCS
//;
ClassCS:
'class' name=ID ('extends' extends=PathNameCS)? '{'
( properties+=PropertyCS
| operations+=OperationCS )*
'}'
;
//DatatypeCS:
// 'datatype' name=ID ':' typeName=STRING ';'
//;
PropertyCS:
//('attribute' | 'containment' | 'cross_reference')
'prop'
name=ID ':' typeRef=PathNameCS
(multiplicity=MultiplicityCS)? ';'
;
MultiplicityCS:
'['
(opt?='?' | mult?='*' | mandatory=INT | (lowerInt=INT '..' (upperInt=INT | upperMult?='*')))
']'
;
OperationCS:
'op' name=ID
'(' (params+=ParameterCS (','params+=ParameterCS)*)? ')'
':' resultRef=PathNameCS
'=' body=ExpCS
';'
;
ParameterCS:
name=ID ':' typeRef=PathNameCS
;
ConstraintsDefCS:
'context' typeRef=PathNameCS '{'
(invariants+=InvariantCS)*
'}'
;
InvariantCS:
'inv' ':' exp=ExpCS ';'
;
// Expressions
ExpCS:
EqualityExpCS
;
EqualityExpCS:
CallExpCS ({EqualityExpCS.left=current} opName=('=' | '<>') right=CallExpCS)*
;
CallExpCS:
PrimaryExpCS ({CallExpCS.source=current} opName=('.' | '->') navExp=NavigationExpCS)*
;
PrimaryExpCS:
SelfExpCS | NameExpCS | LiteralExpCS | LetExpCS
;
SelfExpCS:
{SelfExpCS} 'self'
;
NavigationExpCS:
LoopExpCS | NameExpCS
;
LoopExpCS:
CollectExpCS | IterateExpCS
;
CollectExpCS:
'collect' '(' (itVar=IteratorVarCS '|')? exp=ExpCS')'
;
IteratorVarCS:
itName = ID (':' itType=PathNameCS)?
;
IterateExpCS:
'iterate' '(' itVar=IteratorVarCS ';' accVar=AccVarCS '|' exp=ExpCS ')'
;
AccVarCS:
accName = ID (':' accType=PathNameCS)? '=' accInitExp=ExpCS
;
NameExpCS:
expName=PathNameCS
(roundedBrackets=RoundedBracketClauseCS)?
;
RoundedBracketClauseCS:
{RoundedBracketClauseCS}
'('
(args+=ExpCS (','args+=ExpCS)* )?
')'
;
LiteralExpCS:
IntLiteralExpCS | BooleanLiteralExpCS | NullLiteralExpCS | CollectionLiteralExpCS
;
IntLiteralExpCS :
intSymbol=INT
;
BooleanLiteralExpCS:
{BooleanExpCS}
(boolSymbol?='true'
| 'false')
;
NullLiteralExpCS:
{NullLiteralExpCS}
'null'
;
enum CollectionKindCS:
Collection='Collection'
;
CollectionLiteralExpCS:
kind=CollectionKindCS '{'
(parts+=CollectionLiteralPartCS)*
'}'
;
CollectionLiteralPartCS:
first=ExpCS
('..' last=ExpCS)?
;
LetExpCS:
'let' letVars+=LetVarCS (',' letVars+=LetVarCS)*
'in' inExp=ExpCS
;
LetVarCS:
name=ID (':' typeRef=PathNameCS)? '=' initExp=ExpCS
;
PathNameCS :
pathElements+=PathElementCS
('::'pathElements+=PathElementCS)*
;
PathElementCS:
elementName=ID
;