/*******************************************************************************
 * Copyright (c) 2010, 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
 * 	 E.D.Willink (Obeo) - Bug 416287 - tuple-valued constraints
 *******************************************************************************/
grammar org.eclipse.ocl.xtext.oclinecore.OCLinEcore 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.ocl.xtext.oclinecore/model/OCLinEcoreCS.ecore"
//generate oclinEcore2 "http://www.eclipse.org/ocl/examples/xtext/oclinecore/OCLinEcore"

TopLevelCS :
	{TopLevelCS} ('module' UnrestrictedName)?
	(ownedImports+=ImportCS)*
	(ownedPackages+=PackageCS)*
;

terminal UNQUOTED_STRING:	// Never forward parsed; just provides a placeholder
	'£$%^£$%^'				//  for reverse serialisation of embedded OCL 
;

INTEGER returns ecore::EInt:
	INT
;

SIGNED returns ecore::EInt:
	'-'? INT
;

EnumerationLiteralName returns ecore::EString:
	EssentialOCLUnrestrictedName
|	'abstract'
|	'attribute'
|	'body'
|	'callable'
|	'class'
|	'composes'
|	'datatype'
|	'definition'
|	'derivation'
|	'derived'
|	'enum'
|	'extends'
|	'id'
|	'import'
|	'initial'
|	'interface'
|	'key'
|	'library'
|	'module'
|	'operation'
|	'ordered'
|	'package'
|	'postcondition'
|	'precondition'
|	'primitive'
|	'property'
|	'readonly'
|	'reference'
|	'resolve'
|	'static'
|	'throws'
|	'transient'
|	'unique'
|	'unsettable'
|	'volatile'
;

InvariantConstraintCS returns OCLinEcoreConstraintCS:
	(isCallable?='callable')? stereotype='invariant' (name=UnrestrictedName ('(' ownedMessageSpecification=SpecificationCS ')')?)?
	((':' ownedSpecification=SpecificationCS? ';') | ';')
;

PostconditionConstraintCS returns OCLinEcoreConstraintCS:
	stereotype='postcondition' (name=UnrestrictedName ('(' ownedMessageSpecification=SpecificationCS ')')?)? ':' ownedSpecification=SpecificationCS? ';'
;

PreconditionConstraintCS returns OCLinEcoreConstraintCS:
	stereotype='precondition' (name=UnrestrictedName ('(' ownedMessageSpecification=SpecificationCS ')')?)? ':' ownedSpecification=SpecificationCS? ';'
;

AnnotationCS returns base::AnnotationCS:
	{base::AnnotationCS} 'annotation' name=(UnrestrictedName|SINGLE_QUOTED_STRING)?
	('(' ownedDetails+=DetailCS (',' ownedDetails+=DetailCS)* ')')?
	(('{' (ownedAnnotations+=AnnotationElementCS
	     | ownedContents+=ModelElementCS
	     | ownedReferences+=ModelElementRefCS
	  )+'}')
	|';'
	)
;

AnnotationElementCS returns base::AnnotationElementCS:
	AnnotationCS | DocumentationCS | SysMLCS
;

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
;

DataTypeCS returns base::DataTypeCS:
	isPrimitive ?= 'primitive'? 'datatype' name=UnrestrictedName
	(ownedSignature=TemplateSignatureCS)?
	(':' instanceClassName=SINGLE_QUOTED_STRING)?
	('{' (isSerializable?='serializable' | '!serializable')? '}')?
	(	('{' (ownedAnnotations+=AnnotationElementCS
	        | ownedConstraints+=InvariantConstraintCS)* '}')
	|	';'
	)
;

DetailCS returns base::DetailCS:
	name=(UnrestrictedName|SINGLE_QUOTED_STRING) '=' values+=(SINGLE_QUOTED_STRING|ML_SINGLE_QUOTED_STRING)*
;

DocumentationCS returns base::DocumentationCS:
	{base::DocumentationCS} 'documentation' value=SINGLE_QUOTED_STRING?
	('(' ownedDetails+=DetailCS (',' ownedDetails+=DetailCS)* ')')?
	 ';'
;

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) (':' literal=SINGLE_QUOTED_STRING)? ('=' value=SIGNED)?
	(('{' ownedAnnotations+=AnnotationElementCS* '}')
	|';'
	)
;

ImportCS returns base::ImportCS:
	('import' | 'library') (name=UnrestrictedName ':')? ownedPathName=URIPathNameCS (isAll?='::*')? ';'
;

ModelElementCS returns base::ModelElementCS:
	ClassCS | EnumerationLiteralCS | OperationCS | PackageCS | StructuralFeatureCS
;

ModelElementRefCS returns base::ModelElementRefCS:
	'reference' ownedPathName=PathNameCS ';'
;

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+='transient' | qualifiers+='!transient' |
		  qualifiers+='unique' | qualifiers+='!unique'
		) ','? )+
	'}')?
	(	('{' (ownedAnnotations+=AnnotationElementCS
	        | ownedPreconditions+=PreconditionConstraintCS
	        | ('body' UnrestrictedName? ':' ownedBodyExpressions+=SpecificationCS? ';')
	        | ownedPostconditions+=PostconditionConstraintCS)* '}')
	|	';'
	)
;

PackageCS returns base::PackageCS:
	'package' name=UnrestrictedName
	(':' nsPrefix=UnrestrictedName)? ('=' nsURI=URI)?
	(('{'
		(ownedAnnotations+=AnnotationElementCS | ownedPackages+=PackageCS | ownedClasses+=ClassCS)*
		'}')
	|';'
	)
;

ParameterCS returns base::ParameterCS:
	name=UnrestrictedName
	(':' ownedType=TypedMultiplicityRefCS)?
	('{'(( qualifiers+='ordered' | qualifiers+='!ordered' |
		   qualifiers+='unique' | qualifiers+='!unique'
		  ) ','?)+
	 '}')?
	('{' ownedAnnotations+=AnnotationElementCS* '}')?
;

ImplicitOppositeCS returns base::ImplicitOppositeCS:
	'opposite' name=UnrestrictedName
	':' ownedType=TypedMultiplicityRefCS
	('{'((qualifiers+='ordered' | qualifiers+='!ordered' |
		  qualifiers+='unique' | qualifiers+='!unique'
		) ','? )+
	'}')?
;

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? ';')
	        | (ownedImplicitOpposites+=ImplicitOppositeCS ';')
	        )* '}')
	|	';'
	)
;

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)* '}')
	|	';'
	)
;

StructuralFeatureCS returns base::StructuralFeatureCS:
	AttributeCS | ReferenceCS
;

SysMLCS returns SysMLCS:
	{SysMLCS} 'sysml' ((ownedDetails+=DetailCS ';') | ('{' (ownedDetails+=DetailCS ';')* '}'))
;

TypeIdentifier:
	UnrestrictedName
|	PrimitiveTypeIdentifier
;

TypedMultiplicityRefCS returns base::TypedRefCS:
	TypedRefCS (ownedMultiplicity=MultiplicityCS)?
;

//---------------------------------------------------------------------------------
//	Base overrides
//---------------------------------------------------------------------------------
TemplateSignatureCS returns base::TemplateSignatureCS:
	('(' ownedParameters+=TypeParameterCS (',' ownedParameters+=TypeParameterCS)* ')')
|	('<' ownedParameters+=TypeParameterCS (',' ownedParameters+=TypeParameterCS)* '>')
;

TypedRefCS returns base::TypedRefCS:
	TypeLiteralCS | TypedTypeRefCS
;

TypedTypeRefCS returns base::TypedTypeRefCS:
	ownedPathName=PathNameCS (('(' ownedBinding=TemplateBindingCS ')') | ('<' ownedBinding=TemplateBindingCS '>'))?
;

UnrestrictedName returns ecore::EString:
	EnumerationLiteralName
|	'annotation'
|	'documentation'
|	'invariant'
|	'literal'
|	'opposite'
|	'serializable'
|	'sysml'
;
