/*******************************************************************************
* Copyright (c) 2007 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.el.internal.core.parser.rule;
import org.jboss.tools.common.el.core.ElCoreMessages;
import org.jboss.tools.common.el.core.parser.IRule;
import org.jboss.tools.common.el.core.parser.Tokenizer;
import org.jboss.tools.common.el.internal.core.parser.token.ArgEndTokenDescription;
import org.jboss.tools.common.el.internal.core.parser.token.ArrayEndTokenDescription;
import org.jboss.tools.common.el.internal.core.parser.token.ArrayStartTokenDescription;
import org.jboss.tools.common.el.internal.core.parser.token.CommaTokenDescription;
import org.jboss.tools.common.el.internal.core.parser.token.EndELTokenDescription;
import org.jboss.tools.common.el.internal.core.parser.token.ExprStartTokenDescription;
import org.jboss.tools.common.el.internal.core.parser.token.JavaNameTokenDescription;
import org.jboss.tools.common.el.internal.core.parser.token.OperationTokenDescription;
import org.jboss.tools.common.el.internal.core.parser.token.ParamEndTokenDescription;
import org.jboss.tools.common.el.internal.core.parser.token.ParamUtil;
import org.jboss.tools.common.el.internal.core.parser.token.PrimitiveValueTokenDescription;
import org.jboss.tools.common.el.internal.core.parser.token.StartELTokenDescription;
import org.jboss.tools.common.el.internal.core.parser.token.StringTokenDescription;
import org.jboss.tools.common.el.internal.core.parser.token.UnaryTokenDescription;
import org.jboss.tools.common.el.internal.core.parser.token.WhiteSpaceTokenDescription;
/**
*
* @author V. Kabanovich
*
*/
public class ExpressionRule implements IRule, BasicStates {
public static ExpressionRule INSTANCE = new ExpressionRule();
public int[] getStartStates() {
return new int[] {
STATE_EXPECTING_EL,
STATE_EXPECTING_EXPRESSION,
STATE_EXPECTING_NAME,
STATE_EXPECTING_PARAM,
STATE_EXPECTING_ARRAY_VALUE,
STATE_EXPECTING_ARG,
STATE_EXPECTING_OPERAND
};
}
public int getFinalState(int state, int token) {
switch (token) {
case StartELTokenDescription.START_EL:
return STATE_EXPECTING_EXPRESSION;
case WhiteSpaceTokenDescription.WHITESPACE:
return state;
case EndELTokenDescription.END_EL:
return STATE_EXPECTING_EL;
case JavaNameTokenDescription.JAVA_NAME:
case StringTokenDescription.STRING:
return STATE_EXPECTING_CALL;
case PrimitiveValueTokenDescription.PRIMITIVE_VALUE:
return STATE_EXPECTING_OPERATION;
case ParamEndTokenDescription.PARAM_END:
case ArgEndTokenDescription.ARG_END:
case ArrayEndTokenDescription.ARRAY_END:
return STATE_EXPECTING_CALL_AFTER_METHOD;
case ExprStartTokenDescription.EXPR_START:
case UnaryTokenDescription.UNARY:
return STATE_EXPECTING_OPERAND;
case ArrayStartTokenDescription.ARRAY_START:
return STATE_EXPECTING_ARRAY_VALUE;
case CommaTokenDescription.COMMA:
return STATE_EXPECTING_OPERAND;
}
return 0;
}
public int[] getTokenTypes(int state) {
switch(state) {
case STATE_EXPECTING_EL:
return new int[]{
StartELTokenDescription.START_EL
};
case STATE_EXPECTING_EXPRESSION:
return new int[] {
WhiteSpaceTokenDescription.WHITESPACE,
UnaryTokenDescription.UNARY,
EndELTokenDescription.END_EL,
PrimitiveValueTokenDescription.PRIMITIVE_VALUE,
JavaNameTokenDescription.JAVA_NAME,
StringTokenDescription.STRING,
ExprStartTokenDescription.EXPR_START,
ArrayStartTokenDescription.ARRAY_START,
};
case STATE_EXPECTING_NAME:
return new int[] {
WhiteSpaceTokenDescription.WHITESPACE,
JavaNameTokenDescription.JAVA_NAME,
};
case STATE_EXPECTING_PARAM:
return new int[] {
WhiteSpaceTokenDescription.WHITESPACE,
UnaryTokenDescription.UNARY,
PrimitiveValueTokenDescription.PRIMITIVE_VALUE,
JavaNameTokenDescription.JAVA_NAME,
StringTokenDescription.STRING,
ExprStartTokenDescription.EXPR_START,
ParamEndTokenDescription.PARAM_END
};
case STATE_EXPECTING_ARRAY_VALUE:
return new int[] {
WhiteSpaceTokenDescription.WHITESPACE,
UnaryTokenDescription.UNARY,
PrimitiveValueTokenDescription.PRIMITIVE_VALUE,
JavaNameTokenDescription.JAVA_NAME,
StringTokenDescription.STRING,
ExprStartTokenDescription.EXPR_START,
CommaTokenDescription.COMMA,
ArrayEndTokenDescription.ARRAY_END
};
case STATE_EXPECTING_ARG:
return new int[] {
WhiteSpaceTokenDescription.WHITESPACE,
UnaryTokenDescription.UNARY,
PrimitiveValueTokenDescription.PRIMITIVE_VALUE,
JavaNameTokenDescription.JAVA_NAME,
StringTokenDescription.STRING,
ExprStartTokenDescription.EXPR_START
};
case STATE_EXPECTING_OPERAND:
return new int[] {
WhiteSpaceTokenDescription.WHITESPACE,
UnaryTokenDescription.UNARY,
PrimitiveValueTokenDescription.PRIMITIVE_VALUE,
StringTokenDescription.STRING,
ExprStartTokenDescription.EXPR_START,
JavaNameTokenDescription.JAVA_NAME,
ArrayStartTokenDescription.ARRAY_START,
};
}
return new int[0];
}
public String getProblem(int state, Tokenizer tokenizer) {
if(state == STATE_EXPECTING_NAME) {
return ElCoreMessages.ExpressionRule_ExpectingJavaName;
} else if(ParamUtil.isArrayContext(tokenizer.getContext())) {
return ElCoreMessages.CallRule_ExpectingRBracket;
} else {
if(OperationTokenDescription.INSTANCE.isStart(tokenizer, tokenizer.getCurrentIndex())) {
return ElCoreMessages.ExpressionRule_CannotStartWithBinaryOp;
}
if(JavaNameTokenDescription.INSTANCEOF_INSTANCE.isStart(tokenizer, tokenizer.getCurrentIndex())) {
return ElCoreMessages.ExpressionRule_CannotStartWithInstanceof;
}
return ElCoreMessages.ExpressionRule_ExpectingExpression;
}
}
}