/*
* Copyright (c) 2006, 2009 Borland Software Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* committers of openArchitectureWare - Xpand language syntax
* Artem Tikhomirov (Borland) - LALR grammar
* - Migration to OCL expressions
*/
package org.eclipse.gmf.internal.xpand.parser;
import java.text.StringCharacterIterator;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import lpg.runtime.BadParseException;
import lpg.runtime.BadParseSymFileException;
import lpg.runtime.DeterministicParser;
import lpg.runtime.DiagnoseParser;
import lpg.runtime.ErrorToken;
import lpg.runtime.IToken;
import lpg.runtime.LexStream;
import lpg.runtime.Monitor;
import lpg.runtime.NotDeterministicParseTableException;
import lpg.runtime.NullExportedSymbolsException;
import lpg.runtime.NullTerminalSymbolsException;
import lpg.runtime.ParseTable;
import lpg.runtime.PrsStream;
import lpg.runtime.RuleAction;
import lpg.runtime.TokenStream;
import lpg.runtime.UndefinedEofSymbolException;
import lpg.runtime.UnimplementedTerminalsException;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.gmf.internal.xpand.ast.Advice;
import org.eclipse.gmf.internal.xpand.ast.Definition;
import org.eclipse.gmf.internal.xpand.ast.IfStatement;
import org.eclipse.gmf.internal.xpand.ast.Template;
import org.eclipse.gmf.internal.xpand.expression.ast.Identifier;
import org.eclipse.gmf.internal.xpand.util.ParserException.ErrorLocationInfo;
import org.eclipse.m2m.internal.qvt.oml.cst.CompleteSignatureCS;
import org.eclipse.m2m.internal.qvt.oml.cst.DictLiteralExpCS;
import org.eclipse.m2m.internal.qvt.oml.cst.DictLiteralPartCS;
import org.eclipse.m2m.internal.qvt.oml.cst.DictionaryTypeCS;
import org.eclipse.m2m.internal.qvt.oml.cst.DirectionKindCS;
import org.eclipse.m2m.internal.qvt.oml.cst.DirectionKindEnum;
import org.eclipse.m2m.internal.qvt.oml.cst.ImperativeIterateExpCS;
import org.eclipse.m2m.internal.qvt.oml.cst.ImperativeOperationCallExpCS;
import org.eclipse.m2m.internal.qvt.oml.cst.LibraryImportCS;
import org.eclipse.m2m.internal.qvt.oml.cst.ListLiteralExpCS;
import org.eclipse.m2m.internal.qvt.oml.cst.ListTypeCS;
import org.eclipse.m2m.internal.qvt.oml.cst.ParameterDeclarationCS;
import org.eclipse.m2m.internal.qvt.oml.cst.SimpleSignatureCS;
import org.eclipse.m2m.internal.qvt.oml.cst.StatementCS;
import org.eclipse.m2m.internal.qvt.oml.cst.TypeSpecCS;
import org.eclipse.ocl.cst.BooleanLiteralExpCS;
import org.eclipse.ocl.cst.CSTFactory;
import org.eclipse.ocl.cst.CSTNode;
import org.eclipse.ocl.cst.CallExpCS;
import org.eclipse.ocl.cst.CollectionLiteralExpCS;
import org.eclipse.ocl.cst.CollectionLiteralPartCS;
import org.eclipse.ocl.cst.CollectionRangeCS;
import org.eclipse.ocl.cst.CollectionTypeCS;
import org.eclipse.ocl.cst.CollectionTypeIdentifierEnum;
import org.eclipse.ocl.cst.DotOrArrowEnum;
import org.eclipse.ocl.cst.FeatureCallExpCS;
import org.eclipse.ocl.cst.IfExpCS;
import org.eclipse.ocl.cst.IntegerLiteralExpCS;
import org.eclipse.ocl.cst.InvalidLiteralExpCS;
import org.eclipse.ocl.cst.IsMarkedPreCS;
import org.eclipse.ocl.cst.IterateExpCS;
import org.eclipse.ocl.cst.IteratorExpCS;
import org.eclipse.ocl.cst.LetExpCS;
import org.eclipse.ocl.cst.LiteralExpCS;
import org.eclipse.ocl.cst.NullLiteralExpCS;
import org.eclipse.ocl.cst.OCLExpressionCS;
import org.eclipse.ocl.cst.OperationCallExpCS;
import org.eclipse.ocl.cst.PathNameCS;
import org.eclipse.ocl.cst.PrimitiveTypeCS;
import org.eclipse.ocl.cst.RealLiteralExpCS;
import org.eclipse.ocl.cst.SimpleNameCS;
import org.eclipse.ocl.cst.SimpleTypeEnum;
import org.eclipse.ocl.cst.StringLiteralExpCS;
import org.eclipse.ocl.cst.TupleLiteralExpCS;
import org.eclipse.ocl.cst.TupleTypeCS;
import org.eclipse.ocl.cst.TypeCS;
import org.eclipse.ocl.cst.UnlimitedNaturalLiteralExpCS;
import org.eclipse.ocl.cst.VariableCS;
import org.eclipse.ocl.cst.VariableExpCS;
import org.eclipse.ocl.lpg.ProblemHandler;
public class XpandParser extends PrsStream implements RuleAction {
private static ParseTable prs = new XpandParserprs();
private DeterministicParser dtParser;
public DeterministicParser getParser() {
return dtParser;
}
private void setResult(Object object) {
dtParser.setSym1(object);
}
public Object getRhsSym(int i) {
return dtParser.getSym(i);
}
public int getRhsTokenIndex(int i) {
return dtParser.getToken(i);
}
public IToken getRhsIToken(int i) {
return super.getIToken(getRhsTokenIndex(i));
}
public int getRhsFirstTokenIndex(int i) {
return dtParser.getFirstToken(i);
}
public IToken getRhsFirstIToken(int i) {
return super.getIToken(getRhsFirstTokenIndex(i));
}
public int getRhsLastTokenIndex(int i) {
return dtParser.getLastToken(i);
}
public IToken getRhsLastIToken(int i) {
return super.getIToken(getRhsLastTokenIndex(i));
}
public int getLeftSpan() {
return dtParser.getFirstToken();
}
public IToken getLeftIToken() {
return super.getIToken(getLeftSpan());
}
public int getRightSpan() {
return dtParser.getLastToken();
}
public IToken getRightIToken() {
return super.getIToken(getRightSpan());
}
public int getRhsErrorTokenIndex(int i) {
int index = dtParser.getToken(i);
IToken err = super.getIToken(index);
return (err instanceof ErrorToken ? index : 0);
}
public ErrorToken getRhsErrorIToken(int i) {
int index = dtParser.getToken(i);
IToken err = super.getIToken(index);
return (ErrorToken) (err instanceof ErrorToken ? err : null);
}
public XpandParser(LexStream lexStream) {
super(lexStream);
xpandFactory = new XpandFactory(lexStream.getFileName());
try {
super.remapTerminalSymbols(orderedTerminalSymbols(), XpandParserprs.EOFT_SYMBOL);
} catch (NullExportedSymbolsException e) {
} catch (NullTerminalSymbolsException e) {
} catch (UnimplementedTerminalsException e) {
java.util.ArrayList<?> unimplemented_symbols = e.getSymbols();
System.out.println("The Lexer will not scan the following token(s):");
for (int i = 0; i < unimplemented_symbols.size(); i++) {
Integer id = (Integer) unimplemented_symbols.get(i);
System.out.println(" " + XpandParsersym.orderedTerminalSymbols[id.intValue()]);
}
System.out.println();
} catch (UndefinedEofSymbolException e) {
throw new Error(new UndefinedEofSymbolException("The Lexer does not implement the Eof symbol " + XpandParsersym.orderedTerminalSymbols[XpandParserprs.EOFT_SYMBOL]));
}
}
public String[] orderedTerminalSymbols() {
return XpandParsersym.orderedTerminalSymbols;
}
public String getTokenKindName(int kind) {
return XpandParsersym.orderedTerminalSymbols[kind];
}
public int getEOFTokenKind() {
return XpandParserprs.EOFT_SYMBOL;
}
public PrsStream getParseStream() {
return (PrsStream) this;
}
public Template parser() {
return parser(null, 0);
}
public Template parser(Monitor monitor) {
return parser(monitor, 0);
}
public Template parser(int error_repair_count) {
return parser(null, error_repair_count);
}
public Template parser(Monitor monitor, int error_repair_count) {
try {
resetErrors();
dtParser = new DeterministicParser(monitor, (TokenStream) this, prs, (RuleAction) this);
} catch (NotDeterministicParseTableException e) {
throw new Error(new NotDeterministicParseTableException("Regenerate XpandParserprs.java with -NOBACKTRACK option"));
} catch (BadParseSymFileException e) {
throw new Error(new BadParseSymFileException("Bad Parser Symbol File -- XpandParsersym.java. Regenerate XpandParserprs.java"));
}
try {
return (Template) dtParser.parse();
} catch (BadParseException e) {
reset(e.error_token); // point to error token
DiagnoseParser diagnoseParser = new DiagnoseParser(this, prs);
diagnoseParser.diagnose(e.error_token);
}
return null;
}
public ErrorLocationInfo[] getErrors() {
return errors.toArray(new ErrorLocationInfo[errors.size()]);
}
private void resetErrors() {
errors.clear();
}
private final List<ErrorLocationInfo> errors = new LinkedList<ErrorLocationInfo>();
@Override
public void reportError(int errorCode, int leftToken, int errorToken, int rightToken, String errorInfo[]) {
StringBuilder sb = new StringBuilder("(");
sb.append(errorCode);
sb.append(") ");
if (errorInfo != null) {
for (int i = 0; i < errorInfo.length; i++) {
if (sb.length() > 0) {
sb.append("; ");
}
sb.append(errorInfo[i]);
}
}
errors.add(new ErrorLocationInfo(sb.toString(), getLine(leftToken), getColumn(leftToken), getEndLine(rightToken), getEndColumn(rightToken)));
}
private final XpandFactory xpandFactory;
/**
* A convenience method to obtain the text of a right hand side IToken.
*
* @param i
* the right hand side token index
* @result the text of the correspondent right hand side IToken.
*
* @since 3.0
*/
protected String getRhsTokenText(int i) {
return this.getTokenText(getRhsTokenIndex(i));
}
@SuppressWarnings("unchecked")
private static final EList ourEmptyEList = new BasicEList.UnmodifiableEList(0, new Object[0]);
private void diagnozeErrorToken(int token_index) {
// IToken token = getIToken(token_index);
// if (token instanceof lpg.runtime.ErrorToken) {
// token = ((lpg.runtime.ErrorToken) token).getErrorToken();
// }
// reportError(lpg.runtime.ParseErrorCodes.MISPLACED_CODE,
// token.getTokenIndex(), token.getTokenIndex(),
// "'" +
// token.toString() + "'");
this.reset(token_index); // point to error token
DiagnoseParser diagnoseParser = new DiagnoseParser(this, prs);
diagnoseParser.diagnose(token_index);
setResult(null);
}
private ImperativeIterateExpCS createImperativeIterateExpCS(SimpleNameCS simpleNameCS, EList<VariableCS> iterators, VariableCS target, OCLExpressionCS body, OCLExpressionCS condition) {
ImperativeIterateExpCS result = org.eclipse.m2m.internal.qvt.oml.cst.CSTFactory.eINSTANCE.createImperativeIterateExpCS();
result.setSimpleNameCS(simpleNameCS);
if (iterators.size() > 0) {
result.setVariable1(iterators.get(0));
if (iterators.size() > 1) {
result.setVariable2(iterators.get(1));
}
}
if (target != null) {
result.setTarget(target);
}
result.setBody(body);
result.setCondition(condition);
return result;
}
protected final CSTNode createCompleteSignatureCS(SimpleSignatureCS simpleSignatureCS, EList<ParameterDeclarationCS> resultList) {
CompleteSignatureCS result = org.eclipse.m2m.internal.qvt.oml.cst.CSTFactory.eINSTANCE.createCompleteSignatureCS();
result.setSimpleSignature(simpleSignatureCS);
result.getResultParams().addAll(resultList);
return result;
}
protected final SimpleSignatureCS createSimpleSignatureCS(EList<ParameterDeclarationCS> paramsCS) {
SimpleSignatureCS result = org.eclipse.m2m.internal.qvt.oml.cst.CSTFactory.eINSTANCE.createSimpleSignatureCS();
result.getParams().addAll(paramsCS);
return result;
}
protected final ParameterDeclarationCS createParameterDeclarationCS(DirectionKindCS sym, IToken tokenText, TypeSpecCS typeSpecCS) {
ParameterDeclarationCS result = org.eclipse.m2m.internal.qvt.oml.cst.CSTFactory.eINSTANCE.createParameterDeclarationCS();
SimpleNameCS nameCS = null;
if (tokenText != null) {
nameCS = createSimpleNameCS(SimpleTypeEnum.IDENTIFIER_LITERAL, tokenText.toString());
setOffsets(nameCS, tokenText);
} else {
//nameCS = createSimpleNameCS(SimpleTypeEnum.IDENTIFIER_LITERAL, ""); //$NON-NLS-1
}
result.setSimpleNameCS(nameCS);
result.setTypeSpecCS(typeSpecCS);
if (sym != null) {
result.setDirectionKind(sym.getDirectionKind());
}
return result;
}
protected final CSTNode createLibraryImportCS(PathNameCS sym) {
LibraryImportCS imp = org.eclipse.m2m.internal.qvt.oml.cst.CSTFactory.eINSTANCE.createLibraryImportCS();
imp.setPathNameCS(sym);
return imp;
}
protected final CSTNode createDirectionKindCS(DirectionKindEnum kind) {
DirectionKindCS result = org.eclipse.m2m.internal.qvt.oml.cst.CSTFactory.eINSTANCE.createDirectionKindCS();
result.setDirectionKind(kind);
return result;
}
protected final TypeSpecCS createTypeSpecCS(TypeCS typeCS, IToken extentLocation) {
TypeSpecCS result = org.eclipse.m2m.internal.qvt.oml.cst.CSTFactory.eINSTANCE.createTypeSpecCS();
result.setTypeCS(typeCS);
setOffsets(result, typeCS);
if (extentLocation != null) {
SimpleNameCS nameCS = createSimpleNameCS(SimpleTypeEnum.IDENTIFIER_LITERAL, extentLocation.toString());
setOffsets(nameCS, extentLocation);
result.setSimpleNameCS(nameCS);
result.setEndOffset(extentLocation.getEndOffset());
}
return result;
}
private ListTypeCS createListTypeCS(TypeCS typeCS) {
ListTypeCS result = org.eclipse.m2m.internal.qvt.oml.cst.CSTFactory.eINSTANCE.createListTypeCS();
result.setTypeCS(typeCS);
return result;
}
private DictLiteralExpCS createDictLiteralExpCS(EList<DictLiteralPartCS> parts) {
DictLiteralExpCS result = org.eclipse.m2m.internal.qvt.oml.cst.CSTFactory.eINSTANCE.createDictLiteralExpCS();
result.getParts().addAll(parts);
return result;
}
private DictionaryTypeCS createDictTypeCS(TypeCS keyTypeCS, TypeCS valueTypeCS) {
DictionaryTypeCS result = org.eclipse.m2m.internal.qvt.oml.cst.CSTFactory.eINSTANCE.createDictionaryTypeCS();
result.setKey(keyTypeCS);
result.setValue(valueTypeCS);
return result;
}
private DictLiteralPartCS createDictLiteralPartCS(LiteralExpCS keyLiteralCS, OCLExpressionCS valueExpCS) {
DictLiteralPartCS result = org.eclipse.m2m.internal.qvt.oml.cst.CSTFactory.eINSTANCE.createDictLiteralPartCS();
result.setKey(keyLiteralCS);
result.setValue(valueExpCS);
return result;
}
private final StatementCS createBreakCS() {
StatementCS result = org.eclipse.m2m.internal.qvt.oml.cst.CSTFactory.eINSTANCE.createBreakExpCS();
return result;
}
private final StatementCS createContinueCS() {
StatementCS result = org.eclipse.m2m.internal.qvt.oml.cst.CSTFactory.eINSTANCE.createContinueExpCS();
return result;
}
private ListLiteralExpCS createListLiteralExpCS(EList<CollectionLiteralPartCS> collectionLiteralParts) {
ListLiteralExpCS result = org.eclipse.m2m.internal.qvt.oml.cst.CSTFactory.eINSTANCE.createListLiteralExpCS();
result.getCollectionLiteralParts().addAll(collectionLiteralParts);
return result;
}
private boolean isTokenOfType(IToken token, int kind) {
return (token != null) && (token.getKind() == kind);
}
private ImperativeOperationCallExpCS createFeatureFQNOperationCallExpCS(SimpleNameCS moduleName, SimpleNameCS operationName, EList<OCLExpressionCS> arguments) {
ImperativeOperationCallExpCS result = org.eclipse.m2m.internal.qvt.oml.cst.CSTFactory.eINSTANCE.createImperativeOperationCallExpCS();
return setupImperativeOperationCallExpCS(moduleName, operationName, arguments, result);
}
private OperationCallExpCS createDotOperationCallExpCS(OCLExpressionCS oclExpressionCS, PathNameCS pathNameCs, SimpleNameCS simpleNameCS, IsMarkedPreCS isMarkedPreCS,
EList<OCLExpressionCS> arguments) {
if (pathNameCs != null && pathNameCs.getSimpleNames().size() == 1) {
ImperativeOperationCallExpCS result = createFeatureFQNOperationCallExpCS(pathNameCs.getSimpleNames().get(0), simpleNameCS, arguments);
if (oclExpressionCS != null) {
result.setSource(oclExpressionCS);
result.setIsAtomic(true);
}
result.setAccessor(oclExpressionCS != null ? DotOrArrowEnum.DOT_LITERAL : DotOrArrowEnum.NONE_LITERAL);
if (isAtPre(isMarkedPreCS)) {
result.setIsMarkedPreCS(isMarkedPreCS);
}
return result;
}
OperationCallExpCS result = createOperationCallExpCS(oclExpressionCS, DotOrArrowEnum.DOT_LITERAL, pathNameCs, simpleNameCS, isMarkedPreCS, arguments);
if (oclExpressionCS != null) {
result.setIsAtomic(true);
}
return result;
}
private ImperativeOperationCallExpCS setupImperativeOperationCallExpCS(SimpleNameCS moduleName, SimpleNameCS operationName, EList<OCLExpressionCS> arguments, ImperativeOperationCallExpCS result) {
result.setModule(moduleName);
result.setSimpleNameCS(operationName);
result.getArguments().addAll(arguments);
return result;
}
protected VariableCS createVariableCS(IToken token, TypeCS typeCS, OCLExpressionCS oclExpressionCS) {
VariableCS result = CSTFactory.eINSTANCE.createVariableCS();
result.setName(unSingleQuote(token));
result.setTypeCS(typeCS);
result.setInitExpression(oclExpressionCS);
return result;
}
private OperationCallExpCS createArrowOperationCallExpCS(OCLExpressionCS oclExpressionCS, SimpleNameCS simpleNameCS, IsMarkedPreCS isMarkedPreCS, EList<OCLExpressionCS> arguments) {
return createOperationCallExpCS(oclExpressionCS, DotOrArrowEnum.ARROW_LITERAL, null, simpleNameCS, isMarkedPreCS, arguments);
}
private OperationCallExpCS createOperationCallExpCS(OCLExpressionCS oclExpressionCS, DotOrArrowEnum dotOrArrow, PathNameCS pathNameCS, SimpleNameCS simpleNameCS, IsMarkedPreCS isMarkedPreCS,
EList<OCLExpressionCS> arguments) {
OperationCallExpCS result = CSTFactory.eINSTANCE.createOperationCallExpCS();
result.setSource(oclExpressionCS);
result.setAccessor(oclExpressionCS != null ? dotOrArrow : DotOrArrowEnum.NONE_LITERAL);
result.setPathNameCS((pathNameCS != null) && (pathNameCS.getSimpleNames().size() > 0) ? pathNameCS : null);
result.setSimpleNameCS(simpleNameCS);
result.getArguments().addAll(arguments);
if (isAtPre(isMarkedPreCS)) {
result.setIsMarkedPreCS(isMarkedPreCS);
}
return result;
}
private OperationCallExpCS createOperationCallExpCS(OCLExpressionCS oclExpressionCS, SimpleNameCS simpleNameCS, EList<OCLExpressionCS> arguments) {
return createOperationCallExpCS(oclExpressionCS, null, null, simpleNameCS, null, arguments);
}
private VariableExpCS createVariableExpCS(SimpleNameCS simpleNameCS, EList<OCLExpressionCS> arguments, IsMarkedPreCS isMarkedPreCS) {
VariableExpCS result = CSTFactory.eINSTANCE.createVariableExpCS();
result.setSimpleNameCS(simpleNameCS);
result.getArguments().addAll(arguments);
result.setIsMarkedPreCS(isMarkedPreCS);
return result;
}
private SimpleNameCS createSimpleNameCS(SimpleTypeEnum type, String value) {
SimpleNameCS result = CSTFactory.eINSTANCE.createSimpleNameCS();
result.setType(type);
result.setValue(unquote(value));
return result;
}
private PrimitiveTypeCS createPrimitiveTypeCS(SimpleTypeEnum type, String value) {
PrimitiveTypeCS result = CSTFactory.eINSTANCE.createPrimitiveTypeCS();
result.setType(type);
result.setValue(value);
return result;
}
private PathNameCS createPathNameCS(SimpleNameCS name) {
PathNameCS result = CSTFactory.eINSTANCE.createPathNameCS();
result.getSimpleNames().add(name);
return result;
}
private PathNameCS extendPathNameCS(PathNameCS path, SimpleNameCS name) {
path.getSimpleNames().add(name);
return path;
}
private CollectionLiteralExpCS createCollectionLiteralExpCS(CollectionTypeCS typeCS, EList<CollectionLiteralPartCS> collectionLiteralParts) {
CollectionLiteralExpCS result = CSTFactory.eINSTANCE.createCollectionLiteralExpCS();
result.setCollectionType(typeCS.getCollectionTypeIdentifier());
result.getCollectionLiteralParts().addAll(collectionLiteralParts);
return result;
}
private CollectionLiteralPartCS createCollectionLiteralPartCS(OCLExpressionCS oclExpressionCS) {
CollectionLiteralPartCS result = CSTFactory.eINSTANCE.createCollectionLiteralPartCS();
result.setExpressionCS(oclExpressionCS);
return result;
}
private CollectionRangeCS createCollectionRangeCS(OCLExpressionCS oclExpressionCS, OCLExpressionCS lastOCLExpressionCS) {
CollectionRangeCS result = CSTFactory.eINSTANCE.createCollectionRangeCS();
result.setExpressionCS(oclExpressionCS);
result.setLastExpressionCS(lastOCLExpressionCS);
return result;
}
private TupleLiteralExpCS createTupleLiteralExpCS(EList<VariableCS> variables) {
TupleLiteralExpCS result = CSTFactory.eINSTANCE.createTupleLiteralExpCS();
result.getVariables().addAll(variables);
return result;
}
private IntegerLiteralExpCS createIntegerLiteralExpCS(String string) {
IntegerLiteralExpCS result = CSTFactory.eINSTANCE.createIntegerLiteralExpCS();
result.setSymbol(string);
result.setIntegerSymbol(Integer.valueOf(string));
return result;
}
@SuppressWarnings("nls")
private UnlimitedNaturalLiteralExpCS createUnlimitedNaturalLiteralExpCS(String string) {
UnlimitedNaturalLiteralExpCS result = CSTFactory.eINSTANCE.createUnlimitedNaturalLiteralExpCS();
result.setSymbol(string);
if ("*".equals(string)) {
result.setIntegerSymbol(-1);
} else {
result.setIntegerSymbol(Integer.valueOf(string));
}
return result;
}
private RealLiteralExpCS createRealLiteralExpCS(String string) {
RealLiteralExpCS result = CSTFactory.eINSTANCE.createRealLiteralExpCS();
result.setSymbol(string);
result.setRealSymbol(Double.valueOf(string));
return result;
}
private BooleanLiteralExpCS createBooleanLiteralExpCS(String string) {
BooleanLiteralExpCS result = CSTFactory.eINSTANCE.createBooleanLiteralExpCS();
result.setSymbol(string);
result.setBooleanSymbol(Boolean.valueOf(string));
return result;
}
private NullLiteralExpCS createNullLiteralExpCS(String string) {
NullLiteralExpCS result = CSTFactory.eINSTANCE.createNullLiteralExpCS();
result.setValue(string);
result.setType(SimpleTypeEnum.KEYWORD_LITERAL);
return result;
}
private InvalidLiteralExpCS createInvalidLiteralExpCS(String string) {
InvalidLiteralExpCS result = CSTFactory.eINSTANCE.createInvalidLiteralExpCS();
result.setValue(string);
result.setType(SimpleTypeEnum.KEYWORD_LITERAL);
return result;
}
protected IteratorExpCS createIteratorExpCS(OCLExpressionCS source, SimpleNameCS simpleNameCS, VariableCS variable1, VariableCS variable2, OCLExpressionCS oclExpressionCS) {
IteratorExpCS result = CSTFactory.eINSTANCE.createIteratorExpCS();
result.setSource(source);
result.setAccessor(DotOrArrowEnum.ARROW_LITERAL);
result.setSimpleNameCS(simpleNameCS);
result.setVariable1(variable1);
result.setVariable2(variable2);
result.setBody(oclExpressionCS);
return result;
}
protected IterateExpCS createIterateExpCS(OCLExpressionCS source, SimpleNameCS simpleNameCS, VariableCS variable1, VariableCS variable2, OCLExpressionCS oclExpressionCS) {
IterateExpCS result = CSTFactory.eINSTANCE.createIterateExpCS();
result.setSource(source);
result.setAccessor(DotOrArrowEnum.ARROW_LITERAL);
result.setSimpleNameCS(simpleNameCS);
result.setVariable1(variable1);
result.setVariable2(variable2);
result.setBody(oclExpressionCS);
return result;
}
private VariableCS createVariableCS(String varName, TypeCS typeCS, OCLExpressionCS oclExpressionCS) {
VariableCS result = CSTFactory.eINSTANCE.createVariableCS();
result.setName(unquote(varName));
result.setTypeCS(typeCS);
result.setInitExpression(oclExpressionCS);
return result;
}
private VariableCS createVariableCS(SimpleNameCS varName, TypeCS typeCS, OCLExpressionCS oclExpressionCS) {
VariableCS result = CSTFactory.eINSTANCE.createVariableCS();
result.setName(unquote(varName.getValue()));
result.setTypeCS(typeCS);
result.setInitExpression(oclExpressionCS);
return result;
}
protected CollectionTypeCS createCollectionTypeCS(CollectionTypeIdentifierEnum collectionType, String value) {
CollectionTypeCS result = CSTFactory.eINSTANCE.createCollectionTypeCS();
result.setType(SimpleTypeEnum.IDENTIFIER_LITERAL);
result.setValue(unquote(value));
result.setCollectionTypeIdentifier(collectionType);
return result;
}
private TupleTypeCS createTupleTypeCS(EList<VariableCS> variables) {
TupleTypeCS result = CSTFactory.eINSTANCE.createTupleTypeCS();
result.getVariables().addAll(variables);
return result;
}
private FeatureCallExpCS createFeatureCallExpCS(OCLExpressionCS source, PathNameCS pathNameCS, SimpleNameCS simpleNameCS, EList<OCLExpressionCS> arguments, IsMarkedPreCS isMarkedPreCS) {
FeatureCallExpCS result = CSTFactory.eINSTANCE.createFeatureCallExpCS();
result.setSource(source);
result.setAccessor(source != null ? DotOrArrowEnum.DOT_LITERAL : DotOrArrowEnum.NONE_LITERAL);
result.setPathNameCS((pathNameCS != null) && (pathNameCS.getSimpleNames().size() > 0) ? pathNameCS : null);
result.setSimpleNameCS(simpleNameCS);
result.getArguments().addAll(arguments);
if (isAtPre(isMarkedPreCS)) {
result.setIsMarkedPreCS(isMarkedPreCS);
}
return result;
}
private LetExpCS createLetExpCS(EList<VariableCS> variables, OCLExpressionCS oclExpressionCS) {
LetExpCS result = CSTFactory.eINSTANCE.createLetExpCS();
result.getVariables().addAll(variables);
result.setInExpression(oclExpressionCS);
return result;
}
private IfExpCS createIfExpCS(OCLExpressionCS condition, OCLExpressionCS thenExpression, OCLExpressionCS elseExpression) {
IfExpCS result = CSTFactory.eINSTANCE.createIfExpCS();
result.setCondition(condition);
result.setThenExpression(thenExpression);
result.setElseExpression(elseExpression);
return result;
}
protected SimpleNameCS createConceptualOperationNameCS(IToken token) {
SimpleNameCS result = CSTFactory.eINSTANCE.createSimpleNameCS();
result.setType(SimpleTypeEnum.KEYWORD_LITERAL);
String conceptualName = token.toString();
result.setValue(conceptualName);
ProblemHandler.Severity sev = ProblemHandler.Severity.OK;
/*
* [AS]: TODO log error here
*
* BasicEnvironment benv = getEnvironment(); if (benv != null) { sev =
* benv.getValue(ProblemOption.CONCEPTUAL_OPERATION_NAME); }
*
* if ((sev != null) && (sev != ProblemHandler.Severity.OK)) {
* benv.problem(sev, ProblemHandler.Phase.PARSER, OCLMessages
* .bind(OCLMessages.Conceptual_Operation_Name_, conceptualName),
* "unquote", //-NLS-1 token); }
*/
return result;
}
protected SimpleNameCS createSimpleNameCS(SimpleTypeEnum type, IToken token) {
SimpleNameCS result = CSTFactory.eINSTANCE.createSimpleNameCS();
result.setType(type);
result.setValue(unDoubleQuote(token));
return result;
}
protected StringLiteralExpCS createStringLiteralExpCS(IToken token) {
StringLiteralExpCS result = CSTFactory.eINSTANCE.createStringLiteralExpCS();
String unquoted = unSingleQuote(token);
result.setSymbol(unquoted);
result.setStringSymbol(unquoted);
result.setUnescapedStringSymbol(unquoted);
return result;
}
protected StringLiteralExpCS extendStringLiteralExpCS(StringLiteralExpCS string, IToken token) {
String oldString = string.getUnescapedStringSymbol();
String newString = unSingleQuote(token);
int oldFinish = string.getEndOffset();
int newStart = token.getStartOffset();
String joinedString;
if (newStart - oldFinish > 1) {
joinedString = oldString + newString;
} else {
joinedString = oldString + '\'' + newString;
/*
* [AS]: TODO log error here ProblemHandler.Severity sev =
* getEnvironment().getValue(
* ProblemOption.STRING_SINGLE_QUOTE_ESCAPE); if ((sev != null) &&
* (sev != ProblemHandler.Severity.OK)) { getEnvironment().problem(
* sev, ProblemHandler.Phase.PARSER,
* OCLMessages.bind(OCLMessages.NonStd_SQuote_Escape_,
* joinedString), "STRING_LITERAL", //-NLS-1 joinedString); }
*/
}
string.setSymbol(joinedString);
string.setStringSymbol(joinedString);
string.setUnescapedStringSymbol(joinedString);
return string;
}
protected Set<String> iteratorNames = null;
@SuppressWarnings("nls")
protected Set<String> createIteratorNames() {
Set<String> iteratorNames = new HashSet<String>();
iteratorNames.add("any");
iteratorNames.add("collect");
iteratorNames.add("collectNested");
iteratorNames.add("exists");
iteratorNames.add("forAll");
iteratorNames.add("isUnique");
iteratorNames.add("one");
iteratorNames.add("reject");
iteratorNames.add("select");
iteratorNames.add("sortedBy");
iteratorNames.add("closure");
return iteratorNames;
}
protected boolean isIterator(String name) {
if (iteratorNames == null) {
iteratorNames = createIteratorNames();
}
return iteratorNames.contains(name);
}
/**
* Sets the start and end offsets of the given <code>CSTNode</code> to the
* start and end offsets of the given <code>IToken</code>
*
* @param cstNode
* <code>CSTNode</code> to set offsets
* @param startEnd
* <code>IToken</code> to retrieve offsets from
*/
private void setOffsets(CSTNode cstNode, IToken startEnd) {
cstNode.setStartOffset(startEnd.getStartOffset());
cstNode.setEndOffset(startEnd.getEndOffset());
}
/**
* Sets the start and end offsets of the given <code>CSTNode</code> to the
* start and end offsets of the 2nd given <code>CSTNode</code>
*
* @param cstNode
* <code>CSTNode</code> to set offsets
* @param startEnd
* <code>CSTNode</code> to retrieve offsets from
*/
private void setOffsets(CSTNode cstNode, CSTNode startEnd) {
cstNode.setStartOffset(startEnd.getStartOffset());
cstNode.setEndOffset(startEnd.getEndOffset());
}
/**
* Sets the start and end offsets of the given <code>CSTNode</code> to the
* start offset of the 2nd given <code>CSTNode</code> and the end offset of
* the 3rd given <code>CSTNode</code>
*
* @param cstNode
* <code>CSTNode</code> to set offsets
* @param start
* <code>CSTNode</code> to retrieve start offset from
* @param end
* <code>CSTNode</code> to retrieve end offset from
*/
private void setOffsets(CSTNode cstNode, CSTNode start, CSTNode end) {
cstNode.setStartOffset(start.getStartOffset());
cstNode.setEndOffset(end.getEndOffset());
}
/**
* Sets the start and end offsets of the given <code>CSTNode</code> to the
* start offset of the 2nd given <code>CSTNode</code> and the end offset of
* the given <code>IToken</code>
*
* @param cstNode
* <code>CSTNode</code> to set offsets
* @param start
* <code>CSTNode</code> to retrieve start offset from
* @param end
* <code>IToken</code> to retrieve end offset from
*/
private void setOffsets(CSTNode cstNode, CSTNode start, IToken end) {
cstNode.setStartOffset(start.getStartOffset());
cstNode.setEndOffset(end.getEndOffset());
}
/**
* Sets the start and end offsets of the given <code>CSTNode</code> to the
* start offset of the given <code>IToken</code> and the end offset of the
* 2nd given <code>CSTNode</code>
*
* @param cstNode
* <code>CSTNode</code> to set offsets
* @param start
* <code>IToken</code> to retrieve start offset from
* @param end
* <code>CSTNode</code> to retrieve end offset from
*/
private void setOffsets(CSTNode cstNode, IToken start, CSTNode end) {
cstNode.setStartOffset(start.getStartOffset());
cstNode.setEndOffset(end.getEndOffset());
}
/**
* Sets the start and end offsets of the given <code>CSTNode</code> to the
* start offset of the 1std given <code>IToken</code> and the end offset of
* the 2nd given <code>IToken</code>
*
* @param cstNode
* <code>CSTNode</code> to set offsets
* @param start
* <code>IToken</code> to retrieve start offset from
* @param end
* <code>IToken</code> to retrieve end offset from
*/
private void setOffsets(CSTNode cstNode, IToken start, IToken end) {
cstNode.setStartOffset(start.getStartOffset());
cstNode.setEndOffset(end.getEndOffset());
}
/**
* Removes the "s surrounding a quoted string, if any.
*
* @param quoted
* a possibly quoted string
* @return <code>quoted</code> without the surrounding quotes, or just
* <code>quoted</code> verbatim if there were none
*/
private String unquote(String quoted) {
String result = quoted;
if ((result != null) && (result.length() > 1)) {
int max = result.length() - 1;
if ((result.charAt(0) == '"') && (quoted.charAt(max) == '"')) {
result = result.substring(1, max);
}
// this is a regexp, so the backslash needs to be
// re-escaped, thus "\\" is rendered in a Java
// string literal as "\\\\"
result = result.replaceAll("\\\\\"", "\""); // -NLS-2//-NLS-1
/*
* [artem] removed extra error handling fon non-spec escape
* processing
*/
}
return result;
}
private boolean isAtPre(IsMarkedPreCS atPreCS) {
return atPreCS != null;
}
protected String unDoubleQuote(IToken token) {
if (token == null) {
return null;
}
String quoted = token.toString();
if (quoted == null) {
return null;
}
int quotedLength = quoted.length();
if ((quotedLength < 2) || (quoted.charAt(0) != '"') || (quoted.charAt(quotedLength - 1) != '"')) {
return quoted;
}
ProblemHandler.Severity sev = ProblemHandler.Severity.OK;
/*
* BasicEnvironment benv = getEnvironment();
*
* if (benv != null) { sev = benv
* .getValue(ProblemOption.ELEMENT_NAME_QUOTE_ESCAPE); } if ((sev !=
* null) && (sev != ProblemHandler.Severity.OK)) { benv.problem(sev,
* ProblemHandler.Phase.PARSER, OCLMessages
* .bind(OCLMessages.NonStd_DQuote_Escape_, quoted), "unquote", //-NLS-1
* token); }
*/
return decodeString(token, quoted.substring(1, quotedLength - 1));
}
protected String unSingleQuote(IToken token) {
if (token == null) {
return null;
}
String quoted = token.toString();
if (quoted == null) {
return null;
}
int quotedLength = quoted.length();
if ((quotedLength < 2) || (quoted.charAt(0) != '\'') || (quoted.charAt(quotedLength - 1) != '\'')) {
return quoted;
}
String unquoted = quoted.substring(1, quotedLength - 1);
Boolean backslashProcessingEnabled = true;
/*
* BasicEnvironment benv = getEnvironment(); if (benv != null) {
* backslashProcessingEnabled = benv
* .getValue(ParsingOptions.USE_BACKSLASH_ESCAPE_PROCESSING); }
*/
if ((backslashProcessingEnabled == null) || !backslashProcessingEnabled) {
return unquoted;
}
return decodeString(token, unquoted);
}
protected String decodeString(IToken token, String string) {
if (string.indexOf('\\') < 0) {
return string;
}
StringBuffer s = new StringBuffer();
StringCharacterIterator i = new StringCharacterIterator(string);
for (char c = i.first(); c != StringCharacterIterator.DONE; c = i.next()) {
if (c != '\\') {
s.append(c);
} else {
int iStart = i.getIndex();
char ch = decodeEscapeSequence(i);
if (ch != StringCharacterIterator.DONE) {
s.append(ch);
} else {
/*
* [AS]: TODO: report error here
*
* BasicEnvironment benv = getEnvironment();
* benv.problem(ProblemHandler.Severity.ERROR,
* ProblemHandler.Phase.PARSER, OCLMessages
* .bind(OCLMessages.InvalidEscapeSequence_ERROR,
* string.substring(iStart, i.getIndex())), "unquote",
* //-NLS-1 token);
*/
return string;
}
}
}
return s.toString();
}
protected char decodeEscapeSequence(StringCharacterIterator i) {
int savedIndex = i.getIndex();
char c = i.next();
switch (c) {
case 'b':
return '\b';
case 'f':
return '\f';
case 't':
return '\t';
case 'n':
return '\n';
case 'r':
return '\r';
case '\\':
return '\\';
case '\'':
return '\'';
case '"':
return '\"';
case '0':
case '1':
case '2':
case '3': {
int c1 = c - '0';
int c2 = decodeOctalCharacter(i);
if (c2 < 0) {
return (char) (c1);
}
int c3 = decodeOctalCharacter(i);
if (c3 < 0) {
return (char) ((c1 << 3) + c2);
}
return (char) ((c1 << 6) + (c2 << 3) + c3);
}
case '4':
case '5':
case '6':
case '7': {
int c1 = c - '0';
int c2 = decodeOctalCharacter(i);
if (c2 < 0) {
i.previous();
return (char) (c1);
}
return (char) ((c1 << 3) + c2);
}
case 'x': {
int c1 = decodeHexCharacter(i.next());
int c2 = decodeHexCharacter(i.next());
if ((c1 < 0) || (c2 < 0)) {
break;
}
return (char) ((c1 << 4) + c2);
}
case 'u': {
int c1 = decodeHexCharacter(i.next());
int c2 = decodeHexCharacter(i.next());
int c3 = decodeHexCharacter(i.next());
int c4 = decodeHexCharacter(i.next());
if ((c1 < 0) || (c2 < 0) || (c3 < 0) || (c4 < 0)) {
break;
}
return (char) ((c1 << 12) + (c2 << 8) + (c3 << 4) + c4);
}
}
i.setIndex(savedIndex); // Give derived augmentations the same starting
// point
return StringCharacterIterator.DONE;
}
protected int decodeOctalCharacter(StringCharacterIterator i) {
char c = i.next();
if (c == StringCharacterIterator.DONE) {
return -1;
}
if (('0' <= c) && (c <= '7')) {
return c - '0';
}
i.previous();
return -1;
}
protected int decodeHexCharacter(char c) {
if (('0' <= c) && (c <= '9')) {
return c - '0';
}
if (('A' <= c) && (c <= 'F')) {
return 10 + c - 'A';
}
if (('a' <= c) && (c <= 'f')) {
return 10 + c - 'a';
}
return -1;
}
@SuppressWarnings("unchecked")
public void ruleAction(int ruleNumber) {
switch (ruleNumber) {
//
// Rule 16: conceptualOperationNameCS ::= conceptualOperationName
//
case 16: {
IToken iToken = getRhsIToken(1);
SimpleNameCS result = createConceptualOperationNameCS(iToken);
setOffsets(result, iToken);
setResult(result);
break;
}
//
// Rule 28: tupleKeywordCS ::= Tuple
//
case 28:
//
// Rule 32: selfKeywordCS ::= self
//
case 32: {
IToken iToken = getRhsIToken(1);
SimpleNameCS result = createSimpleNameCS(SimpleTypeEnum.SELF_LITERAL, iToken);
setOffsets(result, iToken);
setResult(result);
break;
}
//
// Rule 33: simpleNameCS ::= IDENTIFIER
//
case 33: {
IToken iToken = getRhsIToken(1);
SimpleNameCS result = createSimpleNameCS(SimpleTypeEnum.IDENTIFIER_LITERAL, iToken);
setOffsets(result, iToken);
setResult(result);
break;
}
//
// Rule 36: pathNameCS ::= simpleNameCS
//
case 36: {
SimpleNameCS simpleName = (SimpleNameCS) getRhsSym(1);
PathNameCS result = createPathNameCS(simpleName);
setOffsets(result, simpleName);
setResult(result);
break;
}
//
// Rule 37: pathNameCS ::= pathNameCS :: unreservedSimpleNameCS
//
case 37: {
PathNameCS result = (PathNameCS) getRhsSym(1);
SimpleNameCS simpleNameCS = (SimpleNameCS) getRhsSym(3);
result = extendPathNameCS(result, simpleNameCS);
setOffsets(result, result, simpleNameCS);
setResult(result);
break;
}
//
// Rule 38: primitiveTypeCS ::= Boolean
//
case 38: {
PrimitiveTypeCS result = createPrimitiveTypeCS(SimpleTypeEnum.BOOLEAN_LITERAL, getRhsTokenText(1));
setOffsets(result, getRhsIToken(1));
setResult(result);
break;
}
//
// Rule 39: primitiveTypeCS ::= Integer
//
case 39: {
PrimitiveTypeCS result = createPrimitiveTypeCS(SimpleTypeEnum.INTEGER_LITERAL, getRhsTokenText(1));
setOffsets(result, getRhsIToken(1));
setResult(result);
break;
}
//
// Rule 40: primitiveTypeCS ::= Real
//
case 40: {
PrimitiveTypeCS result = createPrimitiveTypeCS(SimpleTypeEnum.REAL_LITERAL, getRhsTokenText(1));
setOffsets(result, getRhsIToken(1));
setResult(result);
break;
}
//
// Rule 41: primitiveTypeCS ::= String
//
case 41: {
PrimitiveTypeCS result = createPrimitiveTypeCS(SimpleTypeEnum.STRING_LITERAL, getRhsTokenText(1));
setOffsets(result, getRhsIToken(1));
setResult(result);
break;
}
//
// Rule 42: primitiveTypeCS ::= UnlimitedNatural
//
case 42: {
PrimitiveTypeCS result = createPrimitiveTypeCS(SimpleTypeEnum.UNLIMITED_NATURAL_LITERAL, getRhsTokenText(1));
setOffsets(result, getRhsIToken(1));
setResult(result);
break;
}
//
// Rule 43: primitiveTypeCS ::= OclAny
//
case 43: {
PrimitiveTypeCS result = createPrimitiveTypeCS(SimpleTypeEnum.OCL_ANY_LITERAL, getRhsTokenText(1));
setOffsets(result, getRhsIToken(1));
setResult(result);
break;
}
//
// Rule 44: primitiveTypeCS ::= OclInvalid
//
case 44: {
PrimitiveTypeCS result = createPrimitiveTypeCS(SimpleTypeEnum.OCL_INVALID_LITERAL, getRhsTokenText(1));
setOffsets(result, getRhsIToken(1));
setResult(result);
break;
}
//
// Rule 45: primitiveTypeCS ::= OclVoid
//
case 45: {
PrimitiveTypeCS result = createPrimitiveTypeCS(SimpleTypeEnum.OCL_VOID_LITERAL, getRhsTokenText(1));
setOffsets(result, getRhsIToken(1));
setResult(result);
break;
}
//
// Rule 46: CollectionTypeIdentifierCS ::= Set
//
case 46: {
SimpleNameCS result = createCollectionTypeCS(CollectionTypeIdentifierEnum.SET_LITERAL, getRhsTokenText(1));
setOffsets(result, getRhsIToken(1));
setResult(result);
break;
}
//
// Rule 47: CollectionTypeIdentifierCS ::= Bag
//
case 47: {
SimpleNameCS result = createCollectionTypeCS(CollectionTypeIdentifierEnum.BAG_LITERAL, getRhsTokenText(1));
setOffsets(result, getRhsIToken(1));
setResult(result);
break;
}
//
// Rule 48: CollectionTypeIdentifierCS ::= Sequence
//
case 48: {
SimpleNameCS result = createCollectionTypeCS(CollectionTypeIdentifierEnum.SEQUENCE_LITERAL, getRhsTokenText(1));
setOffsets(result, getRhsIToken(1));
setResult(result);
break;
}
//
// Rule 49: CollectionTypeIdentifierCS ::= Collection
//
case 49: {
SimpleNameCS result = createCollectionTypeCS(CollectionTypeIdentifierEnum.COLLECTION_LITERAL, getRhsTokenText(1));
setOffsets(result, getRhsIToken(1));
setResult(result);
break;
}
//
// Rule 50: CollectionTypeIdentifierCS ::= OrderedSet
//
case 50: {
SimpleNameCS result = createCollectionTypeCS(CollectionTypeIdentifierEnum.ORDERED_SET_LITERAL, getRhsTokenText(1));
setOffsets(result, getRhsIToken(1));
setResult(result);
break;
}
//
// Rule 55: collectionTypeCS ::= CollectionTypeIdentifierCS ( typeCS
// )
//
case 55: {
CollectionTypeCS result = (CollectionTypeCS) getRhsSym(1);
result.setTypeCS((TypeCS) getRhsSym(3));
setOffsets(result, result, getRhsIToken(4));
setResult(result);
break;
}
//
// Rule 56: tupleTypeCS ::= Tuple ( tupleTypePartsCSopt )
//
case 56: {
TupleTypeCS result = createTupleTypeCS((EList<VariableCS>) getRhsSym(3));
setOffsets(result, getRhsIToken(1), getRhsIToken(4));
setResult(result);
break;
}
//
// Rule 57: tupleTypePartsCSopt ::= $Empty
//
case 57: {
setResult(new BasicEList<VariableCS>());
break;
}
//
// Rule 59: tupleTypePartsCS ::= typedUninitializedVariableCS
//
case 59: {
EList<VariableCS> result = new BasicEList<VariableCS>();
result.add((VariableCS) getRhsSym(1));
setResult(result);
break;
}
//
// Rule 60: tupleTypePartsCS ::= tupleTypePartsCS ,
// typedUninitializedVariableCS
//
case 60: {
EList<VariableCS> result = (EList<VariableCS>) getRhsSym(1);
result.add((VariableCS) getRhsSym(3));
setResult(result);
break;
}
//
// Rule 61: untypedUninitializedVariableCS ::= simpleNameCS
//
case 61: {
SimpleNameCS name = (SimpleNameCS) getRhsSym(1);
VariableCS result = createVariableCS(name, null, null);
setOffsets(result, name);
setResult(result);
break;
}
//
// Rule 62: typedUninitializedVariableCS ::= simpleNameCS : typeCS
//
case 62: {
SimpleNameCS name = (SimpleNameCS) getRhsSym(1);
TypeCS type = (TypeCS) getRhsSym(3);
VariableCS result = createVariableCS(name, type, null);
setOffsets(result, name, type);
setResult(result);
break;
}
//
// Rule 63: untypedInitializedVariableCS ::= simpleNameCS =
// OclExpressionCS
//
case 63: {
SimpleNameCS name = (SimpleNameCS) getRhsSym(1);
OCLExpressionCS initExpression = (OCLExpressionCS) getRhsSym(3);
VariableCS result = createVariableCS(name, null, initExpression);
setOffsets(result, name, initExpression);
setResult(result);
break;
}
//
// Rule 64: typedInitializedVariableCS ::= simpleNameCS : typeCS =
// OclExpressionCS
//
case 64: {
SimpleNameCS name = (SimpleNameCS) getRhsSym(1);
TypeCS type = (TypeCS) getRhsSym(3);
OCLExpressionCS initExpression = (OCLExpressionCS) getRhsSym(5);
VariableCS result = createVariableCS(name, type, initExpression);
setOffsets(result, name, initExpression);
setResult(result);
break;
}
//
// Rule 77: CollectionLiteralExpCS ::= CollectionTypeIdentifierCS {
// CollectionLiteralPartsCSopt }
//
case 77: {
CollectionTypeCS typeCS = (CollectionTypeCS) getRhsSym(1);
CollectionLiteralExpCS result = createCollectionLiteralExpCS(typeCS, (EList<CollectionLiteralPartCS>) getRhsSym(3));
setOffsets(result, typeCS, getRhsIToken(4));
setResult(result);
break;
}
//
// Rule 78: CollectionLiteralPartsCSopt ::= $Empty
//
case 78: {
setResult(new BasicEList<CollectionLiteralPartCS>());
break;
}
//
// Rule 80: CollectionLiteralPartsCS ::= CollectionLiteralPartCS
//
case 80: {
EList<CollectionLiteralPartCS> result = new BasicEList<CollectionLiteralPartCS>();
result.add((CollectionLiteralPartCS) getRhsSym(1));
setResult(result);
break;
}
//
// Rule 81: CollectionLiteralPartsCS ::= CollectionLiteralPartsCS ,
// CollectionLiteralPartCS
//
case 81: {
EList<CollectionLiteralPartCS> result = (EList<CollectionLiteralPartCS>) getRhsSym(1);
result.add((CollectionLiteralPartCS) getRhsSym(3));
setResult(result);
break;
}
//
// Rule 83: CollectionLiteralPartCS ::= OclExpressionCS
//
case 83: {
CollectionLiteralPartCS result = createCollectionLiteralPartCS((OCLExpressionCS) getRhsSym(1));
setOffsets(result, (CSTNode) getRhsSym(1));
setResult(result);
break;
}
//
// Rule 84: CollectionRangeCS ::= OclExpressionCS .. OclExpressionCS
//
case 84: {
CollectionLiteralPartCS result = createCollectionRangeCS((OCLExpressionCS) getRhsSym(1), (OCLExpressionCS) getRhsSym(3));
setOffsets(result, (CSTNode) getRhsSym(1), (CSTNode) getRhsSym(3));
setResult(result);
break;
}
//
// Rule 92: TupleLiteralExpCS ::= Tuple { TupleLiteralPartsCS }
//
case 92: {
TupleLiteralExpCS result = createTupleLiteralExpCS((EList<VariableCS>) getRhsSym(3));
setOffsets(result, getRhsIToken(1), getRhsIToken(4));
setResult(result);
break;
}
//
// Rule 93: TupleLiteralPartsCS ::= initializedVariableCS
//
case 93: {
EList<VariableCS> result = new BasicEList<VariableCS>();
result.add((VariableCS) getRhsSym(1));
setResult(result);
break;
}
//
// Rule 94: TupleLiteralPartsCS ::= TupleLiteralPartsCS ,
// initializedVariableCS
//
case 94: {
EList<VariableCS> result = (EList<VariableCS>) getRhsSym(1);
result.add((VariableCS) getRhsSym(3));
setResult(result);
break;
}
//
// Rule 95: IntegerLiteralExpCS ::= INTEGER_LITERAL
//
case 95: {
IntegerLiteralExpCS result = createIntegerLiteralExpCS(getRhsTokenText(1));
setOffsets(result, getRhsIToken(1));
setResult(result);
break;
}
//
// Rule 96: RealLiteralExpCS ::= REAL_LITERAL
//
case 96: {
RealLiteralExpCS result = createRealLiteralExpCS(getRhsTokenText(1));
setOffsets(result, getRhsIToken(1));
setResult(result);
break;
}
//
// Rule 97: StringLiteralExpCS ::= STRING_LITERAL
//
case 97: {
IToken literalToken = getRhsIToken(1);
StringLiteralExpCS result = createStringLiteralExpCS(literalToken);
setOffsets(result, literalToken);
setResult(result);
break;
}
//
// Rule 98: StringLiteralExpCS ::= StringLiteralExpCS STRING_LITERAL
//
case 98: {
StringLiteralExpCS string = (StringLiteralExpCS) getRhsSym(1);
IToken literalToken = getRhsIToken(2);
StringLiteralExpCS result = extendStringLiteralExpCS(string, literalToken);
setOffsets(result, string, literalToken);
setResult(result);
break;
}
//
// Rule 99: BooleanLiteralExpCS ::= true
//
case 99: {
BooleanLiteralExpCS result = createBooleanLiteralExpCS(getRhsTokenText(1));
setOffsets(result, getRhsIToken(1));
setResult(result);
break;
}
//
// Rule 100: BooleanLiteralExpCS ::= false
//
case 100: {
BooleanLiteralExpCS result = createBooleanLiteralExpCS(getRhsTokenText(1));
setOffsets(result, getRhsIToken(1));
setResult(result);
break;
}
//
// Rule 101: UnlimitedNaturalLiteralExpCS ::= *
//
case 101: {
UnlimitedNaturalLiteralExpCS result = createUnlimitedNaturalLiteralExpCS(getRhsTokenText(1));
setOffsets(result, getRhsIToken(1));
setResult(result);
break;
}
//
// Rule 102: InvalidLiteralExpCS ::= invalid
//
case 102: {
InvalidLiteralExpCS result = createInvalidLiteralExpCS(getRhsTokenText(1));
setOffsets(result, getRhsIToken(1));
setResult(result);
break;
}
//
// Rule 103: NullLiteralExpCS ::= null
//
case 103: {
NullLiteralExpCS result = createNullLiteralExpCS(getRhsTokenText(1));
setOffsets(result, getRhsIToken(1));
setResult(result);
break;
}
//
// Rule 104: TypeLiteralExpCS ::= primitiveTypeCS
//
case 104:
//
// Rule 105: TypeLiteralExpCS ::= collectionTypeCS
//
case 105:
//
// Rule 106: TypeLiteralExpCS ::= tupleTypeCS
//
case 106: {
SimpleNameCS simpleNameCS = (SimpleNameCS) getRhsSym(1);
VariableExpCS result = createVariableExpCS(simpleNameCS, new BasicEList<OCLExpressionCS>(), null);
setOffsets(result, simpleNameCS);
setResult(result);
break;
}
//
// Rule 111: IteratorExpCS ::= primaryExpCS -> simpleNameCS (
// uninitializedVariableCS | OclExpressionCS )
//
case 111: {
OCLExpressionCS source = (OCLExpressionCS) getRhsSym(1);
SimpleNameCS simpleNameCS = (SimpleNameCS) getRhsSym(3);
IteratorExpCS result = createIteratorExpCS(source, simpleNameCS, (VariableCS) getRhsSym(5), null, (OCLExpressionCS) getRhsSym(7));
setOffsets(result, source, getRhsIToken(8));
setResult(result);
break;
}
//
// Rule 112: IteratorExpCS ::= primaryExpCS -> simpleNameCS (
// simpleNameCS , uninitializedVariableCS | OclExpressionCS )
//
case 112: {
SimpleNameCS name = (SimpleNameCS) getRhsSym(5);
VariableCS variableCS = createVariableCS(name, null, null);
setOffsets(variableCS, name);
OCLExpressionCS source = (OCLExpressionCS) getRhsSym(1);
SimpleNameCS simpleNameCS = (SimpleNameCS) getRhsSym(3);
IteratorExpCS result = createIteratorExpCS(source, simpleNameCS, variableCS, (VariableCS) getRhsSym(7), (OCLExpressionCS) getRhsSym(9));
setOffsets(result, source, getRhsIToken(10));
setResult(result);
break;
}
//
// Rule 113: IteratorExpCS ::= primaryExpCS -> simpleNameCS (
// typedUninitializedVariableCS , uninitializedVariableCS |
// OclExpressionCS )
//
case 113: {
OCLExpressionCS source = (OCLExpressionCS) getRhsSym(1);
SimpleNameCS simpleNameCS = (SimpleNameCS) getRhsSym(3);
IteratorExpCS result = createIteratorExpCS(source, simpleNameCS, (VariableCS) getRhsSym(5), (VariableCS) getRhsSym(7), (OCLExpressionCS) getRhsSym(9));
setOffsets(result, source, getRhsIToken(10));
setResult(result);
break;
}
//
// Rule 114: IterateExpCS ::= primaryExpCS -> simpleNameCS (
// typedInitializedVariableCS | OclExpressionCS )
//
case 114: {
OCLExpressionCS source = (OCLExpressionCS) getRhsSym(1);
SimpleNameCS simpleNameCS = (SimpleNameCS) getRhsSym(3);
IterateExpCS result = createIterateExpCS(source, simpleNameCS, (VariableCS) getRhsSym(5), null, (OCLExpressionCS) getRhsSym(7));
setOffsets(result, source, getRhsIToken(8));
setResult(result);
break;
}
//
// Rule 115: IterateExpCS ::= primaryExpCS -> simpleNameCS (
// uninitializedVariableCS ; typedInitializedVariableCS |
// OclExpressionCS )
//
case 115: {
OCLExpressionCS source = (OCLExpressionCS) getRhsSym(1);
SimpleNameCS simpleNameCS = (SimpleNameCS) getRhsSym(3);
IterateExpCS result = createIterateExpCS(source, simpleNameCS, (VariableCS) getRhsSym(5), (VariableCS) getRhsSym(7), (OCLExpressionCS) getRhsSym(9));
setOffsets(result, source, getRhsIToken(10));
setResult(result);
break;
}
//
// Rule 119: OperationCallExpCS ::= primaryExpCS -> simpleNameCS ( )
//
case 119: {
OCLExpressionCS source = (OCLExpressionCS) getRhsSym(1);
OperationCallExpCS result = createArrowOperationCallExpCS(source, (SimpleNameCS) getRhsSym(3), null, new BasicEList<OCLExpressionCS>());
setOffsets(result, source, getRhsIToken(5));
setResult(result);
break;
}
//
// Rule 120: OperationCallExpCS ::= primaryExpCS -> simpleNameCS (
// OclExpressionCS )
//
case 120: {
OCLExpressionCS source = (OCLExpressionCS) getRhsSym(1);
SimpleNameCS simpleNameCS = (SimpleNameCS) getRhsSym(3);
OCLExpressionCS arg = (OCLExpressionCS) getRhsSym(5);
OCLExpressionCS result;
if (isIterator(simpleNameCS.getValue())) {
result = createIteratorExpCS(source, simpleNameCS, null, null, arg);
} else {
EList<OCLExpressionCS> args = new BasicEList<OCLExpressionCS>();
args.add(arg);
result = createArrowOperationCallExpCS(source, simpleNameCS, null, args);
}
setOffsets(result, source, getRhsIToken(6));
setResult(result);
break;
}
//
// Rule 121: OperationCallExpCS ::= primaryExpCS -> simpleNameCS (
// notNameExpressionCS , argumentsCS )
//
case 121: {
EList<OCLExpressionCS> args = (EList<OCLExpressionCS>) getRhsSym(7);
args.add(0, (OCLExpressionCS) getRhsSym(5));
OCLExpressionCS source = (OCLExpressionCS) getRhsSym(1);
OperationCallExpCS result = createArrowOperationCallExpCS(source, (SimpleNameCS) getRhsSym(3), null, args);
setOffsets(result, source, getRhsIToken(8));
setResult(result);
break;
}
//
// Rule 122: OperationCallExpCS ::= primaryExpCS -> simpleNameCS (
// simpleNameCS , argumentsCS )
//
case 122: {
SimpleNameCS simpleNameCS = (SimpleNameCS) getRhsSym(5);
OCLExpressionCS variableExpCS = createVariableExpCS(simpleNameCS, new BasicEList<OCLExpressionCS>(), null);
setOffsets(variableExpCS, simpleNameCS);
EList<OCLExpressionCS> args = (EList<OCLExpressionCS>) getRhsSym(7);
args.add(0, variableExpCS);
OCLExpressionCS source = (OCLExpressionCS) getRhsSym(1);
OperationCallExpCS result = createArrowOperationCallExpCS(source, (SimpleNameCS) getRhsSym(3), null, args);
setOffsets(result, source, getRhsIToken(8));
setResult(result);
break;
}
//
// Rule 123: OperationCallExpCS ::= primaryExpCS .
// conceptualOperationNameCS isMarkedPreCSopt ( argumentsCSopt )
//
case 123:
//
// Rule 124: OperationCallExpCS ::= primaryExpCS . simpleNameCS
// isMarkedPreCSopt ( argumentsCSopt )
//
case 124: {
SimpleNameCS simpleNameCS = (SimpleNameCS) getRhsSym(3);
OCLExpressionCS source = (OCLExpressionCS) getRhsSym(1);
CallExpCS result = createDotOperationCallExpCS(source, null, simpleNameCS, (IsMarkedPreCS) getRhsSym(4), (EList<OCLExpressionCS>) getRhsSym(6));
setOffsets(result, source, getRhsIToken(7));
setResult(result);
break;
}
//
// Rule 125: OperationCallExpCS ::= simpleNameCS isMarkedPreCSopt (
// argumentsCSopt )
//
case 125: {
OperationCallExpCS result = createDotOperationCallExpCS(null, null, (SimpleNameCS) getRhsSym(1), (IsMarkedPreCS) getRhsSym(2), (EList<OCLExpressionCS>) getRhsSym(4));
setOffsets(result, getRhsIToken(1), getRhsIToken(5));
setResult(result);
break;
}
//
// Rule 126: OperationCallExpCS ::= pathNameCS ::
// unreservedSimpleNameCS ( argumentsCSopt )
//
case 126: {
PathNameCS pathNameCS = (PathNameCS) getRhsSym(1);
SimpleNameCS simpleNameCS = (SimpleNameCS) getRhsSym(3);
OperationCallExpCS result = createDotOperationCallExpCS(null, pathNameCS, simpleNameCS, null, (EList<OCLExpressionCS>) getRhsSym(5));
setOffsets(result, pathNameCS, getRhsIToken(6));
setResult(result);
break;
}
//
// Rule 127: OperationCallExpCS ::= primaryExpCS . pathNameCS ::
// unreservedSimpleNameCS isMarkedPreCSopt ( argumentsCSopt )
//
case 127: {
PathNameCS pathNameCS = (PathNameCS) getRhsSym(3);
SimpleNameCS simpleNameCS = (SimpleNameCS) getRhsSym(5);
OCLExpressionCS source = (OCLExpressionCS) getRhsSym(1);
CallExpCS result = createDotOperationCallExpCS(source, pathNameCS, simpleNameCS, (IsMarkedPreCS) getRhsSym(6), (EList<OCLExpressionCS>) getRhsSym(8));
setOffsets(result, source, getRhsIToken(9));
setResult(result);
break;
}
//
// Rule 129: PropertyCallExpCS ::= pathNameCS ::
// unreservedSimpleNameCS isMarkedPreCSopt
//
case 129: {
PathNameCS pathNameCS = (PathNameCS) getRhsSym(1);
SimpleNameCS simpleNameCS = (SimpleNameCS) getRhsSym(3);
IsMarkedPreCS isMarkedPreCS = (IsMarkedPreCS) getRhsSym(4);
FeatureCallExpCS result = createFeatureCallExpCS(null, pathNameCS, simpleNameCS, new BasicEList<OCLExpressionCS>(), isMarkedPreCS);
if (isMarkedPreCS != null) {
setOffsets(result, pathNameCS, isMarkedPreCS);
} else {
setOffsets(result, pathNameCS, simpleNameCS);
}
setResult(result);
break;
}
//
// Rule 130: PropertyCallExpCS ::= primaryExpCS . pathNameCS ::
// unreservedSimpleNameCS isMarkedPreCSopt
//
case 130: {
OCLExpressionCS source = (OCLExpressionCS) getRhsSym(1);
PathNameCS pathNameCS = (PathNameCS) getRhsSym(3);
SimpleNameCS simpleNameCS = (SimpleNameCS) getRhsSym(5);
IsMarkedPreCS isMarkedPreCS = (IsMarkedPreCS) getRhsSym(6);
FeatureCallExpCS result = createFeatureCallExpCS(source, pathNameCS, simpleNameCS, new BasicEList<OCLExpressionCS>(), isMarkedPreCS);
if (isMarkedPreCS != null) {
setOffsets(result, source, isMarkedPreCS);
} else {
setOffsets(result, source, simpleNameCS);
}
setResult(result);
break;
}
//
// Rule 131: AssociationClassCallExpCS ::= primaryExpCS .
// simpleNameCS isMarkedPreCSopt
//
case 131: {
OCLExpressionCS source = (OCLExpressionCS) getRhsSym(1);
SimpleNameCS simpleNameCS = (SimpleNameCS) getRhsSym(3);
IsMarkedPreCS isMarkedPreCS = (IsMarkedPreCS) getRhsSym(4);
FeatureCallExpCS result = createFeatureCallExpCS(source, null, simpleNameCS, new BasicEList<OCLExpressionCS>(), isMarkedPreCS);
if (isMarkedPreCS != null) {
setOffsets(result, source, isMarkedPreCS);
} else {
setOffsets(result, source, simpleNameCS);
}
setResult(result);
break;
}
//
// Rule 132: isMarkedPreCSopt ::= $Empty
//
case 132: {
setResult(null);
break;
}
//
// Rule 133: argumentsCSopt ::= $Empty
//
case 133: {
setResult(new BasicEList<OCLExpressionCS>());
break;
}
//
// Rule 135: argumentsCS ::= OclExpressionCS
//
case 135: {
EList<OCLExpressionCS> result = new BasicEList<OCLExpressionCS>();
result.add((OCLExpressionCS) getRhsSym(1));
setResult(result);
break;
}
//
// Rule 136: argumentsCS ::= argumentsCS , OclExpressionCS
//
case 136: {
EList<OCLExpressionCS> result = (EList<OCLExpressionCS>) getRhsSym(1);
result.add((OCLExpressionCS) getRhsSym(3));
setResult(result);
break;
}
//
// Rule 139: VariableExpCS ::= selfKeywordCS
//
case 139: {
SimpleNameCS simpleNameCS = (SimpleNameCS) getRhsSym(1);
VariableExpCS result = createVariableExpCS(simpleNameCS, new BasicEList<OCLExpressionCS>(), null);
setOffsets(result, simpleNameCS);
setResult(result);
break;
}
//
// Rule 140: SimpleNameExpCS ::= simpleNameCS
//
case 140: {
SimpleNameCS simpleNameCS = (SimpleNameCS) getRhsSym(1);
VariableExpCS result = createVariableExpCS(simpleNameCS, new BasicEList<OCLExpressionCS>(), null);
setOffsets(result, simpleNameCS);
setResult(result);
break;
}
//
// Rule 146: impliesNotNameNotLetCS ::= impliesNotLetCS implies
// xorNotLetCS
//
case 146:
//
// Rule 148: impliesWithLetCS ::= impliesNotLetCS implies
// xorWithLetCS
//
case 148:
//
// Rule 152: xorNotNameNotLetCS ::= xorNotLetCS xor orNotLetCS
//
case 152:
//
// Rule 154: xorWithLetCS ::= xorNotLetCS xor orWithLetCS
//
case 154:
//
// Rule 158: orNotNameNotLetCS ::= orNotLetCS or andNotLetCS
//
case 158:
//
// Rule 160: orWithLetCS ::= orNotLetCS or andWithLetCS
//
case 160:
//
// Rule 164: andNotNameNotLetCS ::= andNotLetCS and equalityNotLetCS
//
case 164:
//
// Rule 166: andWithLetCS ::= andNotLetCS and equalityWithLetCS
//
case 166:
//
// Rule 170: equalityNotNameNotLetCS ::= equalityNotLetCS =
// relationalNotLetCS
//
case 170:
//
// Rule 171: equalityNotNameNotLetCS ::= equalityNotLetCS <>
// relationalNotLetCS
//
case 171:
//
// Rule 173: equalityWithLetCS ::= equalityNotLetCS =
// relationalWithLetCS
//
case 173:
//
// Rule 174: equalityWithLetCS ::= equalityNotLetCS <>
// relationalWithLetCS
//
case 174:
//
// Rule 178: relationalNotNameNotLetCS ::= relationalNotLetCS >
// additiveNotLetCS
//
case 178:
//
// Rule 179: relationalNotNameNotLetCS ::= relationalNotLetCS <
// additiveNotLetCS
//
case 179:
//
// Rule 180: relationalNotNameNotLetCS ::= relationalNotLetCS >=
// additiveNotLetCS
//
case 180:
//
// Rule 181: relationalNotNameNotLetCS ::= relationalNotLetCS <=
// additiveNotLetCS
//
case 181:
//
// Rule 183: relationalWithLetCS ::= relationalNotLetCS >
// additiveWithLetCS
//
case 183:
//
// Rule 184: relationalWithLetCS ::= relationalNotLetCS <
// additiveWithLetCS
//
case 184:
//
// Rule 185: relationalWithLetCS ::= relationalNotLetCS >=
// additiveWithLetCS
//
case 185:
//
// Rule 186: relationalWithLetCS ::= relationalNotLetCS <=
// additiveWithLetCS
//
case 186:
//
// Rule 190: additiveNotNameNotLetCS ::= additiveNotLetCS +
// multiplicativeNotLetCS
//
case 190:
//
// Rule 191: additiveNotNameNotLetCS ::= additiveNotLetCS -
// multiplicativeNotLetCS
//
case 191:
//
// Rule 193: additiveWithLetCS ::= additiveNotLetCS +
// multiplicativeWithLetCS
//
case 193:
//
// Rule 194: additiveWithLetCS ::= additiveNotLetCS -
// multiplicativeWithLetCS
//
case 194:
//
// Rule 198: multiplicativeNotNameNotLetCS ::=
// multiplicativeNotLetCS * unaryNotLetCS
//
case 198:
//
// Rule 199: multiplicativeNotNameNotLetCS ::=
// multiplicativeNotLetCS / unaryNotLetCS
//
case 199:
//
// Rule 201: multiplicativeWithLetCS ::= multiplicativeNotLetCS *
// unaryWithLetCS
//
case 201:
//
// Rule 202: multiplicativeWithLetCS ::= multiplicativeNotLetCS /
// unaryWithLetCS
//
case 202: {
SimpleNameCS simpleNameCS = createSimpleNameCS(SimpleTypeEnum.KEYWORD_LITERAL, getRhsIToken(2));
setOffsets(simpleNameCS, getRhsIToken(2));
OCLExpressionCS left = (OCLExpressionCS) getRhsSym(1);
OCLExpressionCS right = (OCLExpressionCS) getRhsSym(3);
EList<OCLExpressionCS> args = new BasicEList<OCLExpressionCS>();
args.add(right);
OperationCallExpCS result = createOperationCallExpCS(left, simpleNameCS, args);
setOffsets(result, left, right);
setResult(result);
break;
}
//
// Rule 206: unaryNotNameNotLetCS ::= - unaryNotLetCS
//
case 206:
//
// Rule 207: unaryNotNameNotLetCS ::= not unaryNotLetCS
//
case 207:
//
// Rule 209: unaryWithLetCS ::= - unaryWithLetCS
//
case 209:
//
// Rule 210: unaryWithLetCS ::= not unaryWithLetCS
//
case 210: {
SimpleNameCS simpleNameCS = createSimpleNameCS(SimpleTypeEnum.KEYWORD_LITERAL, getRhsIToken(1));
setOffsets(simpleNameCS, getRhsIToken(1));
OCLExpressionCS expr = (OCLExpressionCS) getRhsSym(2);
OperationCallExpCS result = createOperationCallExpCS(expr, simpleNameCS, new BasicEList<OCLExpressionCS>());
setOffsets(result, simpleNameCS, expr);
setResult(result);
break;
}
//
// Rule 217: primaryNotNameCS ::= ( OclExpressionCS )
//
case 217: {
OCLExpressionCS result = (OCLExpressionCS) getRhsSym(2);
if (result instanceof OperationCallExpCS) {
((OperationCallExpCS) result).setIsAtomic(true);
}
setOffsets(result, getRhsIToken(1), getRhsIToken(3));
setResult(result);
break;
}
//
// Rule 218: LetExpCS ::= let letVariablesCS in OclExpressionCS
//
case 218: {
OCLExpressionCS expr = (OCLExpressionCS) getRhsSym(4);
LetExpCS result = createLetExpCS((EList<VariableCS>) getRhsSym(2), expr);
setOffsets(result, getRhsIToken(1), expr);
setResult(result);
break;
}
//
// Rule 219: letVariablesCS ::= typedInitializedVariableCS
//
case 219: {
EList<VariableCS> result = new BasicEList<VariableCS>();
result.add((VariableCS) getRhsSym(1));
setResult(result);
break;
}
//
// Rule 220: letVariablesCS ::= letVariablesCS ,
// typedInitializedVariableCS
//
case 220: {
EList<VariableCS> result = (EList<VariableCS>) getRhsSym(1);
result.add((VariableCS) getRhsSym(3));
setResult(result);
break;
}
//
// Rule 222: listTypeCS ::= List ( typeCS )
//
case 222: {
CSTNode result = createListTypeCS((TypeCS) getRhsSym(3));
setOffsets(result, getRhsIToken(1), getRhsIToken(4));
setResult(result);
break;
}
//
// Rule 223: listLiteralCS ::= List { CollectionLiteralPartsCSopt }
//
case 223: {
CSTNode result = createListLiteralExpCS((EList) getRhsSym(3));
setOffsets(result, getRhsIToken(1), getRhsIToken(4));
setResult(result);
break;
}
//
// Rule 225: dictTypeCS ::= Dict ( typeCS , typeCS )
//
case 225: {
CSTNode result = createDictTypeCS((TypeCS) getRhsSym(3), (TypeCS) getRhsSym(5));
setOffsets(result, getRhsIToken(1), getRhsIToken(6));
setResult(result);
break;
}
//
// Rule 226: dictLiteralCS ::= Dict { dictLiteralPartListCSopt }
//
case 226: {
CSTNode result = createDictLiteralExpCS((EList<DictLiteralPartCS>) getRhsSym(3));
setOffsets(result, getRhsIToken(1), getRhsIToken(4));
setResult(result);
break;
}
//
// Rule 230: dictLiteralPartCS ::= literalSimpleCS = OclExpressionCS
//
case 230: {
CSTNode result = createDictLiteralPartCS((LiteralExpCS) getRhsSym(1), (OCLExpressionCS) getRhsSym(3));
setOffsets(result, getRhsIToken(1), getRhsIToken(3));
setResult(result);
break;
}
//
// Rule 232: dictLiteralPartListCSopt ::= $Empty
//
case 232:
setResult(new BasicEList<Object>());
break;
//
// Rule 233: dictLiteralPartListCS ::= dictLiteralPartCS
//
case 233: {
EList result = new BasicEList();
result.add(getRhsSym(1));
setResult(result);
break;
}
//
// Rule 234: dictLiteralPartListCS ::= dictLiteralPartListCS ,
// dictLiteralPartCS
//
case 234: {
EList result = (EList) getRhsSym(1);
result.add(getRhsSym(3));
setResult(result);
break;
}
//
// Rule 235: dictLiteralPartListCS ::= dictLiteralPartListCS
// qvtErrorToken
//
case 235: {
EList result = (EList) getRhsSym(1);
setResult(result);
break;
}
//
// Rule 236: IteratorExpCS ::= primaryExpCS -> simpleNameCS (
// qvtErrorToken
//
case 236: {
OCLExpressionCS source = (OCLExpressionCS) getRhsSym(1);
SimpleNameCS simpleNameCS = (SimpleNameCS) getRhsSym(3);
CSTNode result = createIteratorExpCS(source, simpleNameCS, null, null, null);
setOffsets(result, source, getRhsIToken(4));
setResult(result);
break;
}
//
// Rule 237: argumentsCS ::= qvtErrorToken
//
case 237:
setResult(new BasicEList<Object>());
break;
//
// Rule 240: IfExpCS ::= if OclExpressionCS then ifExpBodyCS else
// ifExpBodyCS endif
//
case 240: {
CSTNode result = createIfExpCS((OCLExpressionCS) getRhsSym(2), (OCLExpressionCS) getRhsSym(4), (OCLExpressionCS) getRhsSym(6));
setOffsets(result, getRhsIToken(1), getRhsIToken(7));
setResult(result);
break;
}
//
// Rule 241: IfExpCS ::= if OclExpressionCS then ifExpBodyCS endif
//
case 241: {
CSTNode result = createIfExpCS((OCLExpressionCS) getRhsSym(2), (OCLExpressionCS) getRhsSym(4), null);
setOffsets(result, getRhsIToken(1), getRhsIToken(5));
setResult(result);
break;
}
//
// Rule 242: IfExpCS ::= if OclExpressionCS then ifExpBodyCS else
// ifExpBodyCS qvtErrorToken
//
case 242: {
CSTNode result = createIfExpCS((OCLExpressionCS) getRhsSym(2), (OCLExpressionCS) getRhsSym(4), (OCLExpressionCS) getRhsSym(6));
setOffsets(result, getRhsIToken(1), (CSTNode) getRhsSym(6));
setResult(result);
break;
}
//
// Rule 243: IfExpCS ::= if OclExpressionCS then ifExpBodyCS else
// qvtErrorToken
//
case 243: {
CSTNode result = createIfExpCS((OCLExpressionCS) getRhsSym(2), (OCLExpressionCS) getRhsSym(4), null);
setOffsets(result, getRhsIToken(1), getRhsIToken(5));
setResult(result);
break;
}
//
// Rule 244: IfExpCS ::= if OclExpressionCS then ifExpBodyCS
// qvtErrorToken
//
case 244: {
CSTNode result = createIfExpCS((OCLExpressionCS) getRhsSym(2), (OCLExpressionCS) getRhsSym(4), null);
setOffsets(result, getRhsIToken(1), (CSTNode) getRhsSym(4));
setResult(result);
break;
}
//
// Rule 245: IfExpCS ::= if OclExpressionCS then qvtErrorToken
//
case 245: {
CSTNode result = createIfExpCS((OCLExpressionCS) getRhsSym(2), null, null);
setOffsets(result, getRhsIToken(1), getRhsIToken(3));
setResult(result);
break;
}
//
// Rule 246: IfExpCS ::= if OclExpressionCS qvtErrorToken
//
case 246: {
CSTNode result = createIfExpCS((OCLExpressionCS) getRhsSym(2), null, null);
setOffsets(result, getRhsIToken(1), (CSTNode) getRhsSym(2));
setResult(result);
break;
}
//
// Rule 247: IfExpCS ::= if qvtErrorToken
//
case 247: {
OCLExpressionCS invalidCondition = createInvalidLiteralExpCS("");
invalidCondition.setStartOffset(getRhsIToken(1).getEndOffset());
invalidCondition.setEndOffset(getRhsIToken(1).getEndOffset());
CSTNode result = createIfExpCS(invalidCondition, null, null);
setOffsets(result, getRhsIToken(1), getRhsIToken(1));
setResult(result);
break;
}
//
// Rule 248: IterateExpCS ::= primaryExpCS -> imperativeIterateExpCS
//
case 248: {
OCLExpressionCS source = (OCLExpressionCS) getRhsSym(1);
ImperativeIterateExpCS iterateExpCS = (ImperativeIterateExpCS) getRhsSym(3);
iterateExpCS.setSource(source);
setOffsets(iterateExpCS, source, iterateExpCS);
setResult(iterateExpCS);
break;
}
//
// Rule 257: imperativeIterateExpCS ::=
// imperativeIteratorExpCSToken12 ( imperativeIterContents12 )
//
case 257:
//
// Rule 258: imperativeIterateExpCS ::=
// imperativeIteratorExpCSToken3 ( imperativeIterContents3 )
//
case 258: {
String opCode = getRhsTokenText(1);
SimpleNameCS simpleNameCS = createSimpleNameCS(SimpleTypeEnum.KEYWORD_LITERAL, getRhsIToken(1));
setOffsets(simpleNameCS, getRhsIToken(1));
Object[] iterContents = (Object[]) getRhsSym(3);
OCLExpressionCS bodyCS = null;
OCLExpressionCS conditionCS = null;
if ("xcollect".equals(opCode) || "collectOne".equals(opCode)) {
bodyCS = (OCLExpressionCS) iterContents[2];
} else {
conditionCS = (OCLExpressionCS) iterContents[2];
}
CSTNode result = createImperativeIterateExpCS(simpleNameCS, (EList<VariableCS>) iterContents[0], (VariableCS) iterContents[1], bodyCS, conditionCS);
setOffsets(result, getRhsIToken(1), getRhsIToken(4));
setResult(result);
break;
}
//
// Rule 259: imperativeIterateExpCS ::= imperativeIteratorExpCSToken
// qvtErrorToken
//
case 259: {
SimpleNameCS simpleNameCS = createSimpleNameCS(SimpleTypeEnum.KEYWORD_LITERAL, getRhsIToken(1));
setOffsets(simpleNameCS, getRhsIToken(1));
CSTNode result = createImperativeIterateExpCS(simpleNameCS, ourEmptyEList, null, null, null);
setOffsets(result, getRhsIToken(1));
setResult(result);
break;
}
//
// Rule 260: imperativeIterContents12 ::= OclExpressionCS
//
case 260: {
setResult(new Object[] { ourEmptyEList, null, getRhsSym(1) });
break;
}
//
// Rule 261: imperativeIterContents12 ::= uninitializedVariableCS |
// OclExpressionCS
//
case 261: {
EList iters = new BasicEList();
iters.add(getRhsSym(1));
setResult(new Object[] { iters, null, getRhsSym(3) });
break;
}
//
// Rule 262: imperativeIterContents12 ::= simpleNameCS ,
// variableDeclarationListCS | OclExpressionCS
//
case 262: {
SimpleNameCS name = (SimpleNameCS) getRhsSym(1);
CSTNode variableCS = createVariableCS(name, null, null);
setOffsets(variableCS, name);
EList iters = (EList) getRhsSym(3);
iters.add(0, variableCS);
setResult(new Object[] { iters, null, getRhsSym(5) });
break;
}
//
// Rule 263: imperativeIterContents3 ::= variableDeclarationListCS ;
// initializedVariableCS | OclExpressionCS
//
case 263: {
setResult(new Object[] { getRhsSym(1), getRhsSym(3), getRhsSym(5) });
break;
}
//
// Rule 264: variableDeclarationListCS ::= uninitializedVariableCS
//
case 264: {
EList result = new BasicEList();
result.add(getRhsSym(1));
setResult(result);
break;
}
//
// Rule 265: variableDeclarationListCS ::= variableDeclarationListCS
// , uninitializedVariableCS
//
case 265: {
EList result = (EList) getRhsSym(1);
result.add(getRhsSym(3));
setResult(result);
break;
}
//
// Rule 266: exclamationOpt ::= $Empty
//
case 266:
setResult(null);
break;
//
// Rule 268: declarator_vsep ::= IDENTIFIER |
//
case 268: {
CSTNode result = createVariableCS(getRhsIToken(1), null, null);
setOffsets(result, getRhsIToken(1));
setResult(result);
break;
}
//
// Rule 269: declarator_vsepOpt ::= $Empty
//
case 269:
setResult(null);
break;
//
// Rule 271: IterateExpCS ::= primaryExpCS exclamationOpt [
// declarator_vsepOpt OclExpressionCS ]
//
case 271: {
OCLExpressionCS source = (OCLExpressionCS) getRhsSym(1);
if (source instanceof ImperativeIterateExpCS) {
String opCode = isTokenOfType(getRhsIToken(2), XpandParsersym.TK_EXCLAMATION_MARK) ? "collectselectOne" : "collectselect";
SimpleNameCS simpleNameCS = createSimpleNameCS(SimpleTypeEnum.KEYWORD_LITERAL, opCode);
setOffsets(simpleNameCS, getRhsIToken(3), getRhsIToken(6));
ImperativeIterateExpCS result = (ImperativeIterateExpCS) source;
result.setSimpleNameCS(simpleNameCS);
VariableCS variableCS = (VariableCS) getRhsSym(4);
if (variableCS != null) {
result.setTarget(variableCS);
}
result.setCondition((OCLExpressionCS) getRhsSym(5));
setOffsets(result, getRhsIToken(1), getRhsIToken(6));
setResult(result);
} else {
String opCode = isTokenOfType(getRhsIToken(2), XpandParsersym.TK_EXCLAMATION_MARK) ? "selectOne" : "xselect";
SimpleNameCS simpleNameCS = createSimpleNameCS(SimpleTypeEnum.KEYWORD_LITERAL, opCode);
setOffsets(simpleNameCS, getRhsIToken(3), getRhsIToken(6));
CallExpCS result = createImperativeIterateExpCS(simpleNameCS, ourEmptyEList, (VariableCS) getRhsSym(4), null, (OCLExpressionCS) getRhsSym(5));
result.setSource(source);
setOffsets(result, getRhsIToken(1), getRhsIToken(6));
setResult(result);
}
break;
}
//
// Rule 272: IterateExpCS ::= primaryExpCS -> simpleNameCS
//
case 272: {
String opCode = "xcollect";
SimpleNameCS simpleNameCS = createSimpleNameCS(SimpleTypeEnum.KEYWORD_LITERAL, opCode);
OCLExpressionCS source = (OCLExpressionCS) getRhsSym(1);
SimpleNameCS featureNameCS = (SimpleNameCS) getRhsSym(3);
OCLExpressionCS featureCallExpCS = createFeatureCallExpCS(source, null, featureNameCS, new BasicEList(), null);
setOffsets(featureCallExpCS, source, featureNameCS);
ImperativeIterateExpCS result = createImperativeIterateExpCS(simpleNameCS, ourEmptyEList, null, null, null);
result.setSource(featureCallExpCS);
setOffsets(result, getRhsIToken(1), getRhsIToken(3));
setResult(result);
break;
}
//
// Rule 273: primaryNotNameCS ::= break
//
case 273: {
OCLExpressionCS result = createBreakCS();
setOffsets(result, getRhsIToken(1));
setResult(result);
break;
}
//
// Rule 274: primaryNotNameCS ::= continue
//
case 274: {
OCLExpressionCS result = createContinueCS();
setOffsets(result, getRhsIToken(1));
setResult(result);
break;
}
//
// Rule 277: declarator1 ::= IDENTIFIER : typeCS
//
case 277: {
CSTNode result = createVariableCS(getRhsIToken(1), (TypeCS) getRhsSym(3), null);
setOffsets(result, getRhsIToken(1), (CSTNode) getRhsSym(3));
setResult(result);
break;
}
//
// Rule 278: declarator1 ::= IDENTIFIER : typeCS = OclExpressionCS
//
case 278: {
CSTNode result = createVariableCS(getRhsIToken(1), (TypeCS) getRhsSym(3), (OCLExpressionCS) getRhsSym(5));
setOffsets(result, getRhsIToken(1), (CSTNode) getRhsSym(5));
setResult(result);
break;
}
//
// Rule 279: declarator1 ::= IDENTIFIER : typeCS := OclExpressionCS
//
case 279: {
CSTNode result = createVariableCS(getRhsIToken(1), (TypeCS) getRhsSym(3), (OCLExpressionCS) getRhsSym(5));
setOffsets(result, getRhsIToken(1), (CSTNode) getRhsSym(5));
setResult(result);
break;
}
//
// Rule 280: declarator2 ::= IDENTIFIER := OclExpressionCS
//
case 280: {
CSTNode result = createVariableCS(getRhsIToken(1), null, (OCLExpressionCS) getRhsSym(3));
setOffsets(result, getRhsIToken(1), (CSTNode) getRhsSym(3));
setResult(result);
break;
}
//
// Rule 281: qvtErrorToken ::= ERROR_TOKEN
//
case 281: {
diagnozeErrorToken(getRhsTokenIndex(1));
break;
}
//
// Rule 282: template ::= emptyTemplate
//
case 282: {
setResult(xpandFactory.createTemplate(Collections.EMPTY_LIST, Collections.EMPTY_LIST, Collections.EMPTY_LIST, Collections.EMPTY_LIST, getRightIToken()));
break;
}
//
// Rule 285: template ::= LG commentTextPairAny imports
// extensionImports defineOrAroundSeq
//
case 285: {
List imports = (List) getRhsSym(3);
List extensionImports = (List) getRhsSym(4);
List defineOrAround = (List) getRhsSym(5);
List<Advice> advices = new LinkedList<Advice>();
List<Definition> defines = new LinkedList<Definition>();
for (Object o : defineOrAround) {
if (o instanceof Definition) {
defines.add((Definition) o);
} else if (o instanceof Advice) {
advices.add((Advice) o);
} else {
throw new IllegalStateException();// assert false?
}
}
setResult(xpandFactory.createTemplate(imports, extensionImports, defines, advices, getRightIToken()));
break;
}
//
// Rule 286: defineOrAroundSeq ::= define TEXT commentTextPairAny
// defineOrAroundSuffix
//
case 286: {
List result = new LinkedList();
result.add(getRhsSym(1));
result.addAll((List) getRhsSym(4));
setResult(result);
break;
}
//
// Rule 287: defineOrAroundSeq ::= around TEXT commentTextPairAny
// defineOrAroundSuffix
//
case 287: {
List result = new LinkedList();
result.add(getRhsSym(1));
result.addAll((List) getRhsSym(4));
setResult(result);
break;
}
//
// Rule 288: defineOrAroundSuffix ::= $Empty
//
case 288: {
setResult(Collections.EMPTY_LIST);
break;
}
//
// Rule 292: imports ::= $Empty
//
case 292: {
setResult(Collections.EMPTY_LIST);
break;
}
//
// Rule 293: imports ::= anImport imports
//
case 293: {
List res = new LinkedList();
res.add(getRhsSym(1));
res.addAll((List) getRhsSym(2));
setResult(res);
break;
}
//
// Rule 294: anImport ::= IMPORT StringLiteralExpCS TEXT
// commentTextPairAny
//
case 294: {
setResult(xpandFactory.createNamespaceImport(getLeftIToken(), (StringLiteralExpCS) getRhsSym(2)));
break;
}
//
// Rule 295: extensionImports ::= $Empty
//
case 295: {
setResult(Collections.EMPTY_LIST);
break;
}
//
// Rule 296: extensionImports ::= anExtensionImport extensionImports
//
case 296: {
List res = new LinkedList();
res.add(getRhsSym(1));
res.addAll((List) getRhsSym(2));
setResult(res);
break;
}
//
// Rule 297: anExtensionImport ::= EXTENSION pathNameCS TEXT
// commentTextPairAny
//
case 297: {
setResult(xpandFactory.createImportDeclaration(getLeftIToken(), (PathNameCS) getRhsSym(2)));
break;
}
//
// Rule 298: around ::= AROUND pointcut FOR typeCS sequence
// ENDAROUND
//
case 298: {
setResult(xpandFactory.createAround(getLeftIToken(), getRightIToken(), (Identifier) getRhsSym(2), Collections.<VariableCS> emptyList(), false, (TypeCS) getRhsSym(4), (List) getRhsSym(5)));
break;
}
//
// Rule 299: around ::= AROUND pointcut LPAREN parametersList RPAREN
// FOR typeCS sequence ENDAROUND
//
case 299: {
setResult(xpandFactory.createAround(getLeftIToken(), getRightIToken(), (Identifier) getRhsSym(2), (List<VariableCS>) getRhsSym(4), false, (TypeCS) getRhsSym(7), (List) getRhsSym(8)));
break;
}
//
// Rule 300: around ::= AROUND pointcut LPAREN parametersList COMMA
// MULTIPLY RPAREN FOR typeCS sequence ENDAROUND
//
case 300: {
setResult(xpandFactory.createAround(getLeftIToken(), getRightIToken(), (Identifier) getRhsSym(2), (List<VariableCS>) getRhsSym(4), true, (TypeCS) getRhsSym(9), (List) getRhsSym(10)));
break;
}
//
// Rule 301: around ::= AROUND pointcut LPAREN MULTIPLY RPAREN FOR
// typeCS sequence ENDAROUND
//
case 301: {
setResult(xpandFactory.createAround(getLeftIToken(), getRightIToken(), (Identifier) getRhsSym(2), Collections.<VariableCS> emptyList(), true, (TypeCS) getRhsSym(7), (List) getRhsSym(8)));
break;
}
//
// Rule 302: pointcut ::= MULTIPLY pointcutSuffix
//
case 302: {
// FIXME: may use SimpleNameCS here, though need more sophisticated
// code to update end position
// SimpleNameCS simpleNameCS =
// createSimpleNameCS(SimpleTypeEnum.IDENTIFIER_LITERAL,
// getTokenText(getRhsTokenIndex(1)));
// setOffsets(simpleNameCS, getLeftIToken());
Identifier res = xpandFactory.createIdentifier(getLeftIToken());
if (getRhsSym(2) != null) {
res = res.append((Identifier) getRhsSym(2));
}
setResult(res);
break;
}
//
// Rule 303: pointcut ::= IDENTIFIER pointcutSuffix
//
case 303: {
Identifier res = xpandFactory.createIdentifier(getLeftIToken());
if (getRhsSym(2) != null) {
res = res.append((Identifier) getRhsSym(2));
}
setResult(res);
break;
}
//
// Rule 304: pointcutSuffix ::= $Empty
//
case 304: {
setResult(null);
break;
}
//
// Rule 306: pointcutSuffix ::= COLONCOLON pointcutSuffix
//
case 306: {
Identifier res = xpandFactory.createIdentifier(getLeftIToken());
if (getRhsSym(2) != null) {
res = res.append((Identifier) getRhsSym(2));
}
setResult(res);
break;
}
//
// Rule 307: define ::= DEFINE IDENTIFIER FOR typeCS sequence
// ENDDEFINE
//
case 307: {
setResult(xpandFactory.createDefinition(getLeftIToken(), getRightIToken(), getRhsIToken(2), Collections.<VariableCS> emptyList(), (TypeCS) getRhsSym(4), (List) getRhsSym(5)));
break;
}
//
// Rule 308: define ::= DEFINE IDENTIFIER LPAREN parametersList
// RPAREN FOR typeCS sequence ENDDEFINE
//
case 308: {
setResult(xpandFactory.createDefinition(getLeftIToken(), getRightIToken(), getRhsIToken(2), (List<VariableCS>) getRhsSym(4), (TypeCS) getRhsSym(7), (List) getRhsSym(8)));
break;
}
//
// Rule 309: parametersList ::= parameter
//
case 309: {
VariableCS param = (VariableCS) getRhsSym(1);
LinkedList res = new LinkedList();
res.add(param);
setResult(res);
break;
}
//
// Rule 310: parametersList ::= parametersList , parameter
//
case 310: {
VariableCS param = (VariableCS) getRhsSym(3);
LinkedList res = new LinkedList();
res.addAll((List) getRhsSym(1));
res.add(param);
setResult(res);
break;
}
//
// Rule 312: parameter ::= typeCS IDENTIFIER
//
case 312: {
VariableCS result = createVariableCS(getRhsIToken(2).toString(), (TypeCS) getRhsSym(1), null);
setOffsets(result, (TypeCS) getRhsSym(1), getRhsIToken(2));
setResult(result);
break;
}
//
// Rule 313: sequence ::= text sequenceSuffix
//
case 313: {
List res = new LinkedList();
res.addAll((List) getRhsSym(1));
res.addAll((List) getRhsSym(2));
setResult(res);
break;
}
//
// Rule 314: sequenceSuffix ::= $Empty
//
case 314: {
setResult(Collections.EMPTY_LIST);
break;
}
//
// Rule 315: sequenceSuffix ::= statement text sequenceSuffix
//
case 315: {
List res = new LinkedList();
res.add(getRhsSym(1));
res.addAll((List) getRhsSym(2));
res.addAll((List) getRhsSym(3));
setResult(res);
break;
}
//
// Rule 322: text ::= minusOpt TEXT textSuffix
//
case 322: {
List res = new LinkedList();
res.add(xpandFactory.createTextStatement(getRhsIToken(2), (IToken) getRhsSym(1)));
res.addAll((List) getRhsSym(3));
setResult(res);
break;
}
//
// Rule 323: textSuffix ::= $Empty
//
case 323: {
setResult(Collections.EMPTY_LIST);
break;
}
//
// Rule 324: textSuffix ::= minusOpt TEXT textSuffix
//
case 324: {
List res = new LinkedList();
res.add(xpandFactory.createTextStatement(getRhsIToken(2), (IToken) getRhsSym(1)));
res.addAll((List) getRhsSym(3));
setResult(res);
break;
}
//
// Rule 325: minusOpt ::= $Empty
//
case 325: {
setResult(null);
break;
}
//
// Rule 326: minusOpt ::= MINUS
//
case 326: {
setResult(getLeftIToken());
break;
}
//
// Rule 330: errorStatement ::= ERROR OclExpressionCS
//
case 330: {
setResult(xpandFactory.createErrorStatement(getLeftIToken(), (OCLExpressionCS) getRhsSym(2)));
break;
}
//
// Rule 331: expandStatement ::= EXPAND definitionName
// parameterListOpt
//
case 331: {
setResult(xpandFactory.createExpandStatement(getLeftIToken(), (PathNameCS) getRhsSym(2), (List) getRhsSym(3), null, false, null));
break;
}
//
// Rule 332: expandStatement ::= EXPAND definitionName
// parameterListOpt FOR OclExpressionCS
//
case 332: {
setResult(xpandFactory.createExpandStatement(getLeftIToken(), (PathNameCS) getRhsSym(2), (List) getRhsSym(3), (OCLExpressionCS) getRhsSym(5), false, null));
break;
}
//
// Rule 333: expandStatement ::= EXPAND definitionName
// parameterListOpt FOREACH OclExpressionCS separatorOpt
//
case 333: {
setResult(xpandFactory.createExpandStatement(getLeftIToken(), (PathNameCS) getRhsSym(2), (List) getRhsSym(3), (OCLExpressionCS) getRhsSym(5), true, (OCLExpressionCS) getRhsSym(6)));
break;
}
//
// Rule 334: parameterListOpt ::= $Empty
//
case 334: {
setResult(Collections.EMPTY_LIST);
break;
}
//
// Rule 335: parameterListOpt ::= LPAREN argumentsCS RPAREN
//
case 335: {
setResult(getRhsSym(2));
break;
}
//
// Rule 337: expressionStmt ::= OclExpressionCS
//
case 337: {
// XXX OCL CST doesn't keep track of line numbers, but we use them
// (perhaps, might refactor to stop using?)
int lineNumber = getLeftIToken().getLine();
setResult(xpandFactory.createExpressionStatement((OCLExpressionCS) getRhsSym(1), lineNumber));
break;
}
//
// Rule 338: fileStatement ::= FILE OclExpressionCS identOpt
// sequence ENDFILE
//
case 338: {
setResult(xpandFactory.createFileStatement(getLeftIToken(), getRightIToken(), (OCLExpressionCS) getRhsSym(2), (Identifier) getRhsSym(3), (List) getRhsSym(4)));
break;
}
//
// Rule 339: identOpt ::= $Empty
//
case 339: {
setResult(null);
break;
}
//
// Rule 340: identOpt ::= IDENTIFIER
//
case 340: {
setResult(xpandFactory.createIdentifier(getLeftIToken()));
break;
}
//
// Rule 341: foreachStatement ::= FOREACH OclExpressionCS AS
// IDENTIFIER iteratorOpt separatorOpt sequence ENDFOREACH
//
case 341: {
setResult(xpandFactory.createForEachStatement(getLeftIToken(), getRightIToken(), (OCLExpressionCS) getRhsSym(2), getRhsIToken(4), (OCLExpressionCS) getRhsSym(6), (IToken) getRhsSym(5),
(List) getRhsSym(7)));
break;
}
//
// Rule 342: iteratorOpt ::= $Empty
//
case 342: {
setResult(null);
break;
}
//
// Rule 343: iteratorOpt ::= ITERATOR IDENTIFIER
//
case 343: {
setResult(getRightIToken());
break;
}
//
// Rule 344: separatorOpt ::= $Empty
//
case 344: {
setResult(null);
break;
}
//
// Rule 345: separatorOpt ::= SEPARATOR OclExpressionCS
//
case 345: {
setResult(getRhsSym(2));
break;
}
//
// Rule 346: ifStatement ::= IF OclExpressionCS sequence elseifAny
// elseOpt ENDIF
//
case 346: {
IfStatement i = xpandFactory.createIfStatement(getLeftIToken(), (OCLExpressionCS) getRhsSym(2), (List) getRhsSym(3), null);
IfStatement elseIf = (IfStatement) getRhsSym(4);
IfStatement elseStmt = (IfStatement) getRhsSym(5);
if (elseIf != null) {
i.setElseIf(elseIf);
IfStatement curElseIf = elseIf;
// get the latest one in the chain
while (curElseIf.getElseIf() != null) {
curElseIf = curElseIf.getElseIf();
}
curElseIf.setElseIf(elseStmt);
} else {
i.setElseIf(elseStmt);
}
setResult(i);
break;
}
//
// Rule 347: elseifAny ::= $Empty
//
case 347: {
setResult(null);
break;
}
//
// Rule 348: elseifAny ::= ELSEIF OclExpressionCS sequence elseifAny
//
case 348: {
IfStatement elseIf = xpandFactory.createIfStatement(getLeftIToken(), (OCLExpressionCS) getRhsSym(2), (List) getRhsSym(3), null);
IfStatement restElseIf = (IfStatement) getRhsSym(4);
elseIf.setElseIf(restElseIf);
setResult(elseIf);
break;
}
//
// Rule 349: elseOpt ::= $Empty
//
case 349: {
setResult(null);
break;
}
//
// Rule 350: elseOpt ::= ELSE sequence
//
case 350: {
setResult(xpandFactory.createIfStatement(getLeftIToken(), null, (List) getRhsSym(2), null));
break;
}
//
// Rule 351: letStatement ::= LET OclExpressionCS AS IDENTIFIER
// sequence ENDLET
//
case 351: {
setResult(xpandFactory.createLetStatement(getLeftIToken(), getRightIToken(), (OCLExpressionCS) getRhsSym(2), getRhsIToken(4), (List) getRhsSym(5)));
break;
}
//
// Rule 352: protectStatement ::= PROTECT CSTART OclExpressionCS
// CEND OclExpressionCS ID OclExpressionCS disabledOpt sequence
// ENDPROTECT
//
case 352: {
setResult(xpandFactory.createProtectStatement(getLeftIToken(), getRightIToken(), (OCLExpressionCS) getRhsSym(3), (OCLExpressionCS) getRhsSym(5), (OCLExpressionCS) getRhsSym(7),
(IToken) getRhsSym(8), (List) getRhsSym(9)));
break;
}
//
// Rule 353: disabledOpt ::= $Empty
//
case 353: {
setResult(null);
break;
}
//
// Rule 354: disabledOpt ::= DISABLE
//
case 354: {
setResult(getLeftIToken());
break;
}
default:
break;
}
return;
}
}