blob: 88f2d0052c818c10816074ba3da149225a940244 [file] [log] [blame]
--/**
-- * <copyright>
-- *
-- * Copyright (c) 2005, 2009 IBM Corporation 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:
-- * See (or edit) Notice Declaration below
-- *
-- * </copyright>
-- */
--
-- The Complete OCL Parser
--
%options escape=$
%options la=1
%options fp=OCLParser,prefix=TK_
%options noserialize
%options package=org.eclipse.ocl.parser
%options import_terminals=OCLLexer.gi
%options ast_type=CSTNode
%options template=dtParserTemplateF.gi
%options include_directory=".;../lpg"
%Start
goal
%End
%Import
EssentialOCL.gi
%End
%Notice
/./**
* Complete OCL Grammar
* <copyright>
*
* Copyright (c) 2005, 2009 IBM Corporation 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:
* IBM - Initial API and implementation
* E.D.Willink - Bug 259818, 285633, 292112
* Adolfo Sanchez-Barbudo Herrera (Open Canarias):
* - 242153: LPG v 2.0.17 adoption.
* - 299396: Introducing new LPG templates
* - 300534: Removing the use of deprecated macros.
*******************************************************************************/
./
%End
%Define
$environment_class /.Environment<?,?,?,?,?,?,?,?,?,?,?,?>./
$super_lexer_class /.OCLLexer./
%End
%Globals
/.
import org.eclipse.ocl.Environment;
import org.eclipse.ocl.cst.ClassifierContextDeclCS;
import org.eclipse.ocl.cst.ContextDeclCS;
import org.eclipse.ocl.cst.DefCS;
import org.eclipse.ocl.cst.DefExpressionCS;
import org.eclipse.ocl.cst.DerValueCS;
import org.eclipse.ocl.cst.InitValueCS;
import org.eclipse.ocl.cst.InitOrDerValueCS;
import org.eclipse.ocl.cst.InvCS;
import org.eclipse.ocl.cst.InvOrDefCS;
import org.eclipse.ocl.cst.MessageExpCS;
import org.eclipse.ocl.cst.OCLMessageArgCS;
import org.eclipse.ocl.cst.OperationCS;
import org.eclipse.ocl.cst.OperationContextDeclCS;
import org.eclipse.ocl.cst.PackageDeclarationCS;
import org.eclipse.ocl.cst.PrePostOrBodyDeclCS;
import org.eclipse.ocl.cst.PrePostOrBodyEnum;
import org.eclipse.ocl.cst.PropertyContextCS;
./
%End
%KeyWords
-- Reserved keywords
body context def derive endpackage init inv package post pre static
-- Restricted keywords
OclMessage import
%End
%Terminals
AT ::= '@'
CARET ::= '^'
CARETCARET ::= '^^'
QUESTIONMARK ::= '?'
%End
%Rules
goal -> packageDeclarationsCS
goal -> invOrDefCS
goal -> prePostOrBodyDeclCS
goal -> initOrDerValueCS
goal -> VariableDeclarationCS
goal -> %empty
-----------------------------------------------------------------------
-- Names
-----------------------------------------------------------------------
reservedKeyword -> body
reservedKeyword -> context
reservedKeyword -> def
reservedKeyword -> derive
reservedKeyword -> endpackage
reservedKeyword -> init
reservedKeyword -> inv
reservedKeyword -> package
reservedKeyword -> post
reservedKeyword -> pre
reservedKeyword -> static
reservedKeyword -> import
unreservedSimpleNameCSopt ::= %empty
/.$NullAction./
unreservedSimpleNameCSopt -> unreservedSimpleNameCS
simpleNameCS ::= import
/.$BeginCode
IToken iToken = getRhsIToken(1);
SimpleNameCS result = createSimpleNameCS(
SimpleTypeEnum.IDENTIFIER_LITERAL,
iToken
);
setOffsets(result, iToken);
setResult(result);
$EndCode
./
-----------------------------------------------------------------------
-- Types
-----------------------------------------------------------------------
primitiveTypeCS ::= OclMessage
/.$BeginCode
PrimitiveTypeCS result = createPrimitiveTypeCS(
SimpleTypeEnum.OCL_MESSAGE_LITERAL,
getRhsTokenText(1)
);
setOffsets(result, getRhsIToken(1));
setResult(result);
$EndCode
./
typeCSopt ::= %empty
/.$NullAction./
typeCSopt -> typeCS
-----------------------------------------------------------------------
-- Calls
-----------------------------------------------------------------------
OperationCallExpCS ::= -- [B]
primaryExpCS '->' simpleNameCS isMarkedPreCS '(' argumentsCSopt ')'
/.$BeginCode
OCLExpressionCS source = (OCLExpressionCS)getRhsSym(1);
OperationCallExpCS result = createArrowOperationCallExpCS(
source,
(SimpleNameCS)getRhsSym(3),
(IsMarkedPreCS)getRhsSym(4),
(EList<OCLExpressionCS>)getRhsSym(6)
);
setOffsets(result, source, getRhsIToken(7));
setResult(result);
$EndCode
./
AssociationClassCallExpCS ::= -- [B.1],PropertyCallExpCS[B]
simpleNameCS isMarkedPreCS
/.$BeginCode
SimpleNameCS simpleNameCS = (SimpleNameCS)getRhsSym(1);
IsMarkedPreCS isMarkedPreCS = (IsMarkedPreCS)getRhsSym(2);
VariableExpCS result = createVariableExpCS(
simpleNameCS,
new BasicEList<OCLExpressionCS>(),
isMarkedPreCS
);
setOffsets(result, simpleNameCS, isMarkedPreCS);
setResult(result);
$EndCode
./
isMarkedPreCS ::= '@' pre
/.$BeginCode
IsMarkedPreCS result = createIsMarkedPreCS();
setOffsets(result, getRhsIToken(1), getRhsIToken(2));
setResult(result);
$EndCode
./
isMarkedPreCSopt -> isMarkedPreCS
OclMessageExpCS ::= primaryExpCS '^^' simpleNameCS '(' OclMessageArgumentsCSopt ')'
/.$NewCase./
OclMessageExpCS ::= primaryExpCS '^' simpleNameCS '(' OclMessageArgumentsCSopt ')'
/.$BeginCode
OCLExpressionCS target = (OCLExpressionCS)getRhsSym(1);
MessageExpCS result = createMessageExpCS(
target,
getRhsIToken(2).getKind() == $sym_type.TK_CARET,
(SimpleNameCS)getRhsSym(3),
(EList<OCLMessageArgCS>)getRhsSym(5)
);
setOffsets(result, target, getRhsIToken(6));
setResult(result);
$EndCode
./
OclMessageArgumentsCSopt ::= %empty
/.$BeginCode
setResult(new BasicEList<OCLMessageArgCS>());
$EndCode
./
OclMessageArgumentsCSopt -> OclMessageArgumentsCS
OclMessageArgumentsCS ::= OclMessageArgCS
/.$BeginCode
EList<OCLMessageArgCS> result = new BasicEList<OCLMessageArgCS>();
result.add((OCLMessageArgCS)getRhsSym(1));
setResult(result);
$EndCode
./
OclMessageArgumentsCS ::= OclMessageArgumentsCS ',' OclMessageArgCS
/.$BeginCode
EList<OCLMessageArgCS> result = (EList<OCLMessageArgCS>)getRhsSym(1);
result.add((OCLMessageArgCS)getRhsSym(3));
setResult(result);
$EndCode
./
OclMessageArgCS ::= '?'
/.$BeginCode
OCLMessageArgCS result = createOCLMessageArgCS(
null,
null
);
setOffsets(result, getRhsIToken(1));
setResult(result);
$EndCode
./
OclMessageArgCS ::= '?' ':' typeCS
/.$BeginCode
OCLMessageArgCS result = createOCLMessageArgCS(
(TypeCS)getRhsSym(3),
null
);
setOffsets(result, getRhsIToken(1), (CSTNode)getRhsSym(3));
setResult(result);
$EndCode
./
OclMessageArgCS ::= OclExpressionCS
/.$BeginCode
OCLMessageArgCS result = createOCLMessageArgCS(
null,
(OCLExpressionCS)getRhsSym(1)
);
setOffsets(result, (CSTNode)getRhsSym(1));
setResult(result);
$EndCode
./
-----------------------------------------------------------------------
-- Expressions
-----------------------------------------------------------------------
primaryNotNameCS -> OclMessageExpCS
-----------------------------------------------------------------------
-- Contexts
-----------------------------------------------------------------------
packageDeclarationsCS -> packageDeclarationCS
packageDeclarationsCS ::= packageDeclarationsCS packageDeclarationCS_A
/.$BeginCode
PackageDeclarationCS result = (PackageDeclarationCS)getRhsSym(2);
result.setPackageDeclarationCS((PackageDeclarationCS) getRhsSym(1));
setResult(result);
$EndCode
./
packageDeclarationsCS ::= importCS packageDeclarationCS_A
/.$BeginCode
PackageDeclarationCS result = (PackageDeclarationCS)getRhsSym(2);
setResult(result);
$EndCode
./
packageDeclarationCS -> packageDeclarationCS_A
packageDeclarationCS -> packageDeclarationCS_B
packageDeclarationCS_A ::= package pathNameCS contextDeclsCSopt endpackage
/.$BeginCode
PackageDeclarationCS result = createPackageDeclarationCS(
(PathNameCS)getRhsSym(2),
(EList<ContextDeclCS>)getRhsSym(3)
);
setOffsets(result, getRhsIToken(1), getRhsIToken(4));
setResult(result);
$EndCode
./
packageDeclarationCS_B ::= contextDeclsCS
/.$BeginCode
EList<ContextDeclCS> contextDecls = (EList<ContextDeclCS>)getRhsSym(1);
PackageDeclarationCS result = createPackageDeclarationCS(null, contextDecls);
if (!contextDecls.isEmpty()) {
setOffsets(result, contextDecls.get(0), contextDecls.get(contextDecls.size()-1));
}
setResult(result);
$EndCode
./
-- 'import' (name=Identifier ':')? namespace=[pivot::Namespace|URI] (all?='::' '*')?;
importCS_0 ::= import
importCS_1 -> importCS_0
importCS_1 ::= importCS_0 simpleNameCS ':'
importCS_2 -> importCS_1 STRING_LITERAL
importCS -> importCS_2
importCS ::= importCS_2 '::' '*'
contextDeclsCSopt ::= %empty
/.$BeginCode
setResult(new BasicEList<ContextDeclCS>());
$EndCode
./
contextDeclsCSopt -> contextDeclsCS
contextDeclsCS ::= contextDeclCS
/.$BeginCode
EList<ContextDeclCS> result = new BasicEList<ContextDeclCS>();
result.add((ContextDeclCS)getRhsSym(1));
setResult(result);
$EndCode
./
contextDeclsCS ::= contextDeclsCS contextDeclCS
/.$BeginCode
EList<ContextDeclCS> result = (EList<ContextDeclCS>)getRhsSym(1);
result.add((ContextDeclCS)getRhsSym(2));
setResult(result);
$EndCode
./
contextDeclCS -> propertyContextDeclCS
contextDeclCS -> classifierContextDeclCS
contextDeclCS -> operationContextDeclCS
propertyContextDeclCS ::= context pathNameCS '::' unreservedSimpleNameCS
':' typeCS initOrDerValuesCS
/.$BeginCode
PathNameCS pathNameCS = (PathNameCS)getRhsSym(2);
SimpleNameCS simpleNameCS = (SimpleNameCS)getRhsSym(4);
EList<InitOrDerValueCS> list = (EList<InitOrDerValueCS>)getRhsSym(7);
PropertyContextCS result = createPropertyContextCS(
pathNameCS,
simpleNameCS,
(TypeCS)getRhsSym(6),
list
);
setOffsets(result, getRhsIToken(1), list.get(list.size()-1));
setResult(result);
$EndCode
./
initOrDerValuesCS ::= initOrDerValueCS
/.$BeginCode
EList<InitOrDerValueCS> result = new BasicEList<InitOrDerValueCS>();
result.add((InitOrDerValueCS)getRhsSym(1));
setResult(result);
$EndCode
./
initOrDerValuesCS ::= initOrDerValuesCS initOrDerValueCS
/.$BeginCode
EList<InitOrDerValueCS> result = (EList<InitOrDerValueCS>)getRhsSym(1);
result.add((InitOrDerValueCS)getRhsSym(2));
setResult(result);
$EndCode
./
initOrDerValueCS ::= init ':' OclExpressionCS
/.$BeginCode
InitValueCS result = createInitValueCS((OCLExpressionCS)getRhsSym(3));
setOffsets(result, getRhsIToken(1), (CSTNode)getRhsSym(3));
setResult(result);
$EndCode
./
initOrDerValueCS ::= derive ':' OclExpressionCS
/.$BeginCode
DerValueCS result = createDerValueCS((OCLExpressionCS)getRhsSym(3));
setOffsets(result, getRhsIToken(1), (CSTNode)getRhsSym(3));
setResult(result);
$EndCode
./
classifierContextDeclCS ::= context pathNameCS invOrDefsCS
/.$BeginCode
EList<InvOrDefCS> list = (EList<InvOrDefCS>)getRhsSym(3);
ClassifierContextDeclCS result = createClassifierContextDeclCS(
null,
(PathNameCS)getRhsSym(2),
list
);
setOffsets(result, getRhsIToken(1), list.get(list.size()-1));
setResult(result);
$EndCode
./
classifierContextDeclCS ::= context simpleNameCS ':' pathNameCS invOrDefsCS
/.$BeginCode
EList<InvOrDefCS> list = (EList<InvOrDefCS>)getRhsSym(5);
ClassifierContextDeclCS result = createClassifierContextDeclCS(
(SimpleNameCS)getRhsSym(2),
(PathNameCS)getRhsSym(4),
list
);
setOffsets(result, getRhsIToken(1), list.get(list.size()-1));
setResult(result);
$EndCode
./
invOrDefsCS ::= invOrDefCS
/.$BeginCode
EList<InvOrDefCS> result = new BasicEList<InvOrDefCS>();
result.add((InvOrDefCS)getRhsSym(1));
setResult(result);
$EndCode
./
invOrDefsCS ::= invOrDefsCS invOrDefCS
/.$BeginCode
EList<InvOrDefCS> result = (EList<InvOrDefCS>)getRhsSym(1);
result.add((InvOrDefCS)getRhsSym(2));
setResult(result);
$EndCode
./
invOrDefCS ::= inv unreservedSimpleNameCSopt ':' OclExpressionCS
/.$BeginCode
InvCS result = createInvCS(
(SimpleNameCS)getRhsSym(2),
(OCLExpressionCS)getRhsSym(4)
);
setOffsets(result, getRhsIToken(1), (CSTNode)getRhsSym(4));
setResult(result);
$EndCode
./
invOrDefCS ::= def unreservedSimpleNameCSopt ':' defExpressionCS
/.$BeginCode
DefExpressionCS defExpressionCS = (DefExpressionCS)getRhsSym(4);
DefCS result = createDefCS(
false,
(SimpleNameCS)getRhsSym(2),
defExpressionCS
);
setOffsets(result, getRhsIToken(1), defExpressionCS);
setResult(result);
$EndCode
./
invOrDefCS ::= static def unreservedSimpleNameCSopt ':' defExpressionCS
/.$BeginCode
DefExpressionCS defExpressionCS = (DefExpressionCS)getRhsSym(5);
DefCS result = createDefCS(
true,
(SimpleNameCS)getRhsSym(3),
defExpressionCS
);
setOffsets(result, getRhsIToken(1), defExpressionCS);
setResult(result);
$EndCode
./
defExpressionCS ::= typedUninitializedVariableCS '=' OclExpressionCS
/.$BeginCode
VariableCS variableCS = (VariableCS)getRhsSym(1);
OCLExpressionCS expressionCS = (OCLExpressionCS)getRhsSym(3);
DefExpressionCS result = createDefExpressionCS(
variableCS,
null,
expressionCS
);
setOffsets(result, variableCS, expressionCS);
setResult(result);
$EndCode
./
defExpressionCS ::= operationCS1 '=' OclExpressionCS
/.$BeginCode
DefExpressionCS result = createDefExpressionCS(
null,
(OperationCS)getRhsSym(1),
(OCLExpressionCS)getRhsSym(3)
);
setOffsets(result, (CSTNode)getRhsSym(1), (CSTNode)getRhsSym(3));
setResult(result);
$EndCode
./
operationContextDeclCS ::= context operationCS2 prePostOrBodyDeclsCS
/.$BeginCode
EList<PrePostOrBodyDeclCS> prePostOrBodyDecls = (EList<PrePostOrBodyDeclCS>)getRhsSym(3);
OperationContextDeclCS result = createOperationContextDeclCS(
(OperationCS)getRhsSym(2),
prePostOrBodyDecls
);
setOffsets(result, getRhsIToken(1), prePostOrBodyDecls.get(prePostOrBodyDecls.size()-1));
setResult(result);
$EndCode
./
prePostOrBodyDeclsCS ::= prePostOrBodyDeclCS
/.$BeginCode
EList<PrePostOrBodyDeclCS> result = new BasicEList<PrePostOrBodyDeclCS>();
result.add((PrePostOrBodyDeclCS)getRhsSym(1));
setResult(result);
$EndCode
./
prePostOrBodyDeclsCS ::= prePostOrBodyDeclsCS prePostOrBodyDeclCS
/.$BeginCode
EList<PrePostOrBodyDeclCS> result = (EList<PrePostOrBodyDeclCS>)getRhsSym(1);
result.add((PrePostOrBodyDeclCS)getRhsSym(2));
setResult(result);
$EndCode
./
prePostOrBodyDeclCS ::= pre unreservedSimpleNameCSopt ':' OclExpressionCS
/.$BeginCode
PrePostOrBodyDeclCS result = createPrePostOrBodyDeclCS(
PrePostOrBodyEnum.PRE_LITERAL,
(SimpleNameCS)getRhsSym(2),
(OCLExpressionCS)getRhsSym(4)
);
setOffsets(result, getRhsIToken(1), (CSTNode)getRhsSym(4));
setResult(result);
$EndCode
./
prePostOrBodyDeclCS ::= post unreservedSimpleNameCSopt ':' OclExpressionCS
/.$BeginCode
PrePostOrBodyDeclCS result = createPrePostOrBodyDeclCS(
PrePostOrBodyEnum.POST_LITERAL,
(SimpleNameCS)getRhsSym(2),
(OCLExpressionCS)getRhsSym(4)
);
setOffsets(result, getRhsIToken(1), (CSTNode)getRhsSym(4));
setResult(result);
$EndCode
./
prePostOrBodyDeclCS ::= body unreservedSimpleNameCSopt ':' OclExpressionCS
/.$BeginCode
PrePostOrBodyDeclCS result = createPrePostOrBodyDeclCS(
PrePostOrBodyEnum.BODY_LITERAL,
(SimpleNameCS)getRhsSym(2),
(OCLExpressionCS)getRhsSym(4)
);
setOffsets(result, getRhsIToken(1), (CSTNode)getRhsSym(4));
setResult(result);
$EndCode
./
operationCS1 ::= simpleNameCS '(' parametersCSopt ')' ':' typeCSopt
/.$BeginCode
OperationCS result = createOperationCS(
getRhsIToken(1),
(EList<VariableCS>)getRhsSym(3),
(TypeCS)getRhsSym(6)
);
if (getRhsSym(6) != null) {
setOffsets(result, getRhsIToken(1), (CSTNode)getRhsSym(6));
} else {
setOffsets(result, getRhsIToken(1), getRhsIToken(5));
}
setResult(result);
$EndCode
./
operationCS2 ::= pathNameCS '::' unreservedSimpleNameCS '(' parametersCSopt ')'
':' typeCSopt
/.$BeginCode
PathNameCS pathNameCS = (PathNameCS)getRhsSym(1);
SimpleNameCS simpleNameCS = (SimpleNameCS)getRhsSym(3);
TypeCS typeCS = (TypeCS)getRhsSym(8);
OperationCS result = createOperationCS(
pathNameCS,
simpleNameCS,
(EList<VariableCS>)getRhsSym(5),
typeCS
);
if (typeCS != null) {
setOffsets(result, pathNameCS, typeCS);
} else {
setOffsets(result, pathNameCS, getRhsIToken(7));
}
setResult(result);
$EndCode
./
parametersCSopt ::= %empty
/.$BeginCode
setResult(new BasicEList<VariableCS>());
$EndCode
./
parametersCSopt -> parametersCS
parametersCS ::= VariableDeclarationCS
/.$BeginCode
EList<VariableCS> result = new BasicEList<VariableCS>();
result.add((VariableCS)getRhsSym(1));
setResult(result);
$EndCode
./
parametersCS ::= parametersCS ',' VariableDeclarationCS
/.$BeginCode
EList<VariableCS> result = (EList<VariableCS>)getRhsSym(1);
result.add((VariableCS)getRhsSym(3));
setResult(result);
$EndCode
./
%End