Removing functionality. Removed soundslike/distanceto/like operators
This commit is contained in:
		
							parent
							
								
									59a4427525
								
							
						
					
					
						commit
						4d43768889
					
				| 
						 | 
				
			
			@ -19,7 +19,6 @@ would have taken?  At the moment ternary expressions are just considered NOT wri
 | 
			
		|||
 | 
			
		||||
Syntax
 | 
			
		||||
 | 
			
		||||
- are distanceto or soundslike any use?
 | 
			
		||||
- should the 'is' operator change to 'instanceof' ?
 | 
			
		||||
- in this expression we hit the problem of not being able to write chars, since '' always means string:
 | 
			
		||||
  evaluate("new java.lang.String('hello').charAt(2).equals('l'.charAt(0))", true, Boolean.class);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,108 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2004-2008 the original author or authors.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
 * you may not use this file except in compliance with the License.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *      http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
package org.springframework.expression.spel.ast;
 | 
			
		||||
 | 
			
		||||
import org.antlr.runtime.Token;
 | 
			
		||||
import org.springframework.expression.EvaluationException;
 | 
			
		||||
import org.springframework.expression.spel.ExpressionState;
 | 
			
		||||
import org.springframework.expression.spel.SpelException;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The distanceto operator uses an implementation of the levenshtein distance measurement for determining the 'edit
 | 
			
		||||
 * distance' between two strings (the two operands to distanceto). http://en.wikipedia.org/wiki/Levenshtein_distance
 | 
			
		||||
 * 
 | 
			
		||||
 * @author Andy Clement
 | 
			
		||||
 */
 | 
			
		||||
public class OperatorDistanceTo extends Operator {
 | 
			
		||||
 | 
			
		||||
	private final static boolean DEBUG = false;
 | 
			
		||||
 | 
			
		||||
	public OperatorDistanceTo(Token payload) {
 | 
			
		||||
		super(payload);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String getOperatorName() {
 | 
			
		||||
		return "distanceto";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public Object getValue(ExpressionState state) throws EvaluationException {
 | 
			
		||||
		try {
 | 
			
		||||
			Object left = getLeftOperand().getValue(state);
 | 
			
		||||
			Object right = getRightOperand().getValue(state);
 | 
			
		||||
			return computeDistanceTo((String) left, (String) right);
 | 
			
		||||
		} catch (SpelException ee) {
 | 
			
		||||
			throw ee;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private int computeDistanceTo(String from, String to) {
 | 
			
		||||
		if (from.equals(to))
 | 
			
		||||
			return 0;
 | 
			
		||||
		int[][] d = new int[from.length() + 1][to.length() + 1];
 | 
			
		||||
 | 
			
		||||
		for (int i = 0; i <= from.length(); i++)
 | 
			
		||||
			d[i][0] = i;
 | 
			
		||||
 | 
			
		||||
		for (int j = 0; j <= to.length(); j++)
 | 
			
		||||
			d[0][j] = j;
 | 
			
		||||
 | 
			
		||||
		for (int i = 1; i <= from.length(); i++) {
 | 
			
		||||
			for (int j = 1; j <= to.length(); j++) {
 | 
			
		||||
				int cost;
 | 
			
		||||
				if (from.charAt(i - 1) == to.charAt(j - 1))
 | 
			
		||||
					cost = 0;
 | 
			
		||||
				else
 | 
			
		||||
					cost = 1;
 | 
			
		||||
				d[i][j] = min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + cost);// del,ins,subst
 | 
			
		||||
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if (DEBUG) {
 | 
			
		||||
			// Display the table of values
 | 
			
		||||
			System.out.print("    ");
 | 
			
		||||
			for (int j = 0; j < from.length(); j++) {
 | 
			
		||||
				System.out.print(from.charAt(j) + " ");
 | 
			
		||||
			}
 | 
			
		||||
			System.out.println();
 | 
			
		||||
			for (int j = 0; j < to.length() + 1; j++) {
 | 
			
		||||
				System.out.print((j > 0 ? to.charAt(j - 1) : " ") + " ");
 | 
			
		||||
				for (int i = 0; i < from.length() + 1; i++) {
 | 
			
		||||
					System.out.print(d[i][j]);
 | 
			
		||||
					if (i == from.length() && j == to.length())
 | 
			
		||||
						System.out.print("<");
 | 
			
		||||
					else if (i == from.length() - 1 && j == to.length())
 | 
			
		||||
						System.out.print(">");
 | 
			
		||||
					else
 | 
			
		||||
						System.out.print(" ");
 | 
			
		||||
				}
 | 
			
		||||
				System.out.println();
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return d[from.length()][to.length()];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private int min(int i, int j, int k) {
 | 
			
		||||
		int min = i;
 | 
			
		||||
		if (j < min)
 | 
			
		||||
			min = j;
 | 
			
		||||
		if (k < min)
 | 
			
		||||
			min = k;
 | 
			
		||||
		return min;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,73 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2004-2008 the original author or authors.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
 * you may not use this file except in compliance with the License.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *      http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
package org.springframework.expression.spel.ast;
 | 
			
		||||
 | 
			
		||||
import java.util.regex.Matcher;
 | 
			
		||||
import java.util.regex.Pattern;
 | 
			
		||||
import java.util.regex.PatternSyntaxException;
 | 
			
		||||
 | 
			
		||||
import org.antlr.runtime.Token;
 | 
			
		||||
import org.springframework.expression.EvaluationException;
 | 
			
		||||
import org.springframework.expression.spel.ExpressionState;
 | 
			
		||||
import org.springframework.expression.spel.SpelException;
 | 
			
		||||
import org.springframework.expression.spel.SpelMessages;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Implements the like operator. The like operator behaves the same as the SQL LIKE operator. The first operand is
 | 
			
		||||
 * compared against the expression supplied as the second operand. This expression supports two wildcards: % meaning any
 | 
			
		||||
 * string of any length, and _ meaning any single character.
 | 
			
		||||
 * 
 | 
			
		||||
 * @author Andy Clement
 | 
			
		||||
 */
 | 
			
		||||
public class OperatorLike extends Operator {
 | 
			
		||||
 | 
			
		||||
	public OperatorLike(Token payload) {
 | 
			
		||||
		super(payload);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String getOperatorName() {
 | 
			
		||||
		return "like";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public Boolean getValue(ExpressionState state) throws EvaluationException {
 | 
			
		||||
		SpelNode leftOp = getLeftOperand();
 | 
			
		||||
		SpelNode rightOp = getRightOperand();
 | 
			
		||||
		Object left = leftOp.getValue(state, String.class);
 | 
			
		||||
		Object right = getRightOperand().getValue(state);
 | 
			
		||||
		try {
 | 
			
		||||
			if (!(left instanceof String)) {
 | 
			
		||||
				throw new SpelException(leftOp.getCharPositionInLine(),
 | 
			
		||||
						SpelMessages.INVALID_FIRST_OPERAND_FOR_LIKE_OPERATOR, left);
 | 
			
		||||
			}
 | 
			
		||||
			if (!(right instanceof String)) {
 | 
			
		||||
				throw new SpelException(rightOp.getCharPositionInLine(),
 | 
			
		||||
						SpelMessages.INVALID_SECOND_OPERAND_FOR_LIKE_OPERATOR, right);
 | 
			
		||||
			}
 | 
			
		||||
			// Translate that pattern to a java regex
 | 
			
		||||
			// not really the best option, what if the right operand already had regex related chars in it?
 | 
			
		||||
			String likePattern = (String) right;
 | 
			
		||||
			likePattern = likePattern.replace('_', '.');
 | 
			
		||||
			likePattern = likePattern.replaceAll("%", ".*");
 | 
			
		||||
			Pattern pattern = Pattern.compile(likePattern);
 | 
			
		||||
			Matcher matcher = pattern.matcher((String) left);
 | 
			
		||||
			return matcher.matches();
 | 
			
		||||
		} catch (PatternSyntaxException pse) {
 | 
			
		||||
			throw new SpelException(rightOp.getCharPositionInLine(), pse, SpelMessages.INVALID_PATTERN, right);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,113 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2004-2008 the original author or authors.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
 * you may not use this file except in compliance with the License.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *      http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
package org.springframework.expression.spel.ast;
 | 
			
		||||
 | 
			
		||||
import org.antlr.runtime.Token;
 | 
			
		||||
import org.springframework.expression.EvaluationException;
 | 
			
		||||
import org.springframework.expression.spel.ExpressionState;
 | 
			
		||||
import org.springframework.expression.spel.SpelException;
 | 
			
		||||
import org.springframework.expression.spel.SpelMessages;
 | 
			
		||||
 | 
			
		||||
public class OperatorSoundsLike extends Operator {
 | 
			
		||||
 | 
			
		||||
	public OperatorSoundsLike(Token payload) {
 | 
			
		||||
		super(payload);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public Object getValue(ExpressionState state) throws EvaluationException {
 | 
			
		||||
		Object left = getLeftOperand().getValue(state);
 | 
			
		||||
		Object right = getRightOperand().getValue(state);
 | 
			
		||||
		if (!(left instanceof String)) {
 | 
			
		||||
			throw new SpelException(getCharPositionInLine(), SpelMessages.SOUNDSLIKE_NEEDS_STRING_OPERAND, left
 | 
			
		||||
					.getClass().getName());
 | 
			
		||||
		}
 | 
			
		||||
		if (!(right instanceof String)) {
 | 
			
		||||
			throw new SpelException(getCharPositionInLine(), SpelMessages.SOUNDSLIKE_NEEDS_STRING_OPERAND, right
 | 
			
		||||
					.getClass().getName());
 | 
			
		||||
		}
 | 
			
		||||
		String leftSoundex = computeSoundex((String) left);
 | 
			
		||||
		String rightSoundex = computeSoundex((String) right);
 | 
			
		||||
		return state.getTypeComparator().compare(leftSoundex, rightSoundex) == 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// TODO if we keep soundslike, improve upon this basic implementation
 | 
			
		||||
	private String computeSoundex(String input) {
 | 
			
		||||
		if (input == null || input.length() == 0)
 | 
			
		||||
			return "0000";
 | 
			
		||||
		input = input.toUpperCase();
 | 
			
		||||
		StringBuilder soundex = new StringBuilder();
 | 
			
		||||
		soundex.append(input.charAt(0));
 | 
			
		||||
		for (int i = 1; i < input.length(); i++) {
 | 
			
		||||
			char ch = input.charAt(i);
 | 
			
		||||
			if ("HW".indexOf(ch) != -1)
 | 
			
		||||
				continue; // remove HWs now
 | 
			
		||||
			if ("BFPV".indexOf(ch) != -1) {
 | 
			
		||||
				soundex.append("1");
 | 
			
		||||
			} else if ("CGJKQSXZ".indexOf(ch) != -1) {
 | 
			
		||||
				soundex.append("2");
 | 
			
		||||
			} else if ("DT".indexOf(ch) != -1) {
 | 
			
		||||
				soundex.append("3");
 | 
			
		||||
			} else if ("L".indexOf(ch) != -1) {
 | 
			
		||||
				soundex.append("4");
 | 
			
		||||
			} else if ("MN".indexOf(ch) != -1) {
 | 
			
		||||
				soundex.append("5");
 | 
			
		||||
			} else if ("R".indexOf(ch) != -1) {
 | 
			
		||||
				soundex.append("6");
 | 
			
		||||
 | 
			
		||||
			} else {
 | 
			
		||||
				soundex.append(ch);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		StringBuilder shorterSoundex = new StringBuilder();
 | 
			
		||||
		shorterSoundex.append(soundex.charAt(0));
 | 
			
		||||
		for (int i = 1; i < soundex.length(); i++) {
 | 
			
		||||
			if ((i + 1) < soundex.length() && soundex.charAt(i) == soundex.charAt(i + 1))
 | 
			
		||||
				continue;
 | 
			
		||||
			if ("AEIOUY".indexOf(soundex.charAt(i)) != -1)
 | 
			
		||||
				continue;
 | 
			
		||||
			shorterSoundex.append(soundex.charAt(i));
 | 
			
		||||
		}
 | 
			
		||||
		shorterSoundex.append("0000");
 | 
			
		||||
		return shorterSoundex.substring(0, 4);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// wikipedia:
 | 
			
		||||
	// The Soundex code for a name consists of a letter followed by three numbers: the letter is the first letter of the
 | 
			
		||||
	// name, and the numbers encode the remaining consonants. Similar sounding consonants share the same number so, for
 | 
			
		||||
	// example, the labial B, F, P and V are all encoded as 1. Vowels can affect the coding, but are never coded
 | 
			
		||||
	// directly unless they appear at the start of the name.
 | 
			
		||||
	// The exact algorithm is as follows:
 | 
			
		||||
	// Retain the first letter of the string
 | 
			
		||||
	// Remove all occurrences of the following letters, unless it is the first letter: a, e, h, i, o, u, w, y
 | 
			
		||||
	// Assign numbers to the remaining letters (after the first) as follows:
 | 
			
		||||
	// b, f, p, v = 1
 | 
			
		||||
	// c, g, j, k, q, s, x, z = 2
 | 
			
		||||
	// d, t = 3
 | 
			
		||||
	// l = 4
 | 
			
		||||
	// m, n = 5
 | 
			
		||||
	// r = 6
 | 
			
		||||
	// If two or more letters with the same number were adjacent in the original name (before step 1), or adjacent
 | 
			
		||||
	// except for any intervening h and w (American census only), then omit all but the first.
 | 
			
		||||
	// Return the first four characters, right-padding with zeroes if there are fewer than four.
 | 
			
		||||
	// Using this algorithm, both "Robert" and "Rupert" return the same string "R163" while "Rubin" yields "R150".
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public String getOperatorName() {
 | 
			
		||||
		return "soundslike";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -86,17 +86,10 @@ relationalExpression : sumExpression (relationalOperator^ sumExpression)?;
 | 
			
		|||
 | 
			
		||||
sumExpression
 | 
			
		||||
	: productExpression ( (PLUS^ | MINUS^) productExpression)*;
 | 
			
		||||
//	: left=productExpression (PLUS right+=productExpression)+ -> ^(ADD $left $right)
 | 
			
		||||
//	| left=productExpression (MINUS right+=productExpression)+ -> ^(SUBTRACT $left $right)
 | 
			
		||||
//	| productExpression;
 | 
			
		||||
 | 
			
		||||
// TODO could really do with changing ast node types here
 | 
			
		||||
productExpression
 | 
			
		||||
	: powerExpr ((STAR^ | DIV^| MOD^) powerExpr)* ;
 | 
			
		||||
//	: left=powerExpr (STAR right+=powerExpr) -> ^(MULTIPLY $left $right)
 | 
			
		||||
//	| left=powerExpr (DIV right+=powerExpr) -> ^(DIVIDE $left $right)
 | 
			
		||||
//	| left=powerExpr (MOD right+=powerExpr) -> ^(MODULUS $left $right)
 | 
			
		||||
//	| powerExpr;
 | 
			
		||||
 | 
			
		||||
powerExpr  : unaryExpression (POWER^ unaryExpression)? ;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -126,7 +119,6 @@ startNode
 | 
			
		|||
    | listInitializer
 | 
			
		||||
    | mapInitializer
 | 
			
		||||
    | lambda
 | 
			
		||||
//  | attribute
 | 
			
		||||
    ;
 | 
			
		||||
    
 | 
			
		||||
node
 | 
			
		||||
| 
						 | 
				
			
			@ -288,10 +280,7 @@ relationalOperator
 | 
			
		|||
    |   IN   
 | 
			
		||||
    |   IS   
 | 
			
		||||
    |   BETWEEN   
 | 
			
		||||
    |   LIKE   
 | 
			
		||||
    |   MATCHES
 | 
			
		||||
    |   SOUNDSLIKE
 | 
			
		||||
    |   DISTANCETO   
 | 
			
		||||
    ; 
 | 
			
		||||
          
 | 
			
		||||
ASSIGN: '=';
 | 
			
		||||
| 
						 | 
				
			
			@ -301,14 +290,9 @@ LESS_THAN: '<';
 | 
			
		|||
LESS_THAN_OR_EQUAL: '<=';
 | 
			
		||||
GREATER_THAN: '>';
 | 
			
		||||
GREATER_THAN_OR_EQUAL: '>=';
 | 
			
		||||
SOUNDSLIKE
 | 
			
		||||
	:	'soundslike';
 | 
			
		||||
DISTANCETO
 | 
			
		||||
	:	'distanceto';
 | 
			
		||||
IN:     'in';	
 | 
			
		||||
IS:     'is';
 | 
			
		||||
BETWEEN:'between';
 | 
			
		||||
LIKE:   'like';
 | 
			
		||||
MATCHES:'matches';
 | 
			
		||||
NULL_LITERAL: 'null';
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,92 +1,89 @@
 | 
			
		|||
COMMA=51
 | 
			
		||||
GREATER_THAN_OR_EQUAL=79
 | 
			
		||||
EXPRESSIONLIST=4
 | 
			
		||||
GREATER_THAN=78
 | 
			
		||||
MINUS=41
 | 
			
		||||
NUMBER=29
 | 
			
		||||
ARGLIST=11
 | 
			
		||||
BANG=46
 | 
			
		||||
LESS_THAN=76
 | 
			
		||||
METHOD=26
 | 
			
		||||
FALSE=70
 | 
			
		||||
PROPERTY_OR_FIELD=9
 | 
			
		||||
INDEXER=10
 | 
			
		||||
CONSTRUCTOR_ARRAY=15
 | 
			
		||||
NULL_LITERAL=66
 | 
			
		||||
NAMED_ARGUMENT=16
 | 
			
		||||
PIPE=62
 | 
			
		||||
DOT=47
 | 
			
		||||
AND=39
 | 
			
		||||
EXPRESSION=6
 | 
			
		||||
LCURLY=63
 | 
			
		||||
DATE_LITERAL=13
 | 
			
		||||
REAL_TYPE_SUFFIX=92
 | 
			
		||||
QUALIFIED_IDENTIFIER=7
 | 
			
		||||
SELECT=57
 | 
			
		||||
STRING_LITERAL=64
 | 
			
		||||
SUBTRACT=28
 | 
			
		||||
RBRACKET=54
 | 
			
		||||
RPAREN=33
 | 
			
		||||
BETWEEN=82
 | 
			
		||||
SIGN=93
 | 
			
		||||
PLUS=40
 | 
			
		||||
INTEGER_LITERAL=5
 | 
			
		||||
AT=52
 | 
			
		||||
RANGE=19
 | 
			
		||||
SOUNDSLIKE=85
 | 
			
		||||
WS=89
 | 
			
		||||
DOLLAR=50
 | 
			
		||||
LESS_THAN_OR_EQUAL=77
 | 
			
		||||
HEXADECIMAL_INTEGER_LITERAL=67
 | 
			
		||||
LAMBDA=61
 | 
			
		||||
SEMI=31
 | 
			
		||||
EQUAL=74
 | 
			
		||||
DOT_ESCAPED=88
 | 
			
		||||
QMARK=36
 | 
			
		||||
COLON=37
 | 
			
		||||
PROJECT=55
 | 
			
		||||
DIV=43
 | 
			
		||||
REAL_LITERAL=68
 | 
			
		||||
ADD=27
 | 
			
		||||
TRUE=69
 | 
			
		||||
EXPONENT_PART=91
 | 
			
		||||
POUND=48
 | 
			
		||||
HOLDER=14
 | 
			
		||||
SELECT_FIRST=58
 | 
			
		||||
COMMA=51
 | 
			
		||||
HOLDER=14
 | 
			
		||||
GREATER_THAN=78
 | 
			
		||||
TYPE=60
 | 
			
		||||
EXPRESSIONLIST=4
 | 
			
		||||
MINUS=41
 | 
			
		||||
MAP_ENTRY=25
 | 
			
		||||
SELECT_LAST=59
 | 
			
		||||
NUMBER=29
 | 
			
		||||
LESS_THAN=76
 | 
			
		||||
BANG=46
 | 
			
		||||
ARGLIST=11
 | 
			
		||||
FALSE=70
 | 
			
		||||
METHOD=26
 | 
			
		||||
PROPERTY_OR_FIELD=9
 | 
			
		||||
LBRACKET=53
 | 
			
		||||
MOD=44
 | 
			
		||||
INDEXER=10
 | 
			
		||||
CONSTRUCTOR_ARRAY=15
 | 
			
		||||
FUNCTIONREF=17
 | 
			
		||||
NULL_LITERAL=66
 | 
			
		||||
NAMED_ARGUMENT=16
 | 
			
		||||
OR=38
 | 
			
		||||
PIPE=62
 | 
			
		||||
DOT=47
 | 
			
		||||
RCURLY=56
 | 
			
		||||
EXPRESSION=6
 | 
			
		||||
AND=39
 | 
			
		||||
LCURLY=63
 | 
			
		||||
DATE_LITERAL=13
 | 
			
		||||
REAL_TYPE_SUFFIX=89
 | 
			
		||||
STRING_LITERAL=64
 | 
			
		||||
SELECT=57
 | 
			
		||||
QUALIFIED_IDENTIFIER=7
 | 
			
		||||
RBRACKET=54
 | 
			
		||||
SUBTRACT=28
 | 
			
		||||
ASSIGN=34
 | 
			
		||||
BETWEEN=82
 | 
			
		||||
RPAREN=33
 | 
			
		||||
SIGN=90
 | 
			
		||||
LPAREN=30
 | 
			
		||||
HEX_DIGIT=73
 | 
			
		||||
PLUS=40
 | 
			
		||||
LIST_INITIALIZER=21
 | 
			
		||||
APOS=87
 | 
			
		||||
APOS=84
 | 
			
		||||
INTEGER_LITERAL=5
 | 
			
		||||
AT=52
 | 
			
		||||
ID=49
 | 
			
		||||
NOT_EQUAL=75
 | 
			
		||||
RANGE=19
 | 
			
		||||
POWER=45
 | 
			
		||||
TYPEREF=18
 | 
			
		||||
DISTANCETO=86
 | 
			
		||||
DECIMAL_DIGIT=71
 | 
			
		||||
WS=86
 | 
			
		||||
IS=81
 | 
			
		||||
DOLLAR=50
 | 
			
		||||
LESS_THAN_OR_EQUAL=77
 | 
			
		||||
SEMIRPAREN=32
 | 
			
		||||
DQ_STRING_LITERAL=65
 | 
			
		||||
LIKE=83
 | 
			
		||||
HEXADECIMAL_INTEGER_LITERAL=67
 | 
			
		||||
MAP_INITIALIZER=22
 | 
			
		||||
LAMBDA=61
 | 
			
		||||
LOCALFUNC=24
 | 
			
		||||
IN=80
 | 
			
		||||
CONSTRUCTOR=12
 | 
			
		||||
SEMI=31
 | 
			
		||||
INTEGER_TYPE_SUFFIX=72
 | 
			
		||||
MATCHES=84
 | 
			
		||||
UPTO=90
 | 
			
		||||
EQUAL=74
 | 
			
		||||
MATCHES=83
 | 
			
		||||
DOT_ESCAPED=85
 | 
			
		||||
UPTO=87
 | 
			
		||||
QMARK=36
 | 
			
		||||
REFERENCE=8
 | 
			
		||||
PROJECT=55
 | 
			
		||||
DEFAULT=35
 | 
			
		||||
COLON=37
 | 
			
		||||
DIV=43
 | 
			
		||||
LOCALVAR=23
 | 
			
		||||
STAR=42
 | 
			
		||||
REAL_LITERAL=68
 | 
			
		||||
VARIABLEREF=20
 | 
			
		||||
'date'=95
 | 
			
		||||
'new'=94
 | 
			
		||||
EXPONENT_PART=88
 | 
			
		||||
TRUE=69
 | 
			
		||||
ADD=27
 | 
			
		||||
POUND=48
 | 
			
		||||
'date'=92
 | 
			
		||||
'new'=91
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
				
			
			@ -5,8 +5,8 @@ options {
 | 
			
		|||
}
 | 
			
		||||
@header {package org.springframework.expression.spel.generated;}
 | 
			
		||||
 | 
			
		||||
T94 : 'new' ;
 | 
			
		||||
T95 : 'date' ;
 | 
			
		||||
T91 : 'new' ;
 | 
			
		||||
T92 : 'date' ;
 | 
			
		||||
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 67
 | 
			
		||||
SEMIRPAREN : ';)'; // recoveryrelated: allows us to cope with a rogue superfluous semicolon before the rparen in an expression list
 | 
			
		||||
| 
						 | 
				
			
			@ -18,120 +18,112 @@ INTEGER_LITERAL
 | 
			
		|||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 279
 | 
			
		||||
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" 297
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 294
 | 
			
		||||
ASSIGN: '=';
 | 
			
		||||
// $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" 295
 | 
			
		||||
EQUAL: '==';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 299
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 296
 | 
			
		||||
NOT_EQUAL: '!=';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 300
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 297
 | 
			
		||||
LESS_THAN: '<';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 301
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 298
 | 
			
		||||
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" 302
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 299
 | 
			
		||||
GREATER_THAN: '>';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 303
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 300
 | 
			
		||||
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" 304
 | 
			
		||||
SOUNDSLIKE
 | 
			
		||||
	:	'soundslike';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 306
 | 
			
		||||
DISTANCETO
 | 
			
		||||
	:	'distanceto';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 308
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 301
 | 
			
		||||
IN:     'in';	
 | 
			
		||||
// $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" 302
 | 
			
		||||
IS:     'is';
 | 
			
		||||
// $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" 303
 | 
			
		||||
BETWEEN:'between';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 311
 | 
			
		||||
LIKE:   'like';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 312
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 304
 | 
			
		||||
MATCHES:'matches';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 313
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 305
 | 
			
		||||
NULL_LITERAL: 'null';
 | 
			
		||||
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 315
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 307
 | 
			
		||||
SEMI: ';';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 316
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 308
 | 
			
		||||
DOT:    '.';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 317
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 309
 | 
			
		||||
COMMA:	',';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 318
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 310
 | 
			
		||||
LPAREN: '(';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 319
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 311
 | 
			
		||||
RPAREN: ')';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 320
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 312
 | 
			
		||||
LCURLY: '{';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 321
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 313
 | 
			
		||||
RCURLY: '}';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 322
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 314
 | 
			
		||||
LBRACKET: '[';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 323
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 315
 | 
			
		||||
RBRACKET: ']';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 324
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 316
 | 
			
		||||
PIPE:	'|';
 | 
			
		||||
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 326
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 318
 | 
			
		||||
AND:    'and';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 327
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 319
 | 
			
		||||
OR:     'or';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 328
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 320
 | 
			
		||||
FALSE:  'false';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 329
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 321
 | 
			
		||||
TRUE:   'true';
 | 
			
		||||
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 331
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 323
 | 
			
		||||
PLUS: '+';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 332
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 324
 | 
			
		||||
MINUS: '-';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 333
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 325
 | 
			
		||||
DIV: '/';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 334
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 326
 | 
			
		||||
STAR: '*';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 335
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 327
 | 
			
		||||
MOD: '%';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 336
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 328
 | 
			
		||||
POWER: '^';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 337
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 329
 | 
			
		||||
BANG: '!';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 338
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 330
 | 
			
		||||
POUND: '#';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 339
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 331
 | 
			
		||||
QMARK: '?';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 340
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 332
 | 
			
		||||
DEFAULT: '??';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 341
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 333
 | 
			
		||||
LAMBDA: '{|';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 342
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 334
 | 
			
		||||
PROJECT: '!{';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 343
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 335
 | 
			
		||||
SELECT: '?{';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 344
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 336
 | 
			
		||||
SELECT_FIRST: '^{';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 345
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 337
 | 
			
		||||
SELECT_LAST: '${';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 346
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 338
 | 
			
		||||
TYPE: 'T(';
 | 
			
		||||
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 348
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 340
 | 
			
		||||
STRING_LITERAL:	'\''! (APOS|~'\'')* '\''!;
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 349
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 341
 | 
			
		||||
DQ_STRING_LITERAL:	'"'! (~'"')* '"'!;
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 350
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 342
 | 
			
		||||
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" 351
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 343
 | 
			
		||||
DOT_ESCAPED: '\\.';
 | 
			
		||||
//DOUBLE_DOT: ':';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 353
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 345
 | 
			
		||||
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" 354
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 346
 | 
			
		||||
DOLLAR:	'$';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 355
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 347
 | 
			
		||||
AT: '@';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 356
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 348
 | 
			
		||||
UPTO: '..';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 357
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 349
 | 
			
		||||
COLON: ':';
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
| 
						 | 
				
			
			@ -149,26 +141,26 @@ COLON: ':';
 | 
			
		|||
		in= (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" 374
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 366
 | 
			
		||||
REAL_LITERAL :	
 | 
			
		||||
  ('.' (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)+ (REAL_TYPE_SUFFIX));
 | 
			
		||||
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 380
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 372
 | 
			
		||||
fragment APOS : '\''! '\'';
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 381
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 373
 | 
			
		||||
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" 382
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 374
 | 
			
		||||
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" 383
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 375
 | 
			
		||||
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" 385
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 377
 | 
			
		||||
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" 386
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 378
 | 
			
		||||
fragment SIGN :	'+' | '-' ;
 | 
			
		||||
// TODO what is M or m?
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 388
 | 
			
		||||
// $ANTLR src "/Users/aclement/el2/spring-framework/trunk/org.springframework.expression/src/main/java/org/springframework/expression/spel/generated/SpringExpressions.g" 380
 | 
			
		||||
fragment REAL_TYPE_SUFFIX : 'F' | 'f' | 'D' | 'd' | 'M' | 'm' ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,7 +39,6 @@ import org.springframework.expression.spel.ast.MethodReference;
 | 
			
		|||
import org.springframework.expression.spel.ast.NullLiteral;
 | 
			
		||||
import org.springframework.expression.spel.ast.OperatorAnd;
 | 
			
		||||
import org.springframework.expression.spel.ast.OperatorBetween;
 | 
			
		||||
import org.springframework.expression.spel.ast.OperatorDistanceTo;
 | 
			
		||||
import org.springframework.expression.spel.ast.OperatorDivide;
 | 
			
		||||
import org.springframework.expression.spel.ast.OperatorEquality;
 | 
			
		||||
import org.springframework.expression.spel.ast.OperatorGreaterThan;
 | 
			
		||||
| 
						 | 
				
			
			@ -49,7 +48,6 @@ import org.springframework.expression.spel.ast.OperatorInequality;
 | 
			
		|||
import org.springframework.expression.spel.ast.OperatorIs;
 | 
			
		||||
import org.springframework.expression.spel.ast.OperatorLessThan;
 | 
			
		||||
import org.springframework.expression.spel.ast.OperatorLessThanOrEqual;
 | 
			
		||||
import org.springframework.expression.spel.ast.OperatorLike;
 | 
			
		||||
import org.springframework.expression.spel.ast.OperatorMatches;
 | 
			
		||||
import org.springframework.expression.spel.ast.OperatorMinus;
 | 
			
		||||
import org.springframework.expression.spel.ast.OperatorModulus;
 | 
			
		||||
| 
						 | 
				
			
			@ -57,7 +55,6 @@ import org.springframework.expression.spel.ast.OperatorMultiply;
 | 
			
		|||
import org.springframework.expression.spel.ast.OperatorNot;
 | 
			
		||||
import org.springframework.expression.spel.ast.OperatorOr;
 | 
			
		||||
import org.springframework.expression.spel.ast.OperatorPlus;
 | 
			
		||||
import org.springframework.expression.spel.ast.OperatorSoundsLike;
 | 
			
		||||
import org.springframework.expression.spel.ast.Placeholder;
 | 
			
		||||
import org.springframework.expression.spel.ast.Projection;
 | 
			
		||||
import org.springframework.expression.spel.ast.PropertyOrFieldReference;
 | 
			
		||||
| 
						 | 
				
			
			@ -110,10 +107,6 @@ public class SpelTreeAdaptor extends CommonTreeAdaptor {
 | 
			
		|||
				return new OperatorLessThanOrEqual(payload);
 | 
			
		||||
			case SpringExpressionsLexer.GREATER_THAN_OR_EQUAL:
 | 
			
		||||
				return new OperatorGreaterThanOrEqual(payload);
 | 
			
		||||
			case SpringExpressionsLexer.SOUNDSLIKE:
 | 
			
		||||
				return new OperatorSoundsLike(payload);
 | 
			
		||||
			case SpringExpressionsLexer.DISTANCETO:
 | 
			
		||||
				return new OperatorDistanceTo(payload);
 | 
			
		||||
			case SpringExpressionsLexer.PLUS:
 | 
			
		||||
				return new OperatorPlus(payload);
 | 
			
		||||
			case SpringExpressionsLexer.MINUS:
 | 
			
		||||
| 
						 | 
				
			
			@ -187,8 +180,6 @@ public class SpelTreeAdaptor extends CommonTreeAdaptor {
 | 
			
		|||
 | 
			
		||||
			case SpringExpressionsLexer.IN:
 | 
			
		||||
				return new OperatorIn(payload);
 | 
			
		||||
			case SpringExpressionsLexer.LIKE:
 | 
			
		||||
				return new OperatorLike(payload);
 | 
			
		||||
			case SpringExpressionsLexer.BETWEEN:
 | 
			
		||||
				return new OperatorBetween(payload);
 | 
			
		||||
			case SpringExpressionsLexer.MATCHES:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -57,26 +57,6 @@ public class EvaluationTests extends ExpressionTestCase {
 | 
			
		|||
		evaluate("name in {null, \"Anonymous\"}", "false", Boolean.class);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void testRelOperatorsLike01() {
 | 
			
		||||
		evaluate("'Abc' like 'A%_'", "true", Boolean.class);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void testRelOperatorsLike02() {
 | 
			
		||||
		evaluate("'Abc' like '..'", "false", Boolean.class);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void testRelOperatorsLike03() {
 | 
			
		||||
		evaluateAndCheckError("null like '.'", SpelMessages.INVALID_FIRST_OPERAND_FOR_LIKE_OPERATOR);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void testRelOperatorsLike04() {
 | 
			
		||||
		evaluateAndCheckError("'abc' like 2.0", SpelMessages.INVALID_SECOND_OPERAND_FOR_LIKE_OPERATOR);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void testRelOperatorsLike05() {
 | 
			
		||||
		evaluate("27 like '__'", "true", Boolean.class); // conversion int>string
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void testRelOperatorsBetween01() {
 | 
			
		||||
		evaluate("1 between {1, 5}", "true", Boolean.class);
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -137,7 +117,6 @@ public class EvaluationTests extends ExpressionTestCase {
 | 
			
		|||
		evaluate("27 matches '^.*2.*$'", true, Boolean.class); // conversion int>string
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	// mixing operators
 | 
			
		||||
	public void testMixingOperators01() {
 | 
			
		||||
		evaluate("true and 5>3", "true", Boolean.class);
 | 
			
		||||
| 
						 | 
				
			
			@ -484,43 +463,6 @@ public class EvaluationTests extends ExpressionTestCase {
 | 
			
		|||
		evaluate("(#sqrt={|n| T(Math).sqrt($n)};#delegate={|f,n| $f($n)};#delegate(#sqrt,4))", "2.0", Double.class);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Soundex
 | 
			
		||||
	public void testSoundex01() {
 | 
			
		||||
		evaluate("'Rob' soundslike 'Rod'", "false", Boolean.class);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void testSoundex02() {
 | 
			
		||||
		evaluate("'Robert' soundslike 'Rupert'", "true", Boolean.class);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void testSoundex03() {
 | 
			
		||||
		evaluate("'Andy' soundslike 'Christian'", "false", Boolean.class);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void testSoundex04() {
 | 
			
		||||
		evaluate("@(fruits:).values().?{#this.colorName soundslike 'gren'}!=null", "true", Boolean.class);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void testSoundex05() {
 | 
			
		||||
		evaluate("@(fruits:).values().?{colorName soundslike 'gren'}!=null", "true", Boolean.class);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void testSoundex06() {
 | 
			
		||||
		evaluate("'Adrian' soundslike 'Adrain'", "true", Boolean.class);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Word distance
 | 
			
		||||
	public void testDistanceTo01() {
 | 
			
		||||
		evaluate("'Saturday' distanceto 'Sunday'", "3", Integer.class);
 | 
			
		||||
		evaluate("'Saturday' distanceto 'Monday'", "5", Integer.class);
 | 
			
		||||
		evaluate("'Saturday' distanceto 'Saturdaz'", "1", Integer.class);
 | 
			
		||||
		evaluate("'Saturday' distanceto 'Saturdab'", "1", Integer.class);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void testDistanceTo02() {
 | 
			
		||||
		evaluate("'Kitten' distanceto 'Sitting'", "3", Integer.class);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void testVariableReferences() {
 | 
			
		||||
		evaluate("(#answer=42;#answer)", "42", Integer.class, true);
 | 
			
		||||
		evaluate("($answer=42;$answer)", "42", Integer.class, true);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,7 +27,7 @@ import org.springframework.expression.spel.standard.StandardEvaluationContext;
 | 
			
		|||
 | 
			
		||||
/**
 | 
			
		||||
 * Common superclass for expression tests.
 | 
			
		||||
 * 
 | 
			
		||||
 *
 | 
			
		||||
 * @author Andy Clement
 | 
			
		||||
 */
 | 
			
		||||
public abstract class ExpressionTestCase extends TestCase {
 | 
			
		||||
| 
						 | 
				
			
			@ -36,9 +36,9 @@ public abstract class ExpressionTestCase extends TestCase {
 | 
			
		|||
 | 
			
		||||
	protected final static boolean SHOULD_BE_WRITABLE = true;
 | 
			
		||||
	protected final static boolean SHOULD_NOT_BE_WRITABLE = false;
 | 
			
		||||
	
 | 
			
		||||
	protected static SpelExpressionParser parser = new SpelExpressionParser();
 | 
			
		||||
	protected static StandardEvaluationContext eContext = TestScenarioCreator.getTestEvaluationContext();
 | 
			
		||||
 | 
			
		||||
	protected final static SpelExpressionParser parser = new SpelExpressionParser();
 | 
			
		||||
	protected final static StandardEvaluationContext eContext = TestScenarioCreator.getTestEvaluationContext();
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Evaluate an expression and check that the actual result matches the expectedValue and the class of the result
 | 
			
		||||
| 
						 | 
				
			
			@ -137,7 +137,7 @@ public abstract class ExpressionTestCase extends TestCase {
 | 
			
		|||
	 * Evaluate an expression and check that the actual result matches the expectedValue and the class of the result
 | 
			
		||||
	 * matches the expectedClassOfResult. This method can also check if the expression is writable (for example, it is a
 | 
			
		||||
	 * variable or property reference).
 | 
			
		||||
	 * 
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param expression The expression to evaluate
 | 
			
		||||
	 * @param expectedValue the expected result for evaluating the expression
 | 
			
		||||
	 * @param expectedClassOfResult the expected class of the evaluation result
 | 
			
		||||
| 
						 | 
				
			
			@ -335,7 +335,7 @@ public abstract class ExpressionTestCase extends TestCase {
 | 
			
		|||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Produce a nice string representation of the input object.
 | 
			
		||||
	 * 
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param value object to be formatted
 | 
			
		||||
	 * @return a nice string
 | 
			
		||||
	 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,7 +22,7 @@ import org.springframework.expression.ParseException;
 | 
			
		|||
/**
 | 
			
		||||
 * Parse some expressions and check we get the AST we expect. Rather than inspecting each node in the AST, we ask it to
 | 
			
		||||
 * write itself to a string form and check that is as expected.
 | 
			
		||||
 * 
 | 
			
		||||
 *
 | 
			
		||||
 * @author Andy Clement
 | 
			
		||||
 */
 | 
			
		||||
public class ParsingTests extends TestCase {
 | 
			
		||||
| 
						 | 
				
			
			@ -137,14 +137,6 @@ public class ParsingTests extends TestCase {
 | 
			
		|||
		parseCheck("3 in {1,2,3,4,5}", "(3 in {1,2,3,4,5})");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void testRelOperatorsLike01() {
 | 
			
		||||
		parseCheck("'Abc' like '[A-Z]b*'", "('Abc' like '[A-Z]b*')");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void testRelOperatorsLike02() {
 | 
			
		||||
		parseCheck("'Abc' like '?'", "('Abc' like '?')");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void testRelOperatorsBetween01() {
 | 
			
		||||
		parseCheck("1 between {1, 5}", "(1 between {1,5})");
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -418,7 +410,7 @@ public class ParsingTests extends TestCase {
 | 
			
		|||
	/**
 | 
			
		||||
	 * Parse the supplied expression and then create a string representation of the resultant AST, it should be the same
 | 
			
		||||
	 * as the original expression.
 | 
			
		||||
	 * 
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param expression the expression to parse *and* the expected value of the string form of the resultant AST
 | 
			
		||||
	 */
 | 
			
		||||
	public void parseCheck(String expression) {
 | 
			
		||||
| 
						 | 
				
			
			@ -428,7 +420,7 @@ public class ParsingTests extends TestCase {
 | 
			
		|||
	/**
 | 
			
		||||
	 * Parse the supplied expression and then create a string representation of the resultant AST, it should be the
 | 
			
		||||
	 * expected value.
 | 
			
		||||
	 * 
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param expression the expression to parse
 | 
			
		||||
	 * @param expectedStringFormOfAST the expected string form of the AST
 | 
			
		||||
	 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue