/******************************************************************************* * Copyright (c) 2006, 2007 Eclipse.org * * 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 *******************************************************************************/ package org.eclipse.gmf.internal.xpand.parser; import lpg.lpgjavaruntime.*; import java.util.LinkedList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.gmf.internal.xpand.util.ParserException.ErrorLocationInfo; import org.eclipse.gmf.internal.xpand.expression.parser.ExpressionFactory; import org.eclipse.gmf.internal.xpand.ast.*; import org.eclipse.gmf.internal.xpand.expression.ast.*; import java.util.Collections; 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()); factory = new ExpressionFactory(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, String locationInfo, int leftToken, int rightToken, String tokenText) { final int leftTokenLine = getLine(leftToken); final int leftTokenColumn = getColumn(leftToken); final int rightTokenLine = getEndLine(rightToken); final int rightTokenColumn = getEndColumn(rightToken); final String msg = tokenText + errorMsgText[errorCode]; errors.add(new ErrorLocationInfo(msg, leftTokenLine, leftTokenColumn, rightTokenLine, rightTokenColumn)); } /* @Override public void reportError(int leftToken, int rightToken) { int errorCode = (rightToken >= getStreamLength() ? EOF_CODE : leftToken == rightToken ? LEX_ERROR_CODE : INVALID_TOKEN_CODE); int endToken = (leftToken == rightToken ? rightToken : rightToken - 1); String msg = (errorCode == EOF_CODE ? "End-of-file " : errorCode == INVALID_TOKEN_CODE ? "\"" + new String(getInputChars(), leftToken, rightToken - leftToken) + "\" " : "\"" + getCharValue(leftToken) + "\" "); final int leftTokenLine = getLine(leftToken); final int leftTokenColumn = getColumn(leftToken); final int rightTokenLine = getEndLine(endToken); final int rightTokenColumn = getEndColumn(endToken); errors.add(new ErrorLocationInfo(msg, leftTokenLine, leftTokenColumn, rightTokenLine, rightTokenColumn)); } */ @Override public void reportError(int errorCode, String locationInfo, String tokenText) { try { Matcher m = Pattern.compile("(?:[^:]+::)*[^:]+:(\\d+):(\\d+):(\\d+):(\\d+):.*").matcher(locationInfo); boolean t = m.matches(); // ignore return value, rely on exception if anything wrong assert t; final int leftTokenLine = getLine(Integer.parseInt(m.group(1))); final int leftTokenColumn = getColumn(Integer.parseInt(m.group(2))); final int rightTokenLine = getEndLine(Integer.parseInt(m.group(3))); final int rightTokenColumn = getEndColumn(Integer.parseInt(m.group(4))); final String msg = tokenText + errorMsgText[errorCode]; errors.add(new ErrorLocationInfo(msg, leftTokenLine, leftTokenColumn, rightTokenLine, rightTokenColumn)); } catch (Throwable ex) { // ignore errors.add(new ErrorLocationInfo(tokenText + errorMsgText[errorCode])); } } private final XpandFactory xpandFactory; private final ExpressionFactory factory; public void ruleAction(int ruleNumber) { switch (ruleNumber) { // // Rule 2: letExpression ::= let IDENT ASSIGN castedExpression COLON castedExpression // case 2: { setResult(factory.createLetExpression(getLeftIToken(),getRhsIToken(2),(Expression) getRhsSym(4), (Expression) getRhsSym(6))); break; } // // Rule 4: castedExpression ::= LPAREN type RPAREN infixExpression // case 4: { setResult(factory.createCast(getLeftIToken(), (Identifier) getRhsSym(2),(Expression) getRhsSym(4))); break; } // // Rule 7: chainExpression ::= ifExpression ARROW chainExpression // case 7: { Expression e = (Expression) getRhsSym(1); Expression right = (Expression) getRhsSym(3); if (right instanceof ChainExpression) { ChainExpression rchain = (ChainExpression) right; Expression newFirst = factory.createChainExpression(e, rchain.getFirst()); setResult(factory.createChainExpression(newFirst, rchain.getNext())); } else { setResult(factory.createChainExpression(e, right)); } break; } // // Rule 9: ifExpression ::= switchExpression QUESTION_MARK switchExpression COLON switchExpression // case 9: { setResult(factory.createIf((Expression) getRhsSym(1),(Expression) getRhsSym(3), (Expression) getRhsSym(5))); break; } // // Rule 10: switchExpression ::= switch LPAREN expression RPAREN LCURLY switchCases default COLON orExpression RCURLY // case 10: { setResult(factory.createSwitchExpression(getLeftIToken(),getRightIToken(), (Expression) getRhsSym(3), (List) getRhsSym(6), (Expression) getRhsSym(9))); break; } // // Rule 12: switchCases ::= $Empty // case 12: { setResult(Collections.emptyList()); break; } // // Rule 13: switchCases ::= case orExpression COLON orExpression switchCases // case 13: { LinkedList r = new LinkedList(); r.add(factory.createCase(getLeftIToken(), (Expression) getRhsSym(2), (Expression) getRhsSym(4))); r.addAll((List) getRhsSym(5)); setResult(r); break; } // // Rule 15: orExpression ::= andExpression OR orExpression // case 15: { Expression e = (Expression) getRhsSym(1); Expression r = (Expression) getRhsSym(3); setResult(factory.createBooleanOperation(e.getStart(),r.getEnd(),e.getLine(),e.getStartOffset(),r.getEndOffset(),getRhsIToken(2),e,r)); break; } // // Rule 17: andExpression ::= impliesExpression AND andExpression // case 17: { Expression e = (Expression) getRhsSym(1); Expression r = (Expression) getRhsSym(3); setResult(factory.createBooleanOperation(e.getStart(),r.getEnd(),e.getLine(),e.getStartOffset(),r.getEndOffset(),getRhsIToken(2),e,r)); break; } // // Rule 19: impliesExpression ::= relationalExpression implies relationalExpression // case 19: { Expression e = (Expression) getRhsSym(1); Expression r = (Expression) getRhsSym(3); setResult(factory.createBooleanOperation(e.getStart(),r.getEnd(),e.getLine(),e.getStartOffset(),e.getEndOffset(),getRhsIToken(2),e,r)); break; } // // Rule 21: relationalExpression ::= additiveExpression relationalOperator additiveExpression // case 21: { Expression e = (Expression) getRhsSym(1); IToken t = (IToken) getRhsSym(2); Expression r = (Expression) getRhsSym(3); setResult(factory.createOperationCall(e.getStart(),r.getEnd(),e.getLine(),e.getStartOffset(),r.getEndOffset(),t,e,Collections.singletonList(r))); break; } // // Rule 22: relationalOperator ::= EQ // case 22: { setResult(getLeftIToken()); break; } // // Rule 23: relationalOperator ::= NE // case 23: { setResult(getLeftIToken()); break; } // // Rule 24: relationalOperator ::= GE // case 24: { setResult(getLeftIToken()); break; } // // Rule 25: relationalOperator ::= LE // case 25: { setResult(getLeftIToken()); break; } // // Rule 26: relationalOperator ::= GT // case 26: { setResult(getLeftIToken()); break; } // // Rule 27: relationalOperator ::= LT // case 27: { setResult(getLeftIToken()); break; } // // Rule 29: additiveExpression ::= additiveExpression additiveOperator multiplicativeExpression // case 29: { Expression e = (Expression) getRhsSym(1); IToken t = (IToken) getRhsSym(2); Expression r = (Expression) getRhsSym(3); setResult(factory.createOperationCall(e.getStart(),r.getEnd(),e.getLine(),e.getStartOffset(),r.getEndOffset(),t,e,Collections.singletonList(r))); break; } // // Rule 30: additiveOperator ::= PLUS // case 30: { setResult(getLeftIToken()); break; } // // Rule 31: additiveOperator ::= MINUS // case 31: { setResult(getLeftIToken()); break; } // // Rule 33: multiplicativeExpression ::= unaryExpression multiplicativeOperator multiplicativeExpression // case 33: { Expression e = (Expression) getRhsSym(1); IToken t = (IToken) getRhsSym(2); Expression r = (Expression) getRhsSym(3); setResult(factory.createOperationCall(e.getStart(),r.getEnd(),e.getLine(),e.getStartOffset(),r.getEndOffset(),t,e,Collections.singletonList(r))); break; } // // Rule 34: multiplicativeOperator ::= MULTI // case 34: { setResult(getLeftIToken()); break; } // // Rule 35: multiplicativeOperator ::= DIV // case 35: { setResult(getLeftIToken()); break; } // // Rule 37: unaryExpression ::= NOT infixExpression // case 37: { Expression e = (Expression) getRhsSym(2); setResult(factory.createOperationCall(getLeftIToken().getColumn(),e.getEnd(),getLeftIToken().getLine(),getLeftIToken().getStartOffset(),e.getEndOffset(),getLeftIToken(),e,Collections.EMPTY_LIST)); break; } // // Rule 38: unaryExpression ::= MINUS infixExpression // case 38: { Expression e = (Expression) getRhsSym(2); setResult(factory.createOperationCall(getLeftIToken().getColumn(),e.getEnd(),getLeftIToken().getLine(),getLeftIToken().getStartOffset(),e.getEndOffset(),getLeftIToken(),e,Collections.EMPTY_LIST)); break; } // // Rule 39: infixExpressionSuffix ::= DOT featureCall // case 39: { setResult(getRhsSym(2)); break; } // // Rule 40: infixExpressionSuffix ::= DOT featureCall infixExpressionSuffix // case 40: { final FeatureCall op = (FeatureCall) getRhsSym(3); FeatureCall fc = op; while (fc.getTarget() != null) { fc = (FeatureCall) fc.getTarget(); } fc.setTarget((FeatureCall) getRhsSym(2)); setResult(op); break; } // // Rule 42: infixExpression ::= primaryExpression infixExpressionSuffix // case 42: { final FeatureCall op = (FeatureCall) getRhsSym(2); FeatureCall fc = op; while (fc.getTarget() != null) { fc = (FeatureCall) fc.getTarget(); } fc.setTarget((Expression) getRhsSym(1)); setResult(op); break; } // // Rule 43: primaryExpression ::= STRING // case 43: { setResult(factory.createStringLiteral(getLeftIToken())); break; } // // Rule 51: primaryExpression ::= LPAREN expression RPAREN // case 51: { Expression expr = (Expression) getRhsSym(2); expr.setStartOffset(getLeftIToken().getStartOffset()); expr.setEndOffset(getRightIToken().getEndOffset()); setResult(expr); break; } // // Rule 52: featureCall ::= IDENT LPAREN parameterList RPAREN // case 52: { setResult(factory.createOperationCall(getRightIToken(),getLeftIToken(),null, (List<Expression>) getRhsSym(3))); break; } // // Rule 53: featureCall ::= IDENT LPAREN RPAREN // case 53: { setResult(factory.createOperationCall(getRightIToken(), getLeftIToken(), null, Collections.EMPTY_LIST)); break; } // // Rule 54: featureCall ::= type // case 54: { setResult(factory.createFeatureCall((Identifier) getRhsSym(1),null)); break; } // // Rule 56: listLiteral ::= LCURLY parameterList RCURLY // case 56: { setResult(factory.createListLiteral(getLeftIToken(),getRightIToken(), (List<Expression>) getRhsSym(2))); break; } // // Rule 57: listLiteral ::= LCURLY RCURLY // case 57: { setResult(factory.createListLiteral(getLeftIToken(), getRightIToken(), Collections.EMPTY_LIST)); break; } // // Rule 58: constructorCall ::= new simpleType // case 58: { setResult(factory.createConstructorCall(getLeftIToken(), (Identifier) getRhsSym(2))); break; } // // Rule 59: booleanLiteral ::= false // case 59: { setResult(factory.createBooleanLiteral(getRhsIToken(1))); break; } // // Rule 60: booleanLiteral ::= true // case 60: { setResult(factory.createBooleanLiteral(getRhsIToken(1))); break; } // // Rule 61: nullLiteral ::= null // case 61: { setResult(factory.createNullLiteral(getRhsIToken(1))); break; } // // Rule 62: intLiteral ::= INT_CONST // case 62: { setResult(factory.createIntegerLiteral(getRhsIToken(1))); break; } // // Rule 63: realLiteral ::= REAL_CONST // case 63: { setResult(factory.createRealLiteral(getRhsIToken(1))); break; } // // Rule 64: collectionExpression ::= typeSelect LPAREN type RPAREN // case 64: { setResult(factory.createTypeSelectExpression(getRhsIToken(1), getRightIToken(), (Identifier) getRhsSym(3),null)); break; } // // Rule 65: collectionExpression ::= collectionExpressionName LPAREN IDENT BAR expression RPAREN // case 65: { setResult(factory.createCollectionExpression((IToken) getRhsSym(1), getRightIToken(), getRhsIToken(3), (Expression) getRhsSym(5),null)); break; } // // Rule 66: collectionExpression ::= collectionExpressionName LPAREN expression RPAREN // case 66: { setResult(factory.createCollectionExpression((IToken) getRhsSym(1), getRightIToken(), null, (Expression) getRhsSym(3),null)); break; } // // Rule 67: collectionExpressionName ::= collect // case 67: { setResult(getLeftIToken()); break; } // // Rule 68: collectionExpressionName ::= select // case 68: { setResult(getLeftIToken()); break; } // // Rule 69: collectionExpressionName ::= reject // case 69: { setResult(getLeftIToken()); break; } // // Rule 70: collectionExpressionName ::= exists // case 70: { setResult(getLeftIToken()); break; } // // Rule 71: collectionExpressionName ::= notExists // case 71: { setResult(getLeftIToken()); break; } // // Rule 72: collectionExpressionName ::= forAll // case 72: { setResult(getLeftIToken()); break; } // // Rule 73: declaredParameterListOpt ::= $Empty // case 73: { setResult(Collections.EMPTY_LIST); break; } // // Rule 75: declaredParameterList ::= type IDENT // case 75: { Identifier id = factory.createIdentifier(getRightIToken()); DeclaredParameter p = factory.createDeclaredParameter((Identifier) getRhsSym(1), id); setResult(Collections.singletonList(p)); break; } // // Rule 76: declaredParameterList ::= type IDENT COMMA declaredParameterList // case 76: { LinkedList r = new LinkedList(); Identifier id = factory.createIdentifier(getRhsIToken(2)); DeclaredParameter p = factory.createDeclaredParameter((Identifier) getRhsSym(1), id); r.add(p); r.addAll((List) getRhsSym(4)); setResult(r); break; } // // Rule 77: parameterList ::= expression // case 77: { setResult(Collections.singletonList((Expression) getRhsSym(1))); break; } // // Rule 78: parameterList ::= expression COMMA parameterList // case 78: { LinkedList r = new LinkedList(); r.add(getRhsSym(1)); r.addAll((List) getRhsSym(3)); setResult(r); break; } // // Rule 81: collectionType ::= collectionTypeName LSQUARE simpleType RSQUARE // case 81: { Identifier id = (Identifier) getRhsSym(1); id = id.append(factory.createIdentifier(getRhsIToken(2))); id = id.append((Identifier) getRhsSym(3)); id = id.append(factory.createIdentifier(getRhsIToken(4))); setResult(id); break; } // // Rule 82: collectionTypeName ::= Collection // case 82: { setResult(factory.createIdentifier(getRhsIToken(1))); break; } // // Rule 83: collectionTypeName ::= List // case 83: { setResult(factory.createIdentifier(getRhsIToken(1))); break; } // // Rule 84: collectionTypeName ::= Set // case 84: { setResult(factory.createIdentifier(getRhsIToken(1))); break; } // // Rule 85: simpleType ::= IDENT NOT qualifiedType // case 85: { Identifier id = factory.createIdentifier(getLeftIToken()); id = id.append(factory.createIdentifier(getRhsIToken(2))); id = id.append((Identifier) getRhsSym(3)); setResult(id); break; } // // Rule 87: qualifiedType ::= IDENT // case 87: { setResult(factory.createIdentifier(getLeftIToken())); break; } // // Rule 88: qualifiedType ::= IDENT DCOLON qualifiedType // case 88: { Identifier id = factory.createIdentifier(getLeftIToken()); id = id.append(factory.createIdentifier(getRhsIToken(2))); id = id.append((Identifier) getRhsSym(3)); setResult(id); break; } // // Rule 89: template ::= emptyTemplate // case 89: { setResult(xpandFactory.createTemplate(Collections.EMPTY_LIST, Collections.EMPTY_LIST, Collections.EMPTY_LIST, Collections.EMPTY_LIST, getRightIToken())); break; } // // Rule 92: template ::= LG commentTextPairAny imports extensionImports defineOrAroundSeq // case 92: { 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 93: defineOrAroundSeq ::= define TEXT commentTextPairAny defineOrAroundSuffix // case 93: { List result = new LinkedList(); result.add(getRhsSym(1)); result.addAll((List) getRhsSym(4)); setResult(result); break; } // // Rule 94: defineOrAroundSeq ::= around TEXT commentTextPairAny defineOrAroundSuffix // case 94: { List result = new LinkedList(); result.add(getRhsSym(1)); result.addAll((List) getRhsSym(4)); setResult(result); break; } // // Rule 95: defineOrAroundSuffix ::= $Empty // case 95: { setResult(Collections.EMPTY_LIST); break; } // // Rule 101: imports ::= $Empty // case 101: { setResult(Collections.EMPTY_LIST); break; } // // Rule 102: imports ::= anImport imports // case 102: { List res = new LinkedList(); res.add(getRhsSym(1)); res.addAll((List) getRhsSym(2)); setResult(res); break; } // // Rule 103: anImport ::= IMPORT STRING TEXT commentTextPairAny // case 103: { setResult(xpandFactory.createNamespaceImport(getLeftIToken(),xpandFactory.createStringLiteral(getRhsIToken(2)))); break; } // // Rule 104: extensionImports ::= $Empty // case 104: { setResult(Collections.EMPTY_LIST); break; } // // Rule 105: extensionImports ::= anExtensionImport extensionImports // case 105: { List res = new LinkedList(); res.add(getRhsSym(1)); res.addAll((List) getRhsSym(2)); setResult(res); break; } // // Rule 106: anExtensionImport ::= EXTENSION simpleType TEXT commentTextPairAny // case 106: { setResult(xpandFactory.createImportDeclaration(getLeftIToken(), (Identifier) getRhsSym(2))); break; } // // Rule 107: around ::= AROUND pointcut FOR type sequence ENDAROUND // case 107: { setResult(xpandFactory.createAround(getLeftIToken(), getRightIToken(), (Identifier) getRhsSym(2), Collections.EMPTY_LIST, false, (Identifier) getRhsSym(4), (List) getRhsSym(5))); break; } // // Rule 108: around ::= AROUND pointcut LPAREN declaredParameterList RPAREN FOR type sequence ENDAROUND // case 108: { setResult(xpandFactory.createAround(getLeftIToken(), getRightIToken(), (Identifier) getRhsSym(2), (List) getRhsSym(4), false, (Identifier) getRhsSym(7), (List) getRhsSym(8))); break; } // // Rule 109: around ::= AROUND pointcut LPAREN declaredParameterList COMMA MULTI RPAREN FOR type sequence ENDAROUND // case 109: { setResult(xpandFactory.createAround(getLeftIToken(), getRightIToken(), (Identifier) getRhsSym(2), (List) getRhsSym(4), true, (Identifier) getRhsSym(9), (List) getRhsSym(10))); break; } // // Rule 110: around ::= AROUND pointcut LPAREN MULTI RPAREN FOR type sequence ENDAROUND // case 110: { setResult(xpandFactory.createAround(getLeftIToken(), getRightIToken(), (Identifier) getRhsSym(2), Collections.EMPTY_LIST, true, (Identifier) getRhsSym(7), (List) getRhsSym(8))); break; } // // Rule 111: pointcut ::= MULTI pointcutSuffix // case 111: { Identifier res = xpandFactory.createIdentifier(getLeftIToken()); if (getRhsSym(2) != null) { res = res.append((Identifier) getRhsSym(2)); } setResult(res); break; } // // Rule 112: pointcut ::= IDENT pointcutSuffix // case 112: { Identifier res = xpandFactory.createIdentifier(getLeftIToken()); if (getRhsSym(2) != null) { res = res.append((Identifier) getRhsSym(2)); } setResult(res); break; } // // Rule 113: pointcutSuffix ::= $Empty // case 113: { setResult(null); break; } // // Rule 115: pointcutSuffix ::= DCOLON pointcutSuffix // case 115: { Identifier res = xpandFactory.createIdentifier(getLeftIToken()); if (getRhsSym(2) != null) { res = res.append((Identifier) getRhsSym(2)); } setResult(res); break; } // // Rule 116: define ::= DEFINE IDENT FOR type sequence ENDDEFINE // case 116: { setResult(xpandFactory.createDefinition(getLeftIToken(), getRightIToken(), getRhsIToken(2), Collections.EMPTY_LIST, (Identifier) getRhsSym(4), (List) getRhsSym(5))); break; } // // Rule 117: define ::= DEFINE IDENT LPAREN declaredParameterList RPAREN FOR type sequence ENDDEFINE // case 117: { setResult(xpandFactory.createDefinition(getLeftIToken(), getRightIToken(), getRhsIToken(2), (List) getRhsSym(4), (Identifier) getRhsSym(7), (List) getRhsSym(8))); break; } // // Rule 118: sequence ::= text sequenceSuffix // case 118: { List res = new LinkedList(); res.addAll((List) getRhsSym(1)); res.addAll((List) getRhsSym(2)); setResult(res); break; } // // Rule 119: sequenceSuffix ::= $Empty // case 119: { setResult(Collections.EMPTY_LIST); break; } // // Rule 120: sequenceSuffix ::= statement text sequenceSuffix // case 120: { List res = new LinkedList(); res.add(getRhsSym(1)); res.addAll((List) getRhsSym(2)); res.addAll((List) getRhsSym(3)); setResult(res); break; } // // Rule 127: text ::= minusOpt TEXT textSuffix // case 127: { List res = new LinkedList(); res.add(xpandFactory.createTextStatement(getRhsIToken(2), (IToken) getRhsSym(1))); res.addAll((List) getRhsSym(3)); setResult(res); break; } // // Rule 128: textSuffix ::= $Empty // case 128: { setResult(Collections.EMPTY_LIST); break; } // // Rule 129: textSuffix ::= minusOpt TEXT textSuffix // case 129: { List res = new LinkedList(); res.add(xpandFactory.createTextStatement(getRhsIToken(2), (IToken) getRhsSym(1))); res.addAll((List) getRhsSym(3)); setResult(res); break; } // // Rule 130: minusOpt ::= $Empty // case 130: { setResult(null); break; } // // Rule 131: minusOpt ::= MINUS // case 131: { setResult(getLeftIToken()); break; } // // Rule 135: errorStatement ::= ERROR expression // case 135: { setResult(xpandFactory.createErrorStatement(getLeftIToken(), (Expression) getRhsSym(2))); break; } // // Rule 136: expandStatement ::= EXPAND definitionName parameterListOpt // case 136: { setResult(xpandFactory.createExpandStatement(getLeftIToken(), (Identifier) getRhsSym(2), (List) getRhsSym(3), null, false, null)); break; } // // Rule 137: expandStatement ::= EXPAND definitionName parameterListOpt FOR expression // case 137: { setResult(xpandFactory.createExpandStatement(getLeftIToken(), (Identifier) getRhsSym(2), (List) getRhsSym(3), (Expression) getRhsSym(5), false, null)); break; } // // Rule 138: expandStatement ::= EXPAND definitionName parameterListOpt FOREACH expression separatorOpt // case 138: { setResult(xpandFactory.createExpandStatement(getLeftIToken(), (Identifier) getRhsSym(2), (List) getRhsSym(3), (Expression) getRhsSym(5), true, (Expression) getRhsSym(6))); break; } // // Rule 139: parameterListOpt ::= $Empty // case 139: { setResult(Collections.EMPTY_LIST); break; } // // Rule 140: parameterListOpt ::= LPAREN parameterList RPAREN // case 140: { setResult(getRhsSym(2)); break; } // // Rule 142: expressionStmt ::= expression // case 142: { setResult(xpandFactory.createExpressionStatement((Expression) getRhsSym(1))); break; } // // Rule 143: fileStatement ::= FILE expression identOpt sequence ENDFILE // case 143: { setResult(xpandFactory.createFileStatement(getLeftIToken(), getRightIToken(), (Expression) getRhsSym(2), (Identifier) getRhsSym(3), (List) getRhsSym(4))); break; } // // Rule 144: identOpt ::= $Empty // case 144: { setResult(null); break; } // // Rule 145: identOpt ::= IDENT // case 145: { setResult(xpandFactory.createIdentifier(getLeftIToken())); break; } // // Rule 146: foreachStatement ::= FOREACH expression AS IDENT iteratorOpt separatorOpt sequence ENDFOREACH // case 146: { setResult(xpandFactory.createForEachStatement(getLeftIToken(), getRightIToken(), (Expression) getRhsSym(2), getRhsIToken(4), (Expression) getRhsSym(6), (IToken) getRhsSym(5), (List) getRhsSym(7))); break; } // // Rule 147: iteratorOpt ::= $Empty // case 147: { setResult(null); break; } // // Rule 148: iteratorOpt ::= ITERATOR IDENT // case 148: { setResult(getRightIToken()); break; } // // Rule 149: separatorOpt ::= $Empty // case 149: { setResult(null); break; } // // Rule 150: separatorOpt ::= SEPARATOR expression // case 150: { setResult(getRhsSym(2)); break; } // // Rule 151: ifStatement ::= IF expression sequence elseifAny elseOpt ENDIF // case 151: { IfStatement i = xpandFactory.createIfStatement(getLeftIToken(), (Expression) 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 152: elseifAny ::= $Empty // case 152: { setResult(null); break; } // // Rule 153: elseifAny ::= ELSEIF expression sequence elseifAny // case 153: { IfStatement elseIf = xpandFactory.createIfStatement(getLeftIToken(), (Expression) getRhsSym(2), (List) getRhsSym(3), null); IfStatement restElseIf = (IfStatement) getRhsSym(4); elseIf.setElseIf(restElseIf); setResult(elseIf); break; } // // Rule 154: elseOpt ::= $Empty // case 154: { setResult(null); break; } // // Rule 155: elseOpt ::= ELSE sequence // case 155: { setResult(xpandFactory.createIfStatement(getLeftIToken(), null, (List) getRhsSym(2), null)); break; } // // Rule 156: letStatement ::= LET expression AS IDENT sequence ENDLET // case 156: { setResult(xpandFactory.createLetStatement(getLeftIToken(), getRightIToken(), (Expression) getRhsSym(2), getRhsIToken(4), (List) getRhsSym(5))); break; } // // Rule 157: protectStatement ::= PROTECT CSTART expression CEND expression ID expression disabledOpt sequence ENDPROTECT // case 157: { setResult(xpandFactory.createProtectStatement(getLeftIToken(), getRightIToken(), (Expression) getRhsSym(3), (Expression) getRhsSym(5), (Expression) getRhsSym(7), (IToken) getRhsSym(8), (List) getRhsSym(9))); break; } // // Rule 158: disabledOpt ::= $Empty // case 158: { setResult(null); break; } // // Rule 159: disabledOpt ::= DISABLE // case 159: { setResult(getLeftIToken()); break; } default: break; } return; } }