blob: 2f155668200bcd839d681be1914342a8a118b15d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 Willink Transformations and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* E.D.Willink - initial API and implementation
*******************************************************************************/
grammar org.eclipse.qvtd.xtext.qvtrelation.QVTrelation with org.eclipse.qvtd.xtext.qvtbase.QVTbase
import "http://www.eclipse.org/emf/2002/Ecore" as ecore
import "platform:/resource/org.eclipse.ocl.pivot/model/Pivot.ecore" as pivot
import "platform:/resource/org.eclipse.ocl.xtext.base/model/BaseCS.ecore" as base
import "platform:/resource/org.eclipse.ocl.xtext.essentialocl/model/EssentialOCLCS.ecore" as essentialocl
import "platform:/resource/org.eclipse.qvtd.pivot.qvtbase/model/QVTbase.ecore" as qvtbase
import "platform:/resource/org.eclipse.qvtd.xtext.qvtbase/model/QVTbaseCS.ecore" as qvtbasecs
import "platform:/resource/org.eclipse.qvtd.pivot.qvtrelation/model/QVTrelation.ecore" as qvtrelation
import "platform:/resource/org.eclipse.qvtd.xtext.qvtrelation/model/QVTrelationCS.ecore"
TopLevelCS:
ownedImports+=UnitCS*
(ownedPackages+=QualifiedPackageCS | ownedTransformations+=TransformationCS)*
;
QualifiedPackageCS returns qvtbasecs::QualifiedPackageCS:
'package' ownedPathName=ScopeNameCS? name=UnrestrictedName (':' nsPrefix=UnrestrictedName)? ('=' nsURI=URI)?
(('{'
(/* ownedAnnotations+=AnnotationElementCS | */ ownedPackages+=QualifiedPackageCS | ownedClasses+=(ClassCS | TransformationCS))*
'}')
|';'
)
;
//UnitCS: identifier+=[pivot::Element|UnrestrictedName] ('.' identifier+=[pivot::Element|UnrestrictedName])*;
CollectionTemplateCS: name=UnrestrictedName? ':' ownedType=CollectionTypeCS
('{' (ownedMemberIdentifiers+=(TemplateCS | ElementTemplateCS)
(',' ownedMemberIdentifiers+=(TemplateCS | ElementTemplateCS))*
'++' ownedRestIdentifier=ElementTemplateCS
)? '}')?;
DefaultValueCS: propertyId=[qvtrelation::SharedVariable|UnrestrictedName] '=' ownedInitExpression=ExpCS ';';
DomainCS: (isCheckonly?='checkonly' | isEnforce?='enforce' | 'replace')? 'domain' modelId=[qvtbase::TypedModel|UnrestrictedName]
(ownedPatterns+=DomainPatternCS (',' ownedPatterns+=DomainPatternCS)*)?
('implementedby' implementedBy=UnrestrictedName)?
('default_values' '{' (ownedDefaultValues+=DefaultValueCS)+ '}')?
';';
DomainPatternCS: ownedTemplate=TemplateCS;
ElementTemplateCS: identifier=[qvtrelation::SharedVariable|UnrestrictedName];
KeyDeclCS: 'key' ownedPathName=PathNameCS '{'
(propertyIds+=[pivot::Property|UnrestrictedName]
| ('opposite' '(' ownedOppositePropertyIds+=PathNameCS ')'))
(',' (propertyIds+=[pivot::Property|UnrestrictedName]
| ('opposite' '(' ownedOppositePropertyIds+=PathNameCS ')'))
)* '}' ';'
;
ModelDeclCS: name=UnrestrictedName ':'
(metamodelIds+=[pivot::Namespace|UnrestrictedName]
| '{' metamodelIds+=[pivot::Namespace|UnrestrictedName] (',' metamodelIds+=[pivot::Namespace|UnrestrictedName])* '}')
('dependsOn' (dependsOn+=[qvtbase::TypedModel|UnrestrictedName]
| ('{' (dependsOn+=[qvtbase::TypedModel|UnrestrictedName] (',' dependsOn+=[qvtbase::TypedModel|UnrestrictedName])*)? '}')))?
('iterates' (iterates+=[qvtbase::TypedModel|UnrestrictedName]
| ('{' (iterates+=[qvtbase::TypedModel|UnrestrictedName] (',' iterates+=[qvtbase::TypedModel|UnrestrictedName])*)? '}')))?
;
ObjectTemplateCS: name=UnrestrictedName? ':' ownedType=TypedRefCS
('{' (ownedPropertyTemplates+=PropertyTemplateCS (',' ownedPropertyTemplates+=PropertyTemplateCS)*)? '}')?;
ParamDeclarationCS: name=UnrestrictedName ':' ownedType=TypeExpCS;
PredicateCS: ownedCondition=ExpCS ';';
PrimitiveTypeDomainCS: 'primitive' 'domain' ownedPatterns+=PrimitiveTypeDomainPatternCS (',' ownedPatterns+=PrimitiveTypeDomainPatternCS)* ';';
PrimitiveTypeDomainPatternCS: name=UnrestrictedName ':' ownedType=TypeExpCS;
PropertyTemplateCS: (propertyId=[pivot::Property|UnrestrictedName]
| ('opposite' '(' ownedOppositePropertyId=PathNameCS ')'))
'=' ownedExpression=ExpCSOrTemplateCS;
QueryCS: isTransient?='transient'? 'query' name=UnrestrictedName
'(' (ownedParameters+=ParamDeclarationCS (',' ownedParameters+=ParamDeclarationCS)*)? ')'
':' ownedType=TypeExpCS
(';' | ('{' ownedExpression=ExpCS '}') | ('implementedby' implementation=[qvtbasecs::JavaClassCS|SINGLE_QUOTED_STRING] ';'));
RelationCS: isTop?='top'? isAbstract?='abstract'? 'relation' name=UnrestrictedName
('overrides' overridden=[qvtrelation::Relation|UnrestrictedName])?
'{'
ownedVarDeclarations+=VarDeclarationCS*
(ownedDomains+=DomainCS | ownedDomains+=PrimitiveTypeDomainCS)+
ownedWhen=WhenCS? ownedWhere=WhereCS?
'}'
;
ScopeNameCS returns base::PathNameCS:
ownedPathElements+=FirstPathElementCS '::' (ownedPathElements+=NextPathElementCS '::')*;
TemplateCS: (CollectionTemplateCS | ObjectTemplateCS) ('{' ownedGuardExpression=ExpCS '}')?;
TransformationCS: 'transformation' ownedPathName=ScopeNameCS? name=UnrestrictedName
'(' ownedModelDecls+=ModelDeclCS (',' ownedModelDecls+=ModelDeclCS)* ')'
('extends' extends+=[qvtbase::Transformation|UnrestrictedName] (',' extends+=[qvtbase::Transformation|UnrestrictedName])*)?
'{' ownedTargets+=TargetCS* ownedKeyDecls+=KeyDeclCS* ( ownedRelations+=RelationCS | ownedQueries+=QueryCS | ownedProperties+=StructuralFeatureCS )* '}'
;
UnitCS returns base::ImportCS:
'import' (name=UnrestrictedName ':')? ownedPathName=URIPathNameCS ('::' isAll?='*')? ';';
VarDeclarationCS: ownedVarDeclarationIds+=VarDeclarationIdCS (',' ownedVarDeclarationIds+=VarDeclarationIdCS)* (':' ownedType=TypeExpCS)? ( '=' ownedInitExpression=ExpCS)? ';';
VarDeclarationIdCS: name=UnrestrictedName;
WhenCS returns PatternCS: {PatternCS} 'when' '{' ownedPredicates+=PredicateCS* '}';
WhereCS returns PatternCS: {PatternCS} 'where' '{' ownedPredicates+=PredicateCS* '}';
//<OCLExpressionCS> ::= <PropertyCallExpCS>
// | <VariableExpCS>
// | <LiteralExpCS>
// | <LetExpCS>
// | <IfExpCS>
// | '(' <OCLExpressionCS> ')'
// | <template>
// notNameExpressionCS -> templateCS
ExpCSOrTemplateCS returns essentialocl::ExpCS: ExpCS | TemplateCS;
TypedTypeRefCS returns base::TypedTypeRefCS: ownedPathName=PathNameCS;
TypedRefCS returns base::TypedRefCS:
(PrimitiveTypeCS ownedMultiplicity=MultiplicityCS?)
| (CollectionTypeCS ownedMultiplicity=MultiplicityCS?)
| (TypedTypeRefCS ownedMultiplicity=MultiplicityCS?)
;
//ExpCS returns essentialocl::ExpCS:
// InfixedExpCS
//| TemplateCS;
QVTrelationUnrestrictedName:
'abstract'
| 'checkonly'
| 'default_values'
| 'dependsOn'
| 'domain'
| 'enforce'
| 'extends'
| 'implementedby'
| 'import'
| 'input'
| 'iterates'
| 'library'
| 'key'
| 'opposite'
| 'output'
| 'overrides'
| 'package'
| 'primitive'
| 'query'
| 'relation'
| 'replace'
| 'target'
| 'top'
| 'transformation'
| 'via'
| 'when'
| 'where'
;
/*
| 'callable'
| 'module'
| 'package'
| 'postcondition'
| 'precondition'
| 'reference'
*/
UnrestrictedName returns ecore::EString:
EssentialOCLUnrestrictedName
| QVTbaseUnrestrictedName
| QVTrelationUnrestrictedName
;