blob: 8903f6daee179b5624928af0c544ef206955f85a [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.qvtbase.QVTbase with org.eclipse.ocl.xtext.essentialocl.EssentialOCL
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"
AttributeCS returns base::AttributeCS:
((qualifiers+='static' (qualifiers+='definition')?) | (qualifiers+='definition' (qualifiers+='static')?))?
'attribute' name=UnrestrictedName
(':' ownedType=TypedMultiplicityRefCS)?
('=' default=SINGLE_QUOTED_STRING)?
('{'((qualifiers+='derived' | qualifiers+='!derived' |
qualifiers+='id' | qualifiers+='!id' |
qualifiers+='ordered' | qualifiers+='!ordered' |
qualifiers+='readonly' | qualifiers+='!readonly' |
qualifiers+='transient' | qualifiers+='!transient' |
qualifiers+='unique' | qualifiers+='!unique' |
qualifiers+='unsettable' | qualifiers+='!unsettable' |
qualifiers+='volatile' | qualifiers+='!volatile'
) ','? )+
'}')?
( ('{' (/*ownedAnnotations+=AnnotationElementCS
|*/ ('initial' UnrestrictedName? ':' ownedDefaultExpressions+=SpecificationCS? ';')
| ('derivation' UnrestrictedName? ':' ownedDefaultExpressions+=SpecificationCS? ';') )* '}')
| ';'
)
;
ClassCS returns base::ClassCS:
StructuredClassCS | DataTypeCS | EnumerationCS
;
CompoundTargetElementCS: '{' ownedTargetElements+=SimpleTargetElementCS* '}' ';'? ;
DataTypeCS returns base::DataTypeCS:
isPrimitive ?= 'primitive'? 'datatype' name=UnrestrictedName
(ownedSignature=TemplateSignatureCS)?
(':' instanceClassName=SINGLE_QUOTED_STRING)?
('{' (isSerializable?='serializable' | '!serializable')? '}')?
( ('{' /*(ownedAnnotations+=AnnotationElementCS
| ownedConstraints+=InvariantConstraintCS)* */ '}')
| ';'
)
;
EnumerationCS returns base::EnumerationCS:
'enum' name=UnrestrictedName
(ownedSignature=TemplateSignatureCS)?
(':' instanceClassName=SINGLE_QUOTED_STRING)?
('{' (isSerializable?='serializable' | '!serializable')? '}')?
( ('{' (/*ownedAnnotations+=AnnotationElementCS
|*/ ownedLiterals+=EnumerationLiteralCS
/*| ownedConstraints+=InvariantConstraintCS*/)* '}')
| ';'
)
;
EnumerationLiteralCS returns base::EnumerationLiteralCS:
(('literal' name=UnrestrictedName) | name=EnumerationLiteralName) ('=' value=SIGNED)?
(('{' /*ownedAnnotations+=AnnotationElementCS* */ '}')
|';'
)
;
OperationCS returns base::OperationCS:
((qualifiers+='static' (qualifiers+='definition')?) | (qualifiers+='definition' (qualifiers+='static')?))?
'operation' (ownedSignature=TemplateSignatureCS)? name=UnrestrictedName
'(' (ownedParameters+=ParameterCS (',' ownedParameters+=ParameterCS)*)? ')'
(':' ownedType=TypedMultiplicityRefCS)?
('throws' ownedExceptions+=TypedRefCS (',' ownedExceptions+=TypedRefCS)*)?
('{'((qualifiers+='derived' | qualifiers+='!derived' |
qualifiers+='ordered' | qualifiers+='!ordered' |
qualifiers+='unique' | qualifiers+='!unique'
) ','? )+
'}')?
( ('{' (/*ownedAnnotations+=AnnotationElementCS
| ownedPreconditions+=PreconditionConstraintCS
|*/ ('body' UnrestrictedName? ':' ownedBodyExpressions+=SpecificationCS? ';')
/*| ownedPostconditions+=PostconditionConstraintCS */ )* '}')
| ';'
)
;
ParameterCS returns base::ParameterCS:
name=UnrestrictedName
(':' ownedType=TypedMultiplicityRefCS)?
('{'(( qualifiers+='ordered' | qualifiers+='!ordered' |
qualifiers+='unique' | qualifiers+='!unique'
) ','?)+
'}')?
('{' /*ownedAnnotations+=AnnotationElementCS* */ '}')?
;
ReferenceCS returns base::ReferenceCS:
((qualifiers+='static' (qualifiers+='definition')?) | (qualifiers+='definition' (qualifiers+='static')?))?
'property' name=UnrestrictedName
('#' referredOpposite=[pivot::Property|UnrestrictedName])?
(':' ownedType=TypedMultiplicityRefCS)?
('=' default=SINGLE_QUOTED_STRING)?
('{'((qualifiers+='composes' | qualifiers+='!composes' |
qualifiers+='derived' | qualifiers+='!derived' |
qualifiers+='ordered' | qualifiers+='!ordered' |
qualifiers+='readonly' | qualifiers+='!readonly' |
qualifiers+='resolve' | qualifiers+='!resolve' |
qualifiers+='transient' | qualifiers+='!transient' |
qualifiers+='unique' | qualifiers+='!unique' |
qualifiers+='unsettable' | qualifiers+='!unsettable' |
qualifiers+='volatile' | qualifiers+='!volatile'
) ','? )+
'}')?
( ('{' (/*ownedAnnotations+=AnnotationElementCS
| ('key' referredKeys+=[pivot::Property|UnrestrictedName] (',' referredKeys+=[pivot::Property|UnrestrictedName])* ';')
|*/ ('initial' UnrestrictedName? ':' ownedDefaultExpressions+=SpecificationCS? ';')
| ('derivation' UnrestrictedName? ':' ownedDefaultExpressions+=SpecificationCS? ';') )* '}')
| ';'
)
;
SimpleTargetElementCS: (input?='input'|output?='output'|via?='via') typedModel=[qvtbase::TypedModel|UnrestrictedName]
('iterates' (iterates+=[qvtbase::TypedModel|UnrestrictedName]
| ('{' (iterates+=[qvtbase::TypedModel|UnrestrictedName] (',' iterates+=[qvtbase::TypedModel|UnrestrictedName])*)? '}')))?
';';
SpecificationCS returns essentialocl::ExpSpecificationCS:
ownedExpression=ExpCS | exprString=UNQUOTED_STRING
;
StructuredClassCS returns base::StructuredClassCS:
isAbstract?='abstract'?
'class' name=UnrestrictedName
(ownedSignature=TemplateSignatureCS)?
('extends' ownedSuperTypes+=TypedRefCS (',' ownedSuperTypes+=TypedRefCS)*)?
(':' instanceClassName=SINGLE_QUOTED_STRING)?
('{' isInterface?='interface'?
'}')?
( ('{' (/*ownedAnnotations+=AnnotationElementCS
|*/ ownedOperations+=OperationCS
| ownedProperties+=StructuralFeatureCS
/*| ownedConstraints+=InvariantConstraintCS*/)* '}')
| ';'
)
;
TargetCS: 'target' name=UnrestrictedName '{' ownedTargetElements+=(SimpleTargetElementCS|CompoundTargetElementCS)* '}' ';'?;
TypedMultiplicityRefCS returns base::TypedRefCS:
TypedRefCS (ownedMultiplicity=MultiplicityCS)?
;
TypedRefCS returns base::TypedRefCS:
TypeLiteralCS | TypedTypeRefCS
;
StructuralFeatureCS returns base::StructuralFeatureCS:
AttributeCS | ReferenceCS
;
EnumerationLiteralName returns ecore::EString:
EssentialOCLUnrestrictedName
;
QVTbaseUnrestrictedName:
'abstract'
| 'attribute'
| 'body'
| 'class'
| 'composes'
| 'datatype'
| 'definition'
| 'derived'
| 'derivation'
| 'enum'
| 'extends'
| 'id'
| 'initial'
| 'interface'
| 'literal'
| 'operation'
| 'ordered'
| 'primitive'
| 'property'
| 'readonly'
| 'resolve'
| 'serializable'
| 'static'
| 'throws'
| 'transient'
| 'unique'
| 'unsettable'
| 'volatile'
;
/*
| 'callable'
| 'import'
| 'key'
| 'library'
| 'module'
| 'package'
| 'postcondition'
| 'precondition'
| 'reference'
*/
SIGNED returns ecore::EInt:
'-'? INT
;
terminal UNQUOTED_STRING: // Never forward parsed; just provides a placeholder
'£$%^£$%^' // for reverse serialisation of embedded OCL
;