Package org.mvel2.compiler
Class AbstractParser
- java.lang.Object
-
- org.mvel2.compiler.AbstractParser
-
- All Implemented Interfaces:
java.io.Serializable
,Parser
- Direct Known Subclasses:
AbstractOptimizer
,ExpressionCompiler
,MacroProcessor
,MVELInterpretedRuntime
public class AbstractParser extends java.lang.Object implements Parser, java.io.Serializable
This is the core parser that the subparsers extend.- See Also:
- Serialized Form
-
-
Field Summary
Fields Modifier and Type Field Description static java.util.HashMap<java.lang.String,java.lang.Object>
CLASS_LITERALS
protected boolean
compileMode
protected java.lang.Object
ctx
protected int
cursor
protected boolean
debugSymbols
protected ExecutionStack
dStack
protected int
end
private static java.util.WeakHashMap<java.lang.String,char[]>
EX_PRECACHE
protected char[]
expr
protected int
fields
protected static int
GET
protected static int
GET_OR_CREATE
protected boolean
greedy
protected int
lastLineStart
protected ASTNode
lastNode
protected boolean
lastWasComment
protected boolean
lastWasIdentifier
protected boolean
lastWasLineLabel
protected int
length
static int
LEVEL_0_PROPERTY_ONLY
static int
LEVEL_1_BASIC_LANG
static int
LEVEL_2_MULTI_STATEMENT
static int
LEVEL_3_ITERATION
static int
LEVEL_4_ASSIGNMENT
static int
LEVEL_5_CONTROL_FLOW
protected int
line
protected int
literalOnly
static java.util.HashMap<java.lang.String,java.lang.Object>
LITERALS
protected static int
OP_CONTINUE
protected static int
OP_NOT_LITERAL
protected static int
OP_OVERFLOW
protected static int
OP_RESET_FRAME
protected static int
OP_TERMINATE
static java.util.HashMap<java.lang.String,java.lang.Integer>
OPERATORS
protected ParserContext
pCtx
protected static int
REMOVE
protected static int
SET
protected ExecutionStack
splitAccumulator
protected int
st
protected int
start
protected ExecutionStack
stk
protected VariableResolverFactory
variableFactory
-
Constructor Summary
Constructors Modifier Constructor Description protected
AbstractParser()
protected
AbstractParser(ParserContext pCtx)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private ASTNode
_captureBlock(ASTNode node, char[] expr, boolean cond, int type)
protected void
addFatalError(java.lang.String message)
protected void
addFatalError(java.lang.String message, int start)
protected int
arithmeticFunctionReduction(int operator)
Reduce the current operations on the stack.private static int
asInt(java.lang.Object o)
private ASTNode
captureCodeBlock(int type)
Capture a code block by type.protected void
captureIdentifier()
Capture to the end of the current identifier under the cursor.protected void
captureToEOS()
Capture from the current cursor position, to the end of the statement.protected void
captureToEOSorEOL()
From the current cursor position, capture to the end of statement, or the end of line, whichever comes first.protected void
captureToEOT()
From the current cursor position, capture to the end of the current token.protected void
captureToNextTokenJunction()
From the current cursor position, capture to the end of the next token junction.private ASTNode
createBlockToken(int condStart, int condEnd, int blockStart, int blockEnd, int type)
Generate a code block token.private ASTNode
createOperator(char[] expr, int start, int end)
Create an operator node.private ASTNode
createPropertyToken(int st, int end)
Generate a property tokenprivate void
dreduce()
protected void
expectEOS()
The parser should find a statement ending condition when this is called, otherwise everything should blow up.void
expectNextChar_IW(char c)
Expect the next specified character or failint
getCursor()
char[]
getExpression()
ASTNode
handleSubstatement(Substatement stmt)
protected ASTNode
handleUnion(ASTNode node)
Handle a union between a closed statement and a residual property chain.protected boolean
ifThenElseBlockContinues()
Checking from the current cursor position, check to see if the if-then-else block continues.int
incNextNonBlank()
Increment one cursor position, and move cursor to next non-blank part.protected static boolean
isArithmeticOperator(int operator)
protected boolean
isNextIdentifier()
Checks to see if the next part of the statement is an identifier part.protected boolean
isNextIdentifierOrLiteral()
Returns true if the next is an identifier or literal.protected boolean
isStatementNotManuallyTerminated()
NOTE: This method assumes that the current position of the cursor is at the end of a logical statement, to begin with.protected boolean
lastNonWhite(char c)
static java.util.HashMap<java.lang.String,java.lang.Integer>
loadLanguageFeaturesByLevel(int languageLevel)
protected char
lookAhead()
Return the next character (delta 1 of cursor position).protected char
lookAhead(int range)
Return the character, forward of the currrent cursor position based on the specified range delta.protected char
lookBehind()
Return the last character (delta -1 of cursor position).protected char
lookToLast()
Return the previous non-whitespace character.int
nextNonBlank()
Move to next cursor position from current cursor position.protected ASTNode
nextToken()
Retrieve the next token in the expression.protected ASTNode
nextTokenSkipSymbols()
private ASTNode
procTypedNode(boolean decl)
Process the current typed nodeprotected void
reduce()
This method is called when we reach the point where we must subEval a trinary operation in the expression.private void
reduce(int op1, int operator, int op2)
private void
reduce(int op1, int operator, long op2)
private void
reduce(long op1, int operator, int op2)
private void
reduce(long op1, int operator, long op2)
private void
reduceNumeric(int operator)
protected void
setExpression(char[] expression)
Set and finesse the expression, trimming an leading or proceeding whitespace.protected void
setExpression(java.lang.String expression)
Set and finesse the expression, trimming an leading or proceeding whitespace.static void
setLanguageLevel(int level)
static void
setupParser()
This method is internally called by the static initializer for AbstractParser in order to setup the parser.protected void
skipWhitespace()
If the cursor is currently pointing to whitespace, move the cursor forward to the first non-whitespace character, but account for carriage returns in the script (updates parser field: line).private char[]
subArray(int start, int end)
Create a copy of an array based on a sub-range.protected boolean
tokenContinues()
Checking from the current cursor position, check to see if we're inside a contiguous identifier.protected int
trimLeft(int pos)
From the specified cursor position, trim out any whitespace between the current position and the end of the last non-whitespace character.protected int
trimRight(int pos)
From the specified cursor position, trim out any whitespace between the current position and beginning of the first non-whitespace character.protected void
trimWhitespace()
From the current cursor position, trim backward over any whitespace to the first non-whitespace character.
-
-
-
Field Detail
-
expr
protected char[] expr
-
cursor
protected int cursor
-
start
protected int start
-
length
protected int length
-
end
protected int end
-
st
protected int st
-
fields
protected int fields
-
OP_NOT_LITERAL
protected static final int OP_NOT_LITERAL
- See Also:
- Constant Field Values
-
OP_OVERFLOW
protected static final int OP_OVERFLOW
- See Also:
- Constant Field Values
-
OP_TERMINATE
protected static final int OP_TERMINATE
- See Also:
- Constant Field Values
-
OP_RESET_FRAME
protected static final int OP_RESET_FRAME
- See Also:
- Constant Field Values
-
OP_CONTINUE
protected static final int OP_CONTINUE
- See Also:
- Constant Field Values
-
greedy
protected boolean greedy
-
lastWasIdentifier
protected boolean lastWasIdentifier
-
lastWasLineLabel
protected boolean lastWasLineLabel
-
lastWasComment
protected boolean lastWasComment
-
compileMode
protected boolean compileMode
-
literalOnly
protected int literalOnly
-
lastLineStart
protected int lastLineStart
-
line
protected int line
-
lastNode
protected ASTNode lastNode
-
EX_PRECACHE
private static final java.util.WeakHashMap<java.lang.String,char[]> EX_PRECACHE
-
LITERALS
public static java.util.HashMap<java.lang.String,java.lang.Object> LITERALS
-
CLASS_LITERALS
public static java.util.HashMap<java.lang.String,java.lang.Object> CLASS_LITERALS
-
OPERATORS
public static java.util.HashMap<java.lang.String,java.lang.Integer> OPERATORS
-
stk
protected ExecutionStack stk
-
splitAccumulator
protected ExecutionStack splitAccumulator
-
pCtx
protected ParserContext pCtx
-
dStack
protected ExecutionStack dStack
-
ctx
protected java.lang.Object ctx
-
variableFactory
protected VariableResolverFactory variableFactory
-
debugSymbols
protected boolean debugSymbols
-
SET
protected static final int SET
- See Also:
- Constant Field Values
-
REMOVE
protected static final int REMOVE
- See Also:
- Constant Field Values
-
GET
protected static final int GET
- See Also:
- Constant Field Values
-
GET_OR_CREATE
protected static final int GET_OR_CREATE
- See Also:
- Constant Field Values
-
LEVEL_5_CONTROL_FLOW
public static final int LEVEL_5_CONTROL_FLOW
- See Also:
- Constant Field Values
-
LEVEL_4_ASSIGNMENT
public static final int LEVEL_4_ASSIGNMENT
- See Also:
- Constant Field Values
-
LEVEL_3_ITERATION
public static final int LEVEL_3_ITERATION
- See Also:
- Constant Field Values
-
LEVEL_2_MULTI_STATEMENT
public static final int LEVEL_2_MULTI_STATEMENT
- See Also:
- Constant Field Values
-
LEVEL_1_BASIC_LANG
public static final int LEVEL_1_BASIC_LANG
- See Also:
- Constant Field Values
-
LEVEL_0_PROPERTY_ONLY
public static final int LEVEL_0_PROPERTY_ONLY
- See Also:
- Constant Field Values
-
-
Constructor Detail
-
AbstractParser
protected AbstractParser()
-
AbstractParser
protected AbstractParser(ParserContext pCtx)
-
-
Method Detail
-
setupParser
public static void setupParser()
This method is internally called by the static initializer for AbstractParser in order to setup the parser. The static initialization populates the operator and literal tables for the parser. In some situations, like OSGi, it may be necessary to utilize this manually.
-
nextTokenSkipSymbols
protected ASTNode nextTokenSkipSymbols()
-
nextToken
protected ASTNode nextToken()
Retrieve the next token in the expression.- Returns:
- -
-
handleSubstatement
public ASTNode handleSubstatement(Substatement stmt)
-
handleUnion
protected ASTNode handleUnion(ASTNode node)
Handle a union between a closed statement and a residual property chain.- Parameters:
node
- an ast node- Returns:
- ASTNode
-
createOperator
private ASTNode createOperator(char[] expr, int start, int end)
Create an operator node.- Parameters:
expr
- an char[] containing the expressionstart
- the start offet for the tokenend
- the end offset for the token- Returns:
- ASTNode
-
subArray
private char[] subArray(int start, int end)
Create a copy of an array based on a sub-range. Works faster than System.arrayCopy() for arrays shorter than 1000 elements in most cases, so the parser uses this internally.- Parameters:
start
- the start offsetend
- the end offset- Returns:
- an array
-
createPropertyToken
private ASTNode createPropertyToken(int st, int end)
Generate a property token- Parameters:
st
- the start offsetend
- the end offset- Returns:
- an ast node
-
procTypedNode
private ASTNode procTypedNode(boolean decl)
Process the current typed node- Parameters:
decl
- node is a declaration or not- Returns:
- and ast node
-
createBlockToken
private ASTNode createBlockToken(int condStart, int condEnd, int blockStart, int blockEnd, int type)
Generate a code block token.- Parameters:
condStart
- the start offset for the conditioncondEnd
- the end offset for the conditionblockStart
- the start offset for the blockblockEnd
- the end offset for the blocktype
- the type of block- Returns:
- and ast node
-
captureCodeBlock
private ASTNode captureCodeBlock(int type)
Capture a code block by type.- Parameters:
type
- the block type- Returns:
- an ast node
-
ifThenElseBlockContinues
protected boolean ifThenElseBlockContinues()
Checking from the current cursor position, check to see if the if-then-else block continues.- Returns:
- boolean value
-
tokenContinues
protected boolean tokenContinues()
Checking from the current cursor position, check to see if we're inside a contiguous identifier.- Returns:
- -
-
expectEOS
protected void expectEOS()
The parser should find a statement ending condition when this is called, otherwise everything should blow up.
-
isNextIdentifier
protected boolean isNextIdentifier()
Checks to see if the next part of the statement is an identifier part.- Returns:
- boolean true if next part is identifier part.
-
captureToEOS
protected void captureToEOS()
Capture from the current cursor position, to the end of the statement.
-
captureToEOSorEOL
protected void captureToEOSorEOL()
From the current cursor position, capture to the end of statement, or the end of line, whichever comes first.
-
captureIdentifier
protected void captureIdentifier()
Capture to the end of the current identifier under the cursor.
-
captureToEOT
protected void captureToEOT()
From the current cursor position, capture to the end of the current token.
-
lastNonWhite
protected boolean lastNonWhite(char c)
-
trimLeft
protected int trimLeft(int pos)
From the specified cursor position, trim out any whitespace between the current position and the end of the last non-whitespace character.- Parameters:
pos
- - current position- Returns:
- new position.
-
trimRight
protected int trimRight(int pos)
From the specified cursor position, trim out any whitespace between the current position and beginning of the first non-whitespace character.- Parameters:
pos
- -- Returns:
- -
-
skipWhitespace
protected void skipWhitespace()
If the cursor is currently pointing to whitespace, move the cursor forward to the first non-whitespace character, but account for carriage returns in the script (updates parser field: line).
-
captureToNextTokenJunction
protected void captureToNextTokenJunction()
From the current cursor position, capture to the end of the next token junction.
-
trimWhitespace
protected void trimWhitespace()
From the current cursor position, trim backward over any whitespace to the first non-whitespace character.
-
setExpression
protected void setExpression(java.lang.String expression)
Set and finesse the expression, trimming an leading or proceeding whitespace.- Parameters:
expression
- the expression
-
setExpression
protected void setExpression(char[] expression)
Set and finesse the expression, trimming an leading or proceeding whitespace.- Parameters:
expression
- the expression
-
lookToLast
protected char lookToLast()
Return the previous non-whitespace character.- Returns:
- -
-
lookBehind
protected char lookBehind()
Return the last character (delta -1 of cursor position).- Returns:
- -
-
lookAhead
protected char lookAhead()
Return the next character (delta 1 of cursor position).- Returns:
- -
-
lookAhead
protected char lookAhead(int range)
Return the character, forward of the currrent cursor position based on the specified range delta.- Parameters:
range
- -- Returns:
- -
-
isNextIdentifierOrLiteral
protected boolean isNextIdentifierOrLiteral()
Returns true if the next is an identifier or literal.- Returns:
- true of false
-
incNextNonBlank
public int incNextNonBlank()
Increment one cursor position, and move cursor to next non-blank part.- Returns:
- cursor position
-
nextNonBlank
public int nextNonBlank()
Move to next cursor position from current cursor position.- Returns:
- cursor position
-
expectNextChar_IW
public void expectNextChar_IW(char c)
Expect the next specified character or fail- Parameters:
c
- character
-
isStatementNotManuallyTerminated
protected boolean isStatementNotManuallyTerminated()
NOTE: This method assumes that the current position of the cursor is at the end of a logical statement, to begin with. Determines whether or not the logical statement is manually terminated with a statement separator (';').- Returns:
- -
-
addFatalError
protected void addFatalError(java.lang.String message)
-
addFatalError
protected void addFatalError(java.lang.String message, int start)
-
setLanguageLevel
public static void setLanguageLevel(int level)
-
loadLanguageFeaturesByLevel
public static java.util.HashMap<java.lang.String,java.lang.Integer> loadLanguageFeaturesByLevel(int languageLevel)
-
isArithmeticOperator
protected static boolean isArithmeticOperator(int operator)
-
arithmeticFunctionReduction
protected int arithmeticFunctionReduction(int operator)
Reduce the current operations on the stack.- Parameters:
operator
- the operator- Returns:
- a stack control code
-
dreduce
private void dreduce()
-
reduce
protected void reduce()
This method is called when we reach the point where we must subEval a trinary operation in the expression. (ie. val1 op val2). This is not the same as a binary operation, although binary operations would appear to have 3 structures as well. A binary structure (or also a junction in the expression) compares the current state against 2 downrange structures (usually an op and a val).
-
reduceNumeric
private void reduceNumeric(int operator)
-
reduce
private void reduce(int op1, int operator, int op2)
-
reduce
private void reduce(int op1, int operator, long op2)
-
reduce
private void reduce(long op1, int operator, int op2)
-
reduce
private void reduce(long op1, int operator, long op2)
-
getExpression
public char[] getExpression()
- Specified by:
getExpression
in interfaceParser
-
asInt
private static int asInt(java.lang.Object o)
-
-