blob: 9fd40d92426df4189c444253ffade05e353ba43d [file] [log] [blame]
*******************************************************************************
* Copyright (c) 2005 BEA Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* BEA Systems - initial implementation
*
*******************************************************************************/
/* I know that having some of these options on one line is rude but
* if we don't do that the line number reported from javacc are off
* which, trust me, is far more annoying. --tcarroll@bea.com
*/
options {
JAVA_UNICODE_ESCAPE = false;
UNICODE_INPUT = true;
STATIC = false;
OPTIMIZE_TOKEN_MANAGER = true; MULTI = true; VISITOR = true; NODE_PACKAGE = "org.eclipse.jst.jsp.core.internal.java.jspel"; NODE_SCOPE_HOOK = true;
}
PARSER_BEGIN(JSPELParser)
package org.eclipse.jst.jsp.core.internal.java.jspel;
public class JSPELParser {
void jjtreeOpenNodeScope(Node n)
{
((SimpleNode)n).setFirstToken(getToken(1));
}
void jjtreeCloseNodeScope(Node n)
{
((SimpleNode)n).setLastToken(getToken(0));
}
public static JSPELParser createParser(java.lang.String input) {
java.io.StringReader reader = new java.io.StringReader(input);
return new JSPELParser(reader);
}
public void ReInit(java.lang.String input) {
java.io.StringReader reader = new java.io.StringReader(input);
ReInit(reader);
}
}
PARSER_END(JSPELParser)
SKIP :
{
" "
| "\t"
| "\n"
| "\r"
}
TOKEN :
{
/* Literals */
< INTEGER_LITERAL: ["0"-"9"] (["0"-"9"])* >
|
< FLOATING_POINT_LITERAL:
(["0"-"9"])+ "." (["0"-"9"])* (<EXPONENT>)?
| "." (["0"-"9"])+ (<EXPONENT>)?
| (["0"-"9"])+ <EXPONENT>
>
|
< #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ >
|
< STRING_LITERAL:
("\"" ((~["\"","\\"]) | ("\\" ( ["\\","\""] )))* "\"") |
("\'" ((~["\'","\\"]) | ("\\" ( ["\\","\'"] )))* "\'")
>
|
< BADLY_ESCAPED_STRING_LITERAL:
("\"" (~["\"","\\"])* ("\\" ( ~["\\","\""] ))) |
("\'" (~["\'","\\"])* ("\\" ( ~["\\","\'"] )))
>
/* Reserved Words and Symbols */
| < TRUE: "true" >
| < FALSE: "false" >
| < NULL: "null" >
| < DOT: "." >
| < GT1: ">" >
| < GT2: "gt" >
| < LT1: "<" >
| < LT2: "lt" >
| < EQ1: "==" >
| < EQ2: "eq" >
| < LE1: "<=" >
| < LE2: "le" >
| < GE1: ">=" >
| < GE2: "ge" >
| < NEQ1: "!=" >
| < NEQ2: "ne" >
| < LPAREN: "(" >
| < RPAREN: ")" >
| < COMMA: "," >
| < COLON: ":" >
| < LBRACKET: "[" >
| < RBRACKET: "]" >
| < PLUS: "+" >
| < MINUS: "-" >
| < MULTIPLY: "*" >
| < DIVIDE1: "/" >
| < DIVIDE2: "div" >
| < MODULUS1: "%" >
| < MODULUS2: "mod" >
| < NOT1: "not" >
| < NOT2: "!" >
| < AND1: "and" >
| < AND2: "&&" >
| < OR1: "or" >
| < OR2: "||" >
| < EMPTY: "empty" >
| < COND: "?" >
/* Identifiers */
| < IDENTIFIER: (<LETTER>|<IMPL_OBJ_START>) (<LETTER>|<DIGIT>)* >
| < #IMPL_OBJ_START: "#" >
|
< #LETTER:
[
"\u0024",
"\u0041"-"\u005a",
"\u005f",
"\u0061"-"\u007a",
"\u00c0"-"\u00d6",
"\u00d8"-"\u00f6",
"\u00f8"-"\u00ff",
"\u0100"-"\u1fff",
"\u3040"-"\u318f",
"\u3300"-"\u337f",
"\u3400"-"\u3d2d",
"\u4e00"-"\u9fff",
"\uf900"-"\ufaff"
]
>
|
< #DIGIT:
[
"\u0030"-"\u0039",
"\u0660"-"\u0669",
"\u06f0"-"\u06f9",
"\u0966"-"\u096f",
"\u09e6"-"\u09ef",
"\u0a66"-"\u0a6f",
"\u0ae6"-"\u0aef",
"\u0b66"-"\u0b6f",
"\u0be7"-"\u0bef",
"\u0c66"-"\u0c6f",
"\u0ce6"-"\u0cef",
"\u0d66"-"\u0d6f",
"\u0e50"-"\u0e59",
"\u0ed0"-"\u0ed9",
"\u1040"-"\u1049"
]
>
}
ASTExpression Expression() : {}
{
(LOOKAHEAD("?") ChoiceExpression() | OrExpression()) { return jjtThis; }
}
void OrExpression() #OrExpression(>1) :
{
Token t;
}
{
AndExpression() ((t = <OR1> | t = <OR2>) { jjtThis.addOperatorToken(t); }
AndExpression())*
}
void AndExpression() #AndExpression(>1) :
{
Token t;
}
{
EqualityExpression() ((t = <AND1> | t = <AND2>) { jjtThis.addOperatorToken(t); }
EqualityExpression())*
}
void EqualityExpression() #EqualityExpression(>1) :
{
Token t;
}
{
RelationalExpression()
((t = <EQ1> | t = <EQ2> | t = <NEQ1> | t = <NEQ2>) { jjtThis.addOperatorToken(t); }
RelationalExpression())*
}
void RelationalExpression() #RelationalExpression(>1) :
{
Token t;
}
{
AddExpression()
(
(t = <LT1> | t = <LT2> | t = <GT1> | t = <GT2> | t = <GE1> | t = <GE2> | t = <LE1> | t = <LE2>) { jjtThis.addOperatorToken(t); }
AddExpression()
)*
}
void AddExpression() #AddExpression(>1) :
{
Token t;
}
{
MultiplyExpression() ((t = <PLUS> | t = <MINUS>) { jjtThis.addOperatorToken(t); }
MultiplyExpression())*
}
void MultiplyExpression() #MultiplyExpression(>1) :
{
Token t;
}
{
UnaryExpression() (
( t = <MULTIPLY> | t = <DIVIDE1> | t = <DIVIDE2> | t = <MODULUS1> | t = <MODULUS2>) { jjtThis.addOperatorToken(t); }
UnaryExpression()
)*
}
void ChoiceExpression() : {}
{
OrExpression() <COND> OrExpression() <COLON> OrExpression()
}
void UnaryExpression() : {}
{
((<NOT1> | <NOT2> | <MINUS> | <EMPTY>) UnaryExpression())
| Value()
}
void Value() : {}
{
ValuePrefix() (ValueSuffix())*
}
void ValuePrefix() : {}
{
Literal() | (<LPAREN> Expression() <RPAREN>) | LOOKAHEAD(3) FunctionInvocation() | <IDENTIFIER>
}
void ValueSuffix() :
{
Token t = null;
}
{
(<DOT> (t = <IDENTIFIER>)?) { jjtThis.setPropertyNameToken(t); }
| (<LBRACKET> Expression() <RBRACKET>)
}
void FunctionInvocation() :
{
Token prefix = null, name = null;
}
{
(prefix = <IDENTIFIER> <COLON>) { jjtThis.setFullFunctionName(prefix.image + ":"); }
(name = <IDENTIFIER>)? {
if(null != prefix && null != name)
jjtThis.setFullFunctionName(prefix.image + ":" + (null == name ? "" : name.image));
else if(null != name)
jjtThis.setFullFunctionName(name.image);
}
(<LPAREN> Expression() (<COMMA> Expression())* try { (<RPAREN>) } catch (Exception e) {} )?
}
void Literal() : {}
{
<TRUE> | <FALSE> | <INTEGER_LITERAL> | <FLOATING_POINT_LITERAL> | <STRING_LITERAL> | <NULL>
}