org.springframework.expression.spel.standard
Class InternalSpelExpressionParser

java.lang.Object
  extended by org.springframework.expression.common.TemplateAwareExpressionParser
      extended by org.springframework.expression.spel.standard.InternalSpelExpressionParser
All Implemented Interfaces:
ExpressionParser

 class InternalSpelExpressionParser
extends TemplateAwareExpressionParser

Hand written SpEL parser. Instances are reusable but are not thread safe.

Since:
3.0
Author:
Andy Clement

Field Summary
private  SpelParserConfiguration configuration
           
private  java.util.Stack<SpelNodeImpl> constructedNodes
           
private  java.lang.String expressionString
           
private  java.util.List<Token> tokenStream
           
private  int tokenStreamLength
           
private  int tokenStreamPointer
           
 
Constructor Summary
InternalSpelExpressionParser(SpelParserConfiguration configuration)
          Create a parser with some configured behavior.
 
Method Summary
private  void checkRightOperand(Token token, SpelNodeImpl operandExpression)
           
private  void consumeArguments(java.util.List<SpelNodeImpl> accumulatedArguments)
          Used for consuming arguments for either a method or a constructor call
protected  SpelExpression doParseExpression(java.lang.String expressionString, ParserContext context)
          Actually parse the expression string and return an Expression object.
private  void eatConstructorArgs(java.util.List<SpelNodeImpl> accumulatedArguments)
           
private  SpelNodeImpl eatDottedNode()
           
private  SpelNodeImpl eatExpression()
           
private  SpelNodeImpl eatLogicalAndExpression()
           
private  SpelNodeImpl eatLogicalOrExpression()
           
private  SpelNodeImpl eatPossiblyQualifiedId()
          Eat an identifier, possibly qualified (meaning that it is dotted).
private  SpelNodeImpl eatPowerExpression()
           
private  SpelNodeImpl eatPrimaryExpression()
           
private  SpelNodeImpl eatProductExpression()
           
private  SpelNodeImpl eatRelationalExpression()
           
private  SpelNodeImpl eatStartNode()
           
private  SpelNodeImpl eatSumExpression()
           
private  Token eatToken(TokenKind expectedKind)
           
private  SpelNodeImpl eatUnaryExpression()
           
private  boolean maybeEatBeanReference()
           
private  boolean maybeEatConstructorReference()
           
private  boolean maybeEatFunctionOrVar()
           
private  boolean maybeEatIndexer()
           
private  boolean maybeEatInlineList()
           
private  boolean maybeEatLiteral()
           
private  SpelNodeImpl[] maybeEatMethodArgs()
           
private  boolean maybeEatMethodOrProperty(boolean nullSafeNavigation)
           
private  boolean maybeEatNode()
           
private  SpelNodeImpl maybeEatNonDottedNode()
           
private  boolean maybeEatNullReference()
           
private  boolean maybeEatParenExpression()
           
private  boolean maybeEatProjection(boolean nullSafeNavigation)
           
private  Token maybeEatRelationalOperator()
           
private  boolean maybeEatSelection(boolean nullSafeNavigation)
           
private  boolean maybeEatTypeReference()
           
private  boolean moreTokens()
           
private  Token nextToken()
           
private  boolean peekIdentifierToken(java.lang.String identifierString)
           
private  boolean peekSelectToken()
           
private  Token peekToken()
           
private  boolean peekToken(TokenKind desiredTokenKind)
           
private  boolean peekToken(TokenKind desiredTokenKind, boolean consumeIfMatched)
           
private  boolean peekToken(TokenKind possible1, TokenKind possible2)
           
private  boolean peekToken(TokenKind possible1, TokenKind possible2, TokenKind possible3)
           
private  SpelNodeImpl pop()
           
private  int positionOf(Token t)
           
private  void push(SpelNodeImpl newNode)
           
private  void raiseInternalException(int pos, SpelMessage message, java.lang.Object... inserts)
           
private  int toPos(int start, int end)
           
private  int toPos(Token t)
          Compress the start and end of a token into a single int
 java.lang.String toString(Token t)
           
 
Methods inherited from class org.springframework.expression.common.TemplateAwareExpressionParser
parseExpression, parseExpression
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

expressionString

private java.lang.String expressionString

tokenStream

private java.util.List<Token> tokenStream

tokenStreamLength

private int tokenStreamLength

tokenStreamPointer

private int tokenStreamPointer

constructedNodes

private java.util.Stack<SpelNodeImpl> constructedNodes

configuration

private SpelParserConfiguration configuration
Constructor Detail

InternalSpelExpressionParser

public InternalSpelExpressionParser(SpelParserConfiguration configuration)
Create a parser with some configured behavior.

Parameters:
configuration - custom configuration options
Method Detail

doParseExpression

protected SpelExpression doParseExpression(java.lang.String expressionString,
                                           ParserContext context)
                                    throws ParseException
Description copied from class: TemplateAwareExpressionParser
Actually parse the expression string and return an Expression object.

Specified by:
doParseExpression in class TemplateAwareExpressionParser
Parameters:
expressionString - the raw expression string to parse
context - a context for influencing this expression parsing routine (optional)
Returns:
an evaluator for the parsed expression
Throws:
ParseException - an exception occurred during parsing

eatExpression

private SpelNodeImpl eatExpression()

eatLogicalOrExpression

private SpelNodeImpl eatLogicalOrExpression()

eatLogicalAndExpression

private SpelNodeImpl eatLogicalAndExpression()

eatRelationalExpression

private SpelNodeImpl eatRelationalExpression()

eatSumExpression

private SpelNodeImpl eatSumExpression()

eatProductExpression

private SpelNodeImpl eatProductExpression()

eatPowerExpression

private SpelNodeImpl eatPowerExpression()

eatUnaryExpression

private SpelNodeImpl eatUnaryExpression()

eatPrimaryExpression

private SpelNodeImpl eatPrimaryExpression()

maybeEatNode

private boolean maybeEatNode()

maybeEatNonDottedNode

private SpelNodeImpl maybeEatNonDottedNode()

eatDottedNode

private SpelNodeImpl eatDottedNode()

maybeEatFunctionOrVar

private boolean maybeEatFunctionOrVar()

maybeEatMethodArgs

private SpelNodeImpl[] maybeEatMethodArgs()

eatConstructorArgs

private void eatConstructorArgs(java.util.List<SpelNodeImpl> accumulatedArguments)

consumeArguments

private void consumeArguments(java.util.List<SpelNodeImpl> accumulatedArguments)
Used for consuming arguments for either a method or a constructor call


positionOf

private int positionOf(Token t)

eatStartNode

private SpelNodeImpl eatStartNode()

maybeEatBeanReference

private boolean maybeEatBeanReference()

maybeEatTypeReference

private boolean maybeEatTypeReference()

maybeEatNullReference

private boolean maybeEatNullReference()

maybeEatProjection

private boolean maybeEatProjection(boolean nullSafeNavigation)

maybeEatInlineList

private boolean maybeEatInlineList()

maybeEatIndexer

private boolean maybeEatIndexer()

maybeEatSelection

private boolean maybeEatSelection(boolean nullSafeNavigation)

eatPossiblyQualifiedId

private SpelNodeImpl eatPossiblyQualifiedId()
Eat an identifier, possibly qualified (meaning that it is dotted). TODO AndyC Could create complete identifiers (a.b.c) here rather than a sequence of them? (a, b, c)


maybeEatMethodOrProperty

private boolean maybeEatMethodOrProperty(boolean nullSafeNavigation)

maybeEatConstructorReference

private boolean maybeEatConstructorReference()

push

private void push(SpelNodeImpl newNode)

pop

private SpelNodeImpl pop()

maybeEatLiteral

private boolean maybeEatLiteral()

maybeEatParenExpression

private boolean maybeEatParenExpression()

maybeEatRelationalOperator

private Token maybeEatRelationalOperator()

eatToken

private Token eatToken(TokenKind expectedKind)

peekToken

private boolean peekToken(TokenKind desiredTokenKind)

peekToken

private boolean peekToken(TokenKind desiredTokenKind,
                          boolean consumeIfMatched)

peekToken

private boolean peekToken(TokenKind possible1,
                          TokenKind possible2)

peekToken

private boolean peekToken(TokenKind possible1,
                          TokenKind possible2,
                          TokenKind possible3)

peekIdentifierToken

private boolean peekIdentifierToken(java.lang.String identifierString)

peekSelectToken

private boolean peekSelectToken()

moreTokens

private boolean moreTokens()

nextToken

private Token nextToken()

peekToken

private Token peekToken()

raiseInternalException

private void raiseInternalException(int pos,
                                    SpelMessage message,
                                    java.lang.Object... inserts)

toString

public java.lang.String toString(Token t)

checkRightOperand

private void checkRightOperand(Token token,
                               SpelNodeImpl operandExpression)

toPos

private int toPos(Token t)
Compress the start and end of a token into a single int


toPos

private int toPos(int start,
                  int end)