renamed operator IS to INSTANCEOF, may yet delete..

git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@103 50f2f4bb-b051-0410-bef5-90022cba6387
This commit is contained in:
Andy Clement 2008-09-16 17:20:03 +00:00
parent 0000c6f260
commit f497d6af62
11 changed files with 1380 additions and 1402 deletions

View File

@ -24,9 +24,12 @@ import java.text.MessageFormat;
* <p> * <p>
* When a message is formatted, it will have this kind of form * When a message is formatted, it will have this kind of form
* *
* <pre><code> * <pre>
* &lt;code&gt;
* EL1004E: (pos 34): Type cannot be found 'String' * EL1004E: (pos 34): Type cannot be found 'String'
* </pre></code> The prefix captures the code and the error kind, whilst the position is included if it is known and the * </pre>
*
* </code> The prefix captures the code and the error kind, whilst the position is included if it is known and the
* message has had all relevant inserts applied to it. * message has had all relevant inserts applied to it.
* *
* @author Andy Clement * @author Andy Clement
@ -37,75 +40,82 @@ public enum SpelMessages {
// TODO review if any messages are not used // TODO review if any messages are not used
// TODO sort messages into better groups if possible, sharing a name prefix perhaps // TODO sort messages into better groups if possible, sharing a name prefix perhaps
INITIALIZER_LENGTH_INCORRECT(Kind.ERROR, 1001, "Array constructor call: initializer size of {0} does not match declared length of {1}"), INITIALIZER_LENGTH_INCORRECT(Kind.ERROR, 1001,
TYPE_CONVERSION_ERROR(Kind.ERROR, 1002, "Type conversion problem, cannot convert from {0} to {1}"), "Array constructor call: initializer size of {0} does not match declared length of {1}"), TYPE_CONVERSION_ERROR(
CONSTRUCTOR_NOT_FOUND(Kind.ERROR, 1003, "Constructor call: No suitable constructor on type {0} for arguments {1}"), Kind.ERROR, 1002, "Type conversion problem, cannot convert from {0} to {1}"), CONSTRUCTOR_NOT_FOUND(
TYPE_NOT_FOUND(Kind.ERROR, 1004, "Type cannot be found ''{0}''"), Kind.ERROR, 1003, "Constructor call: No suitable constructor on type {0} for arguments {1}"), TYPE_NOT_FOUND(
ADDITION_NOT_DEFINED(Kind.ERROR, 1005, "Addition not defined between operands of type {0} and {1}"), Kind.ERROR, 1004, "Type cannot be found ''{0}''"), ADDITION_NOT_DEFINED(Kind.ERROR, 1005,
METHOD_NOT_FOUND(Kind.ERROR, 1006, "Method call: Method {0} cannot be found on {1} type"), "Addition not defined between operands of type {0} and {1}"), METHOD_NOT_FOUND(Kind.ERROR, 1006,
ATTEMPTED_METHOD_CALL_ON_NULL_CONTEXT_OBJECT(Kind.ERROR, 1007, "Method call: Attempted to call method {0} on null context object"), "Method call: Method {0} cannot be found on {1} type"), ATTEMPTED_METHOD_CALL_ON_NULL_CONTEXT_OBJECT(
ATTEMPTED_PROPERTY_FIELD_REF_ON_NULL_CONTEXT_OBJECT(Kind.ERROR, 1008, "Field or property reference: Attempted to refer to field or property ''{0}'' on null context object"), Kind.ERROR, 1007, "Method call: Attempted to call method {0} on null context object"), ATTEMPTED_PROPERTY_FIELD_REF_ON_NULL_CONTEXT_OBJECT(
PROPERTY_OR_FIELD_NOT_FOUND(Kind.ERROR, 1009, "Field or property ''{0}'' cannot be found on object of type ''{1}''"), Kind.ERROR, 1008,
PROPERTY_OR_FIELD_SETTER_NOT_FOUND(Kind.ERROR, 1010, "Field or property ''{0}'' cannot be set on object of type ''{1}''"), "Field or property reference: Attempted to refer to field or property ''{0}'' on null context object"), PROPERTY_OR_FIELD_NOT_FOUND(
MULTIPLY_NOT_DEFINED(Kind.ERROR, 1011, "Multiply not defined between operands of type {0} and {1}"), Kind.ERROR, 1009, "Field or property ''{0}'' cannot be found on object of type ''{1}''"), PROPERTY_OR_FIELD_SETTER_NOT_FOUND(
NOT_COMPARABLE(Kind.ERROR, 1012, "Cannot compare instances of {0} and {1}"), Kind.ERROR, 1010, "Field or property ''{0}'' cannot be set on object of type ''{1}''"), MULTIPLY_NOT_DEFINED(
NOT_COMPARABLE_CANNOT_COERCE(Kind.ERROR, 1013, "Cannot compare instances of {0} and {1} because they cannot be coerced to the same type"), Kind.ERROR, 1011, "Multiply not defined between operands of type {0} and {1}"), NOT_COMPARABLE(Kind.ERROR,
VARIABLE_NOT_FOUND(Kind.ERROR, 1014, "Variable named ''{0}'' cannot be found"), 1012, "Cannot compare instances of {0} and {1}"), NOT_COMPARABLE_CANNOT_COERCE(Kind.ERROR, 1013,
INCORRECT_NUMBER_OF_ARGUMENTS_TO_FUNCTION(Kind.ERROR, 1015, "Incorrect number of arguments for function, {0} supplied but function takes {1}"), "Cannot compare instances of {0} and {1} because they cannot be coerced to the same type"), VARIABLE_NOT_FOUND(
NO_SUCH_FUNCTION(Kind.ERROR, 1016, "No such function named ''{0}''"), Kind.ERROR, 1014, "Variable named ''{0}'' cannot be found"), INCORRECT_NUMBER_OF_ARGUMENTS_TO_FUNCTION(
NOT_A_FUNCTION(Kind.ERROR, 1017, "The name ''{0}'' did not map to a function, it mapped to a ''{1}''"), Kind.ERROR, 1015, "Incorrect number of arguments for function, {0} supplied but function takes {1}"), NO_SUCH_FUNCTION(
INVALID_TYPE_FOR_SELECTION(Kind.ERROR, 1018, "Cannot perform selection on input data of type ''{0}''"), Kind.ERROR, 1016, "No such function named ''{0}''"), NOT_A_FUNCTION(Kind.ERROR, 1017,
RESULT_OF_SELECTION_CRITERIA_IS_NOT_BOOLEAN(Kind.ERROR, 1019, "Result of selection criteria is not boolean"), "The name ''{0}'' did not map to a function, it mapped to a ''{1}''"), INVALID_TYPE_FOR_SELECTION(
MODULUS_NOT_DEFINED(Kind.ERROR, 1020, "Modulus not defined between operands of type ''{0}'' and ''{1}''"), Kind.ERROR, 1018, "Cannot perform selection on input data of type ''{0}''"), RESULT_OF_SELECTION_CRITERIA_IS_NOT_BOOLEAN(
NULL_OPERAND_TO_OPERATOR(Kind.ERROR, 1021, "Operand evaluated to null and that is not supported for this operator"), Kind.ERROR, 1019, "Result of selection criteria is not boolean"), MODULUS_NOT_DEFINED(Kind.ERROR, 1020,
NO_SIZE_OR_INITIALIZER_FOR_ARRAY_CONSTRUCTION(Kind.ERROR, 1022, "No array size or initializer was supplied to construct the array"), "Modulus not defined between operands of type ''{0}'' and ''{1}''"), NULL_OPERAND_TO_OPERATOR(Kind.ERROR,
INCORRECT_ELEMENT_TYPE_FOR_ARRAY(Kind.ERROR, 1023, "The array of type ''{0}'' cannot have an element of type ''{1}'' inserted"), 1021, "Operand evaluated to null and that is not supported for this operator"), NO_SIZE_OR_INITIALIZER_FOR_ARRAY_CONSTRUCTION(
BETWEEN_RIGHT_OPERAND_MUST_BE_TWO_ELEMENT_LIST(Kind.ERROR, 1024, "Right operand for the 'between' operator has to be a two-element list"), Kind.ERROR, 1022, "No array size or initializer was supplied to construct the array"), INCORRECT_ELEMENT_TYPE_FOR_ARRAY(
TYPE_NOT_SUPPORTED_BY_PROCESSOR(Kind.ERROR, 1025, "The collection processor ''{0}'' does not understand and input collection of elements of type {1}"), Kind.ERROR, 1023, "The array of type ''{0}'' cannot have an element of type ''{1}'' inserted"), BETWEEN_RIGHT_OPERAND_MUST_BE_TWO_ELEMENT_LIST(
UNABLE_TO_ACCESS_FIELD(Kind.ERROR, 1026, "Unable to access field ''{0}'' on type ''{1}''"), Kind.ERROR, 1024, "Right operand for the 'between' operator has to be a two-element list"), TYPE_NOT_SUPPORTED_BY_PROCESSOR(
UNABLE_TO_ACCESS_PROPERTY_THROUGH_GETTER(Kind.ERROR, 1027, "Unable to access property ''{0}'' through getter on type ''{1}''"), Kind.ERROR, 1025,
UNABLE_TO_ACCESS_PROPERTY_THROUGH_SETTER(Kind.ERROR, 1028, "Unable to access property ''{0}'' through setter on type ''{1}''"), "The collection processor ''{0}'' does not understand and input collection of elements of type {1}"), UNABLE_TO_ACCESS_FIELD(
INVALID_PATTERN(Kind.ERROR, 1029, "Pattern is not valid ''{0}''"), Kind.ERROR, 1026, "Unable to access field ''{0}'' on type ''{1}''"), UNABLE_TO_ACCESS_PROPERTY_THROUGH_GETTER(
RECOGNITION_ERROR(Kind.ERROR, 1030,"Recognition error: {0}"), // TODO poor message when a recognition exception occurs Kind.ERROR, 1027, "Unable to access property ''{0}'' through getter on type ''{1}''"), UNABLE_TO_ACCESS_PROPERTY_THROUGH_SETTER(
PROJECTION_NOT_SUPPORTED_ON_TYPE(Kind.ERROR, 1031, "Projection is not supported on the type ''{0}''"), Kind.ERROR, 1028, "Unable to access property ''{0}'' through setter on type ''{1}''"), INVALID_PATTERN(
ARGLIST_SHOULD_NOT_BE_EVALUATED(Kind.ERROR, 1032, "The argument list of a lambda expression should never have getValue() called upon it"), Kind.ERROR, 1029, "Pattern is not valid ''{0}''"), RECOGNITION_ERROR(Kind.ERROR, 1030,
MAPENTRY_SHOULD_NOT_BE_EVALUATED(Kind.ERROR, 1033, "A map entry should never have getValue() called upon it"), "Recognition error: {0}"), // TODO poor message when a recognition exception occurs
EXCEPTION_DURING_PROPERTY_READ(Kind.ERROR, 1034, "A problem occurred whilst attempting to access the property ''{0}'': ''{1}''"), PROJECTION_NOT_SUPPORTED_ON_TYPE(Kind.ERROR, 1031, "Projection is not supported on the type ''{0}''"), ARGLIST_SHOULD_NOT_BE_EVALUATED(
EXCEPTION_DURING_CONSTRUCTOR_INVOCATION(Kind.ERROR, 1035, "A problem occurred whilst attempting to construct ''{0}'': ''{1}''"), Kind.ERROR, 1032, "The argument list of a lambda expression should never have getValue() called upon it"), MAPENTRY_SHOULD_NOT_BE_EVALUATED(
DATE_CANNOT_BE_PARSED(Kind.ERROR, 1036, "Unable to parse date ''{0}'' using format ''{1}''"), Kind.ERROR, 1033, "A map entry should never have getValue() called upon it"), EXCEPTION_DURING_PROPERTY_READ(
FUNCTION_REFERENCE_CANNOT_BE_INVOKED(Kind.ERROR, 1037, "The function ''{0}'' mapped to an object of type ''{1}'' which cannot be invoked"), Kind.ERROR, 1034, "A problem occurred whilst attempting to access the property ''{0}'': ''{1}''"), EXCEPTION_DURING_CONSTRUCTOR_INVOCATION(
FUNCTION_NOT_DEFINED(Kind.ERROR, 1038, "The function ''{0}'' could not be found"), Kind.ERROR, 1035, "A problem occurred whilst attempting to construct ''{0}'': ''{1}''"), DATE_CANNOT_BE_PARSED(
EXCEPTION_DURING_FUNCTION_CALL(Kind.ERROR, 1039, "A problem occurred whilst attempting to invoke the function ''{0}'': ''{1}''"), Kind.ERROR, 1036, "Unable to parse date ''{0}'' using format ''{1}''"), FUNCTION_REFERENCE_CANNOT_BE_INVOKED(
ARRAY_INDEX_OUT_OF_BOUNDS(Kind.ERROR, 1040, "The array has ''{0}'' elements, index ''{1}'' is invalid"), Kind.ERROR, 1037, "The function ''{0}'' mapped to an object of type ''{1}'' which cannot be invoked"), FUNCTION_NOT_DEFINED(
COLLECTION_INDEX_OUT_OF_BOUNDS(Kind.ERROR, 1041, "The collection has ''{0}'' elements, index ''{1}'' is invalid"), Kind.ERROR, 1038, "The function ''{0}'' could not be found"), EXCEPTION_DURING_FUNCTION_CALL(Kind.ERROR,
STRING_INDEX_OUT_OF_BOUNDS(Kind.ERROR, 1042, "The string has ''{0}'' characters, index ''{1}'' is invalid"), 1039, "A problem occurred whilst attempting to invoke the function ''{0}'': ''{1}''"), ARRAY_INDEX_OUT_OF_BOUNDS(
INDEXING_NOT_SUPPORTED_FOR_TYPE(Kind.ERROR, 1043, "Indexing into type ''{0}'' is not supported"), Kind.ERROR, 1040, "The array has ''{0}'' elements, index ''{1}'' is invalid"), COLLECTION_INDEX_OUT_OF_BOUNDS(
OPERATOR_IN_CANNOT_DETERMINE_MEMBERSHIP(Kind.ERROR, 1044, "Operator 'in' not implemented for detecting membership of a ''{0}'' in a ''{1}''"), Kind.ERROR, 1041, "The collection has ''{0}'' elements, index ''{1}'' is invalid"), STRING_INDEX_OUT_OF_BOUNDS(
CANNOT_NEGATE_TYPE(Kind.ERROR, 1045, "Cannot determine negation of type ''{0}''"), Kind.ERROR, 1042, "The string has ''{0}'' characters, index ''{1}'' is invalid"), INDEXING_NOT_SUPPORTED_FOR_TYPE(
CUT_ARGUMENTS_MUST_BE_INTS(Kind.ERROR, 1046, "Both arguments to the cut() processor must be Integers, but they are ''{0}'' and ''{1}''"), Kind.ERROR, 1043, "Indexing into type ''{0}'' is not supported"), OPERATOR_IN_CANNOT_DETERMINE_MEMBERSHIP(
SOUNDSLIKE_NEEDS_STRING_OPERAND(Kind.ERROR, 1047, "The soundslike operator needs String operands, but found a ''{0}''"), Kind.ERROR, 1044, "Operator 'in' not implemented for detecting membership of a ''{0}'' in a ''{1}''"), CANNOT_NEGATE_TYPE(
IS_OPERATOR_NEEDS_CLASS_OPERAND(Kind.ERROR, 1048, "The operator 'is' needs the right operand to be a class, not a ''{0}''"), Kind.ERROR, 1045, "Cannot determine negation of type ''{0}''"), CUT_ARGUMENTS_MUST_BE_INTS(Kind.ERROR,
LOCAL_VARIABLE_NOT_DEFINED(Kind.ERROR, 1049, "Local variable named ''{0}'' could not be found"), 1046, "Both arguments to the cut() processor must be Integers, but they are ''{0}'' and ''{1}''"), SOUNDSLIKE_NEEDS_STRING_OPERAND(
EXCEPTION_DURING_METHOD_INVOCATION(Kind.ERROR, 1050,"A problem occurred when trying to execute method ''{0}'' on object of type ''{1}'': ''{2}''"), Kind.ERROR, 1047, "The soundslike operator needs String operands, but found a ''{0}''"), INSTANCEOF_OPERATOR_NEEDS_CLASS_OPERAND(
PLACEHOLDER_SHOULD_NEVER_BE_EVALUATED(Kind.ERROR, 1051, "InternalError: A placeholder node in the Ast should never be evaluated!"), Kind.ERROR, 1048, "The operator 'instanceof' needs the right operand to be a class, not a ''{0}''"), LOCAL_VARIABLE_NOT_DEFINED(
OPERATOR_NOT_SUPPORTED_BETWEEN_TYPES(Kind.ERROR, 1052, "The operator ''{0}'' is not supported between objects of type ''{1}'' and ''{2}''"), Kind.ERROR, 1049, "Local variable named ''{0}'' could not be found"), EXCEPTION_DURING_METHOD_INVOCATION(
UNEXPECTED_PROBLEM_INVOKING_OPERATOR(Kind.ERROR, 1054, "Unexpected problem invoking operator ''{0}'' between objects of type ''{1}'' and ''{2}'': {3}"), Kind.ERROR, 1050,
PROBLEM_LOCATING_METHOD(Kind.ERROR, 1055, "Problem locating method {0} cannot on type {1}"), "A problem occurred when trying to execute method ''{0}'' on object of type ''{1}'': ''{2}''"), PLACEHOLDER_SHOULD_NEVER_BE_EVALUATED(
PROBLEM_LOCATING_CONSTRUCTOR(Kind.ERROR, 1056, "A problem occurred whilst attempting to construct an object of type ''{0}'' using arguments ''{1}''"), Kind.ERROR, 1051, "InternalError: A placeholder node in the Ast should never be evaluated!"), OPERATOR_NOT_SUPPORTED_BETWEEN_TYPES(
INVALID_FIRST_OPERAND_FOR_LIKE_OPERATOR(Kind.ERROR, 1057, "First operand to like operator must be a string. ''{0}'' is not"), Kind.ERROR, 1052, "The operator ''{0}'' is not supported between objects of type ''{1}'' and ''{2}''"), UNEXPECTED_PROBLEM_INVOKING_OPERATOR(
INVALID_SECOND_OPERAND_FOR_LIKE_OPERATOR(Kind.ERROR, 1058, "Second operand to like operator must be a string (regex). ''{0}'' is not"), Kind.ERROR, 1054,
SETVALUE_NOT_SUPPORTED(Kind.ERROR, 1059, "setValue(ExpressionState, Object) not implemented for ''{0}'' (''{1}''"), "Unexpected problem invoking operator ''{0}'' between objects of type ''{1}'' and ''{2}'': {3}"), PROBLEM_LOCATING_METHOD(
TYPE_NAME_EXPECTED_FOR_ARRAY_CONSTRUCTION(Kind.ERROR, 1060, "Expected the type of the new array to be specified as a String but found ''{0}''"), Kind.ERROR, 1055, "Problem locating method {0} cannot on type {1}"), PROBLEM_LOCATING_CONSTRUCTOR(
PROBLEM_DURING_TYPE_CONVERSION(Kind.ERROR, 1061, "Problem occurred during type conversion: {0}"), Kind.ERROR, 1056,
MULTIPLE_POSSIBLE_METHODS(Kind.ERROR, 1062, "Method call of ''{0}'' is ambiguous, supported type conversions allow multiple variants to match"), "A problem occurred whilst attempting to construct an object of type ''{0}'' using arguments ''{1}''"), INVALID_FIRST_OPERAND_FOR_LIKE_OPERATOR(
EXCEPTION_DURING_PROPERTY_WRITE(Kind.ERROR, 1063, "A problem occurred whilst attempting to set the property ''{0}'': ''{1}''"), Kind.ERROR, 1057, "First operand to like operator must be a string. ''{0}'' is not"), INVALID_SECOND_OPERAND_FOR_LIKE_OPERATOR(
NOT_AN_INTEGER(Kind.ERROR, 1064, "The value ''{0}'' cannot be parsed as an int"), Kind.ERROR, 1058, "Second operand to like operator must be a string (regex). ''{0}'' is not"), SETVALUE_NOT_SUPPORTED(
NOT_A_LONG(Kind.ERROR, 1065, "The value ''{0}'' cannot be parsed as a long"), Kind.ERROR, 1059, "setValue(ExpressionState, Object) not implemented for ''{0}'' (''{1}''"), TYPE_NAME_EXPECTED_FOR_ARRAY_CONSTRUCTION(
PARSE_PROBLEM(Kind.ERROR, 1066, "Error occurred during expression parse: {0}"), Kind.ERROR, 1060, "Expected the type of the new array to be specified as a String but found ''{0}''"), PROBLEM_DURING_TYPE_CONVERSION(
INVALID_FIRST_OPERAND_FOR_MATCHES_OPERATOR(Kind.ERROR, 1067, "First operand to matches operator must be a string. ''{0}'' is not"), Kind.ERROR, 1061, "Problem occurred during type conversion: {0}"), MULTIPLE_POSSIBLE_METHODS(Kind.ERROR,
INVALID_SECOND_OPERAND_FOR_MATCHES_OPERATOR(Kind.ERROR, 1068, "Second operand to matches operator must be a string. ''{0}'' is not"), 1062, "Method call of ''{0}'' is ambiguous, supported type conversions allow multiple variants to match"), EXCEPTION_DURING_PROPERTY_WRITE(
FUNCTION_MUST_BE_STATIC(Kind.ERROR, 1069, "Only static methods can be called via function references. The method ''{0}'' referred to by name ''{1}'' is not static.") Kind.ERROR, 1063, "A problem occurred whilst attempting to set the property ''{0}'': ''{1}''"), NOT_AN_INTEGER(
; Kind.ERROR, 1064, "The value ''{0}'' cannot be parsed as an int"), NOT_A_LONG(Kind.ERROR, 1065,
"The value ''{0}'' cannot be parsed as a long"), PARSE_PROBLEM(Kind.ERROR, 1066,
"Error occurred during expression parse: {0}"), INVALID_FIRST_OPERAND_FOR_MATCHES_OPERATOR(Kind.ERROR,
1067, "First operand to matches operator must be a string. ''{0}'' is not"), INVALID_SECOND_OPERAND_FOR_MATCHES_OPERATOR(
Kind.ERROR, 1068, "Second operand to matches operator must be a string. ''{0}'' is not"), FUNCTION_MUST_BE_STATIC(
Kind.ERROR,
1069,
"Only static methods can be called via function references. The method ''{0}'' referred to by name ''{1}'' is not static.");
private Kind kind; private Kind kind;
private int code; private int code;

View File

@ -22,20 +22,20 @@ import org.springframework.expression.spel.SpelException;
import org.springframework.expression.spel.SpelMessages; import org.springframework.expression.spel.SpelMessages;
/** /**
* The operator 'is' checks if an object is of the class specified in the right hand operand, in the same way that * The operator 'instanceof' checks if an object is of the class specified in the right hand operand, in the same way
* instanceof does in Java. * that instanceof does in Java.
* *
* @author Andy Clement * @author Andy Clement
*/ */
public class OperatorIs extends Operator { public class OperatorInstanceof extends Operator {
public OperatorIs(Token payload) { public OperatorInstanceof(Token payload) {
super(payload); super(payload);
} }
@Override @Override
public String getOperatorName() { public String getOperatorName() {
return "is"; return "instanceof";
} }
/** /**
@ -55,7 +55,7 @@ public class OperatorIs extends Operator {
} }
if (right == null || !(right instanceof Class<?>)) { if (right == null || !(right instanceof Class<?>)) {
throw new SpelException(getRightOperand().getCharPositionInLine(), throw new SpelException(getRightOperand().getCharPositionInLine(),
SpelMessages.IS_OPERATOR_NEEDS_CLASS_OPERAND, (right == null ? "null" : right.getClass().getName())); SpelMessages.INSTANCEOF_OPERATOR_NEEDS_CLASS_OPERAND, (right == null ? "null" : right.getClass().getName()));
} }
Class<?> rightClass = (Class<?>) right; Class<?> rightClass = (Class<?>) right;
return rightClass.isAssignableFrom(left.getClass()); return rightClass.isAssignableFrom(left.getClass());

View File

@ -4,8 +4,6 @@ options {
language = Java; language = Java;
output=AST; output=AST;
k=2; k=2;
//caseSensitive = false;
//backtrack=true;
} }
tokens { tokens {
@ -29,9 +27,6 @@ tokens {
METHOD; METHOD;
ADD; ADD;
SUBTRACT; SUBTRACT;
// MULTIPLY;
// DIVIDE;
// MODULUS;
NUMBER; NUMBER;
} }
@ -55,19 +50,15 @@ tokens {
expr: expression EOF!; expr: expression EOF!;
SEMIRPAREN : ';)'; // recoveryrelated: allows us to cope with a rogue superfluous semicolon before the rparen in an expression list
expression : expression :
logicalOrExpression logicalOrExpression
( (ASSIGN^ logicalOrExpression) ( (ASSIGN^ logicalOrExpression)
| (DEFAULT^ logicalOrExpression) | (DEFAULT^ logicalOrExpression)
| (QMARK^ expression COLON! expression))?; | (QMARK^ expression COLON! expression))?;
parenExpr : LPAREN! expression RPAREN!;// (ROGUE! | RPAREN!); parenExpr : LPAREN! expression RPAREN!;
logicalOrExpression logicalOrExpression
// possible extra info we could use for better error messages
: logicalAndExpression (OR^ logicalAndExpression)*; : logicalAndExpression (OR^ logicalAndExpression)*;
logicalAndExpression logicalAndExpression
@ -78,7 +69,6 @@ relationalExpression : sumExpression (relationalOperator^ sumExpression)?;
sumExpression sumExpression
: productExpression ( (PLUS^ | MINUS^) productExpression)*; : productExpression ( (PLUS^ | MINUS^) productExpression)*;
// TODO could really do with changing ast node types here
productExpression productExpression
: powerExpr ((STAR^ | DIV^| MOD^) powerExpr)* ; : powerExpr ((STAR^ | DIV^| MOD^) powerExpr)* ;
@ -234,7 +224,7 @@ relationalOperator
| GREATER_THAN | GREATER_THAN
| GREATER_THAN_OR_EQUAL | GREATER_THAN_OR_EQUAL
| IN | IN
| IS | INSTANCEOF
| BETWEEN | BETWEEN
| MATCHES | MATCHES
; ;
@ -247,7 +237,7 @@ LESS_THAN_OR_EQUAL: '<=';
GREATER_THAN: '>'; GREATER_THAN: '>';
GREATER_THAN_OR_EQUAL: '>='; GREATER_THAN_OR_EQUAL: '>=';
IN: 'in'; IN: 'in';
IS: 'is'; INSTANCEOF: 'instanceof';
BETWEEN:'between'; BETWEEN:'between';
MATCHES:'matches'; MATCHES:'matches';
NULL_LITERAL: 'null'; NULL_LITERAL: 'null';

View File

@ -1,82 +1,81 @@
GREATER_THAN_OR_EQUAL=69 GREATER_THAN_OR_EQUAL=68
SELECT_FIRST=50 SELECT_FIRST=49
COMMA=44
HOLDER=11 HOLDER=11
GREATER_THAN=68 COMMA=43
TYPE=52 GREATER_THAN=67
TYPE=51
EXPRESSIONLIST=4 EXPRESSIONLIST=4
MINUS=35 MINUS=34
MAP_ENTRY=20 MAP_ENTRY=20
SELECT_LAST=51 SELECT_LAST=50
NUMBER=24 NUMBER=24
LESS_THAN=66 LESS_THAN=65
BANG=40 BANG=39
FALSE=60 FALSE=59
METHOD=21 METHOD=21
PROPERTY_OR_FIELD=8 PROPERTY_OR_FIELD=8
LBRACKET=45 LBRACKET=44
INDEXER=9 INDEXER=9
MOD=38 MOD=37
CONSTRUCTOR_ARRAY=12 CONSTRUCTOR_ARRAY=12
FUNCTIONREF=14 FUNCTIONREF=14
NULL_LITERAL=56 NULL_LITERAL=55
NAMED_ARGUMENT=13 NAMED_ARGUMENT=13
OR=32 OR=31
PIPE=75 PIPE=74
DOT=41 DOT=40
RCURLY=48 RCURLY=47
EXPRESSION=6 EXPRESSION=6
AND=33 AND=32
LCURLY=53 LCURLY=52
REAL_TYPE_SUFFIX=83 REAL_TYPE_SUFFIX=82
STRING_LITERAL=54 STRING_LITERAL=53
SELECT=49 SELECT=48
QUALIFIED_IDENTIFIER=7 QUALIFIED_IDENTIFIER=7
RBRACKET=46 RBRACKET=45
SUBTRACT=23 SUBTRACT=23
ASSIGN=26 ASSIGN=25
BETWEEN=72 INSTANCEOF=70
RPAREN=31 BETWEEN=71
SIGN=84 RPAREN=30
LPAREN=30 SIGN=83
HEX_DIGIT=63 LPAREN=29
PLUS=34 HEX_DIGIT=62
PLUS=33
LIST_INITIALIZER=18 LIST_INITIALIZER=18
APOS=76 APOS=75
INTEGER_LITERAL=5 INTEGER_LITERAL=5
AT=80 AT=79
ID=43 ID=42
NOT_EQUAL=65 NOT_EQUAL=64
RANGE=16 RANGE=16
POWER=39 POWER=38
TYPEREF=15 TYPEREF=15
DECIMAL_DIGIT=61 DECIMAL_DIGIT=60
WS=78 WS=77
IS=71 DOLLAR=78
DOLLAR=79 LESS_THAN_OR_EQUAL=66
LESS_THAN_OR_EQUAL=67 DQ_STRING_LITERAL=54
SEMIRPAREN=25 HEXADECIMAL_INTEGER_LITERAL=56
DQ_STRING_LITERAL=55
HEXADECIMAL_INTEGER_LITERAL=57
MAP_INITIALIZER=19 MAP_INITIALIZER=19
IN=70 IN=69
SEMI=74 SEMI=73
CONSTRUCTOR=10 CONSTRUCTOR=10
INTEGER_TYPE_SUFFIX=62 INTEGER_TYPE_SUFFIX=61
EQUAL=64 EQUAL=63
MATCHES=73 MATCHES=72
DOT_ESCAPED=77 DOT_ESCAPED=76
UPTO=81 UPTO=80
QMARK=28 QMARK=27
PROJECT=47 PROJECT=46
DEFAULT=27 DEFAULT=26
COLON=29 COLON=28
DIV=37 DIV=36
STAR=36 STAR=35
REAL_LITERAL=58 REAL_LITERAL=57
VARIABLEREF=17 VARIABLEREF=17
EXPONENT_PART=82 EXPONENT_PART=81
TRUE=59 TRUE=58
ADD=22 ADD=22
POUND=42 POUND=41
'new'=85 'new'=84

View File

@ -5,143 +5,140 @@ options {
} }
@header {package org.springframework.expression.spel.generated;} @header {package org.springframework.expression.spel.generated;}
T85 : 'new' ; T84 : 'new' ;
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 58 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 214
SEMIRPAREN : ';)'; // recoveryrelated: allows us to cope with a rogue superfluous semicolon before the rparen in an expression list
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 224
INTEGER_LITERAL INTEGER_LITERAL
: (DECIMAL_DIGIT)+ (INTEGER_TYPE_SUFFIX)?; : (DECIMAL_DIGIT)+ (INTEGER_TYPE_SUFFIX)?;
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 227 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 217
HEXADECIMAL_INTEGER_LITERAL : ('0x' | '0X') (HEX_DIGIT)+ (INTEGER_TYPE_SUFFIX)?; HEXADECIMAL_INTEGER_LITERAL : ('0x' | '0X') (HEX_DIGIT)+ (INTEGER_TYPE_SUFFIX)?;
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 242 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 232
ASSIGN: '='; ASSIGN: '=';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 243 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 233
EQUAL: '=='; EQUAL: '==';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 244 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 234
NOT_EQUAL: '!='; NOT_EQUAL: '!=';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 245 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 235
LESS_THAN: '<'; LESS_THAN: '<';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 246 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 236
LESS_THAN_OR_EQUAL: '<='; LESS_THAN_OR_EQUAL: '<=';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 247 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 237
GREATER_THAN: '>'; GREATER_THAN: '>';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 248 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 238
GREATER_THAN_OR_EQUAL: '>='; GREATER_THAN_OR_EQUAL: '>=';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 249 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 239
IN: 'in'; IN: 'in';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 250 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 240
IS: 'is'; INSTANCEOF: 'instanceof';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 251 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 241
BETWEEN:'between'; BETWEEN:'between';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 252 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 242
MATCHES:'matches'; MATCHES:'matches';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 253 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 243
NULL_LITERAL: 'null'; NULL_LITERAL: 'null';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 255 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 245
SEMI: ';'; SEMI: ';';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 256 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 246
DOT: '.'; DOT: '.';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 257 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 247
COMMA: ','; COMMA: ',';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 258 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 248
LPAREN: '('; LPAREN: '(';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 259 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 249
RPAREN: ')'; RPAREN: ')';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 260 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 250
LCURLY: '{'; LCURLY: '{';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 261 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 251
RCURLY: '}'; RCURLY: '}';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 262 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 252
LBRACKET: '['; LBRACKET: '[';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 263 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 253
RBRACKET: ']'; RBRACKET: ']';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 264 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 254
PIPE: '|'; PIPE: '|';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 266 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 256
AND: 'and'; AND: 'and';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 267 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 257
OR: 'or'; OR: 'or';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 268 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 258
FALSE: 'false'; FALSE: 'false';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 269 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 259
TRUE: 'true'; TRUE: 'true';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 271 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 261
PLUS: '+'; PLUS: '+';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 272 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 262
MINUS: '-'; MINUS: '-';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 273 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 263
DIV: '/'; DIV: '/';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 274 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 264
STAR: '*'; STAR: '*';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 275 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 265
MOD: '%'; MOD: '%';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 276 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 266
POWER: '^'; POWER: '^';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 277 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 267
BANG: '!'; BANG: '!';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 278 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 268
POUND: '#'; POUND: '#';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 279 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 269
QMARK: '?'; QMARK: '?';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 280 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 270
DEFAULT: '??'; DEFAULT: '??';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 281 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 271
PROJECT: '!{'; PROJECT: '!{';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 282 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 272
SELECT: '?{'; SELECT: '?{';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 283 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 273
SELECT_FIRST: '^{'; SELECT_FIRST: '^{';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 284 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 274
SELECT_LAST: '${'; SELECT_LAST: '${';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 285 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 275
TYPE: 'T('; TYPE: 'T(';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 287 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 277
STRING_LITERAL: '\''! (APOS|~'\'')* '\''!; STRING_LITERAL: '\''! (APOS|~'\'')* '\''!;
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 288 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 278
DQ_STRING_LITERAL: '"'! (~'"')* '"'!; DQ_STRING_LITERAL: '"'! (~'"')* '"'!;
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 289 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 279
ID: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9'|DOT_ESCAPED)*; ID: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9'|DOT_ESCAPED)*;
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 290 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 280
DOT_ESCAPED: '\\.'; DOT_ESCAPED: '\\.';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 291 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 281
WS: ( ' ' | '\t' | '\n' |'\r')+ { $channel=HIDDEN; } ; WS: ( ' ' | '\t' | '\n' |'\r')+ { $channel=HIDDEN; } ;
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 292 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 282
DOLLAR: '$'; DOLLAR: '$';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 293 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 283
AT: '@'; AT: '@';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 294 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 284
UPTO: '..'; UPTO: '..';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 295 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 285
COLON: ':'; COLON: ':';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 298 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 288
REAL_LITERAL : REAL_LITERAL :
('.' (DECIMAL_DIGIT)+ (EXPONENT_PART)? (REAL_TYPE_SUFFIX)?) | ('.' (DECIMAL_DIGIT)+ (EXPONENT_PART)? (REAL_TYPE_SUFFIX)?) |
((DECIMAL_DIGIT)+ '.' (DECIMAL_DIGIT)+ (EXPONENT_PART)? (REAL_TYPE_SUFFIX)?) | ((DECIMAL_DIGIT)+ '.' (DECIMAL_DIGIT)+ (EXPONENT_PART)? (REAL_TYPE_SUFFIX)?) |
((DECIMAL_DIGIT)+ (EXPONENT_PART) (REAL_TYPE_SUFFIX)?) | ((DECIMAL_DIGIT)+ (EXPONENT_PART) (REAL_TYPE_SUFFIX)?) |
((DECIMAL_DIGIT)+ (REAL_TYPE_SUFFIX)); ((DECIMAL_DIGIT)+ (REAL_TYPE_SUFFIX));
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 304 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 294
fragment APOS : '\''! '\''; fragment APOS : '\''! '\'';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 305 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 295
fragment DECIMAL_DIGIT : '0'..'9' ; fragment DECIMAL_DIGIT : '0'..'9' ;
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 306 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 296
fragment INTEGER_TYPE_SUFFIX : ( 'L' | 'l' ); fragment INTEGER_TYPE_SUFFIX : ( 'L' | 'l' );
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 307 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 297
fragment HEX_DIGIT : '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'|'A'|'B'|'C'|'D'|'E'|'F'|'a'|'b'|'c'|'d'|'e'|'f'; fragment HEX_DIGIT : '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'|'A'|'B'|'C'|'D'|'E'|'F'|'a'|'b'|'c'|'d'|'e'|'f';
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 309 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 299
fragment EXPONENT_PART : 'e' (SIGN)* (DECIMAL_DIGIT)+ | 'E' (SIGN)* (DECIMAL_DIGIT)+ ; fragment EXPONENT_PART : 'e' (SIGN)* (DECIMAL_DIGIT)+ | 'E' (SIGN)* (DECIMAL_DIGIT)+ ;
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 310 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 300
fragment SIGN : '+' | '-' ; fragment SIGN : '+' | '-' ;
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 311 // $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 301
fragment REAL_TYPE_SUFFIX : 'F' | 'f' | 'D' | 'd'; fragment REAL_TYPE_SUFFIX : 'F' | 'f' | 'D' | 'd';

View File

@ -40,7 +40,7 @@ import org.springframework.expression.spel.ast.OperatorGreaterThan;
import org.springframework.expression.spel.ast.OperatorGreaterThanOrEqual; import org.springframework.expression.spel.ast.OperatorGreaterThanOrEqual;
import org.springframework.expression.spel.ast.OperatorIn; import org.springframework.expression.spel.ast.OperatorIn;
import org.springframework.expression.spel.ast.OperatorInequality; import org.springframework.expression.spel.ast.OperatorInequality;
import org.springframework.expression.spel.ast.OperatorIs; import org.springframework.expression.spel.ast.OperatorInstanceof;
import org.springframework.expression.spel.ast.OperatorLessThan; import org.springframework.expression.spel.ast.OperatorLessThan;
import org.springframework.expression.spel.ast.OperatorLessThanOrEqual; import org.springframework.expression.spel.ast.OperatorLessThanOrEqual;
import org.springframework.expression.spel.ast.OperatorMatches; import org.springframework.expression.spel.ast.OperatorMatches;
@ -170,8 +170,8 @@ public class SpelTreeAdaptor extends CommonTreeAdaptor {
return new OperatorBetween(payload); return new OperatorBetween(payload);
case SpringExpressionsLexer.MATCHES: case SpringExpressionsLexer.MATCHES:
return new OperatorMatches(payload); return new OperatorMatches(payload);
case SpringExpressionsLexer.IS: case SpringExpressionsLexer.INSTANCEOF:
return new OperatorIs(payload); return new OperatorInstanceof(payload);
case SpringExpressionsLexer.RPAREN: case SpringExpressionsLexer.RPAREN:
return new Placeholder(payload); return new Placeholder(payload);

View File

@ -72,27 +72,27 @@ public class EvaluationTests extends ExpressionTestCase {
} }
public void testRelOperatorsIs01() { public void testRelOperatorsIs01() {
evaluate("'xyz' is T(int)", "false", Boolean.class); evaluate("'xyz' instanceof T(int)", "false", Boolean.class);
} }
public void testRelOperatorsIs02() { public void testRelOperatorsIs02() {
evaluate("{1, 2, 3, 4, 5} is T(List)", "true", Boolean.class); evaluate("{1, 2, 3, 4, 5} instanceof T(List)", "true", Boolean.class);
} }
public void testRelOperatorsIs03() { public void testRelOperatorsIs03() {
evaluate("{1, 2, 3, 4, 5} is T(List)", "true", Boolean.class); evaluate("{1, 2, 3, 4, 5} instanceof T(List)", "true", Boolean.class);
} }
public void testRelOperatorsIs04() { public void testRelOperatorsIs04() {
evaluate("null is T(String)", "false", Boolean.class); evaluate("null instanceof T(String)", "false", Boolean.class);
} }
public void testRelOperatorsIs05() { public void testRelOperatorsIs05() {
evaluate("null is T(Integer)", "false", Boolean.class); evaluate("null instanceof T(Integer)", "false", Boolean.class);
} }
public void testRelOperatorsIs06() { public void testRelOperatorsIs06() {
evaluateAndCheckError("'A' is null", SpelMessages.IS_OPERATOR_NEEDS_CLASS_OPERAND, 7, "null"); evaluateAndCheckError("'A' instanceof null", SpelMessages.INSTANCEOF_OPERATOR_NEEDS_CLASS_OPERAND, 15, "null");
} }
public void testRelOperatorsMatches01() { public void testRelOperatorsMatches01() {

View File

@ -48,7 +48,8 @@ public class ParserErrorMessagesTests extends ExpressionTestCase {
public void testBrokenExpression07() { public void testBrokenExpression07() {
// T() can only take an identifier (possibly qualified), not a literal // T() can only take an identifier (possibly qualified), not a literal
// message ought to say identifier rather than ID // message ought to say identifier rather than ID
parseAndCheckError("null is T('a')", SpelMessages.PARSE_PROBLEM, 10, "mismatched input ''a'' expecting ID"); // POOR parseAndCheckError("null instanceof T('a')", SpelMessages.PARSE_PROBLEM, 18,
"mismatched input ''a'' expecting ID"); // POOR
} }
} }

View File

@ -146,11 +146,11 @@ public class ParsingTests extends TestCase {
}// true }// true
public void testRelOperatorsIs01() { public void testRelOperatorsIs01() {
parseCheck("'xyz' is int", "('xyz' is int)"); parseCheck("'xyz' instanceof int", "('xyz' instanceof int)");
}// false }// false
public void testRelOperatorsIs02() { public void testRelOperatorsIs02() {
parseCheck("{1, 2, 3, 4, 5} is List", "({1,2,3,4,5} is List)"); parseCheck("{1, 2, 3, 4, 5} instanceof List", "({1,2,3,4,5} instanceof List)");
}// true }// true
public void testRelOperatorsMatches01() { public void testRelOperatorsMatches01() {