blob: 83e572bfa8dd67ad0261c311b9e60fa2176524fb [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you 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.
options {
STATIC=false;
MULTI=true;
VISITOR=true;
NODE_USES_PARSER=true;
DEBUG_TOKEN_MANAGER=false;
DEBUG_PARSER=false;
}
PARSER_BEGIN(JSParser20)
package org.apache.myfaces.trinidadbuild.plugin.javascript.javascript20parser;
import java.io.IOException;
public class JSParser20
{
//
// This is the root node for the parse tree (root DOM node, tree of SimpleNode(s))
//
protected ASTProgram _jjtRoot;
public ASTProgram getRootNode()
{
return _jjtRoot;
}
}
PARSER_END(JSParser20)
/////////////////////////////////////////////////////
// LEXICAL RULES Section
/////////////////////////////////////////////////////
TOKEN_MGR_DECLS :
{
private boolean isRegValid = true;
public void setRegInvalid()
{
isRegValid = false;
}
public void setRegValid()
{
isRegValid = true;
}
}
/////////////////////////////////////////////////////
// WHITE SPACE
/////////////////////////////////////////////////////
SPECIAL_TOKEN :
{
<EOL: (["\n","\r"])+ >
| <WS: ([" ","\t"])+ >
}
/////////////////////////////////////////////////////
// COMMENTS
/////////////////////////////////////////////////////
MORE :
{
"//" : IN_SINGLE_LINE_COMMENT
| "/*" : IN_MULTI_LINE_COMMENT
}
<IN_SINGLE_LINE_COMMENT>
SPECIAL_TOKEN :
{
< SINGLE_LINE_COMMENT: (~["\n","\r"])* ("\n"|"\r"|"\r\n")? > : DEFAULT
}
<IN_MULTI_LINE_COMMENT>
SPECIAL_TOKEN :
{
<MULTI_LINE_COMMENT: "*/" > : DEFAULT
}
<IN_SINGLE_LINE_COMMENT, IN_MULTI_LINE_COMMENT>
MORE :
{
< ~[] >
}
/////////////////////////////////////////////////////
// RESERVED WORDS AND LITERALS
/////////////////////////////////////////////////////
TOKEN :
{
< AS: "as" >
| < BREAK: "break" >
| < CASE: "case" >
| < CATCH: "catch" >
| < CLASS: "class" >
| < CONST: "const" >
| < CONTINUE: "continue" >
| < _DEFAULT: "default" >
| < DELETE: "delete" >
| < DO: "do" >
| < ELSE: "else" >
| < EXTENDS: "extends" >
| < FALSE: "false" >
| < FINALLY: "finally" >
| < FOR: "for" >
| < FUNCTION: "function" >
| < FUNCTION_: "Function" >
| < GET: "get" >
| < IF: "if" >
| < IN: "in" >
| < INCLUDE: "include" >
| < INSTANCEOF: "instanceof" >
| < IS: "is" >
| < NAMESPACE: "namespace" >
| < NEW: "new" >
| < NULL: "null" >
| < PACKAGE: "package" >
| < PRIVATE: "private" >
| < PUBLIC: "public" >
| < RETURN: "return" >
| < SET: "set" >
| < SUPER: "super" >
| < SWITCH: "switch" >
| < THIS: "this" >
| < THROW: "throw" >
| < TRUE: "true" >
| < TRY: "try" >
| < TYPEOF: "typeof" >
| < USE: "use" >
| < VAR: "var" >
| < VOID: "void" >
| < WHILE: "while" >
| < WITH: "with" >
}
/////////////////////////////////////////////////////
// FUTURE RESERVED WORDS
/////////////////////////////////////////////////////
TOKEN :
{
< ABSTRACT: "abstract" >
| < DEBUGGER: "debugger" >
| < ENUM: "enum" >
| < EXPORT: "export" >
| < GOTO: "goto" >
| < IMPLEMENTS: "implements" >
| < INTERFACE: "interface" >
| < NATIVE: "native" >
| < PROTECTED: "protected" >
| < SYNCHRONIZED: "synchronized" >
| < THROWS: "throws" >
| < TRANSIENT: "transient" >
| < VOLATILE: "volatile" >
| < IMPORT: "import" >
}
/////////////////////////////////////////////////////
// LITERALS
/////////////////////////////////////////////////////
TOKEN :
{
< DECIMAL_LITERAL: ["1"-"9"] (["0"-"9"])* >
| < HEX_LITERAL: "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"])+ >
| < OCTAL_LITERAL: "0" (["0"-"7"])* >
| < FLOATING_POINT_LITERAL: (["0"-"9"])+ "." (["0"-"9"])* (<EXPONENT>)?
| "." (["0"-"9"])+ (<EXPONENT>)?
| (["0"-"9"])+ (<EXPONENT>)?
>
| < #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ >
| < STRING_LITERAL: "\""
( (~["\"","\\","\n","\r"]) | <ESCAPE_SEQUENCE> )*
"\""
| "\""
( (~["\"","\\"]) | "\\" ("\n" | "\r" | "\r\n") | <ESCAPE_SEQUENCE> )*
"\""
| "'"
( (~["'","\\","\n","\r"]) | <ESCAPE_SEQUENCE> )*
"'"
>
| < #ESCAPE_SEQUENCE:
"\\"
( ["n","t","b","r","f","\\","'","\"","[","]"]
| ["0"-"7"] ( ["0"-"7"] )?
| ["0"-"3"] ["0"-"7"] ["0"-"7"]
| ["x"] ["0"-"9","a"-"f","A"-"F"] ["0"-"9","a"-"f","A"-"F"]
| ["u"] ["0"-"9","a"-"f","A"-"F"] ["0"-"9","a"-"f","A"-"F"]
["0"-"9","a"-"f","A"-"F"] ["0"-"9","a"-"f","A"-"F"]
)
>
| < UNTERMINATED_STRING_LITERAL:
"\"" ( (~["\"","\\","\n","\r"]) | <ESCAPE_SEQUENCE> )* ( ["\n","\r"] )?
| "'" ( (~["'","\\","\n","\r"]) | <ESCAPE_SEQUENCE> )* ( ["\n","\r"] )?
>
}
/////////////////////////////////////////////////////
// REGULAR EXPRESSIONS
/////////////////////////////////////////////////////
TOKEN :
{
< #REGX_START_CHAR : ~["\r","\n","/","=","*"] | "\\/">
| < #REGX_BODY_CHAR_EXCLUSION : ~["\r","\n","/"] >
| < #REGX_BODY_CHAR : ( <REGX_BODY_CHAR_EXCLUSION> | "\\/" ) >
| < #REGEX_END_CHAR : "i"
| "g"
| "m"
| "ig"
| "im"
| "gi"
| "gm"
| "mi"
| "mg"
| "igm"
| "img"
| "gmi"
| "gim"
| "mig"
| "mgi"
>
}
TOKEN :
{
<REGULAR_EXPRESSION : "/" <REGX_START_CHAR> (<REGX_BODY_CHAR>)* "/" (<REGEX_END_CHAR>)? >
{
try {
// Peek at the next character.
char nextCh = input_stream.readChar();
input_stream.backup(1);
if (isRegValid == false || nextCh == '/' || nextCh == '*') {
//
// Lexecal analyser thinks it is a RE
// operator such as /...../
// Put the everything to the first "/" back on the input stream
//
input_stream.backup(lengthOfMatch-1);
//
// And remove it from the token
//
matchedToken.image = matchedToken.image.substring(0, 1);
image.delete(0, image.length() - 1);
image.append('/');
matchedToken.kind=SLASH;
}
} catch (IOException e) {
throw new Error(e.toString());
}
}
}
/////////////////////////////////////////////////////
// IDENTIFIERS
/////////////////////////////////////////////////////
TOKEN :
{
< IDENTIFIER: <LETTER> (<LETTER>|<DIGIT>)* >
| < #LETTER: ["a"-"z","A"-"Z","$","_"] >
| < #DIGIT: ["0"-"9"]>
}
/////////////////////////////////////////////////////
// SEPARATORS
/////////////////////////////////////////////////////
TOKEN :
{
< LPAREN: "(" >
| < RPAREN: ")" >
| < LBRACE: "{" >
| < RBRACE: "}" >
| < LBRACKET: "[" >
| < RBRACKET: "]" >
| < SEMICOLON: ";" >
| < COMMA: "," >
| < DOT: "." >
| < QUALIFIER: "::" >
| < ELIPSE: "..." >
}
/////////////////////////////////////////////////////
// OPERATORS
/////////////////////////////////////////////////////
TOKEN :
{
< ASSIGN: "=" >
| < GT: ">" >
| < LT: "<" >
| < BANG: "!" >
| < TILDE: "~" >
| < HOOK: "?" >
| < COLON: ":" >
| < EQ: "==" >
| < LE: "<=" >
| < GE: ">=" >
| < NE: "!=" >
| < SC_OR: "||" >
| < SC_AND: "&&" >
| < SC_XOR: "^^" >
| < INCR: "++" >
| < DECR: "--" >
| < PLUS: "+" >
| < MINUS: "-" >
| < STAR: "*" >
| < SLASH: "/" >
| < BIT_AND: "&" >
| < BIT_OR: "|" >
| < XOR: "^" >
| < REM: "%" >
| < LSHIFT: "<<" >
| < RSIGNEDSHIFT: ">>" >
| < RUNSIGNEDSHIFT: ">>>" >
| < PLUSASSIGN: "+=" >
| < MINUSASSIGN: "-=" >
| < STARASSIGN: "*=" >
| < SLASHASSIGN: "/=" >
| < ANDASSIGN: "&=" >
| < ORASSIGN: "|=" >
| < XORASSIGN: "^=" >
| < REMASSIGN: "%=" >
| < LSHIFTASSIGN: "<<=" >
| < RSIGNEDSHIFTASSIGN: ">>=" >
| < RUNSIGNEDSHIFTASSIGN: ">>>=" >
| < SC_ORASSIGN: "||=" >
| < SC_ANDASSIGN: "&&=" >
| < SC_XORASSIGN: "^^=" >
| < IDENTITYOPER: "===" >
| < NOTIDENTITYOPER: "!==" >
}
///////////////////////////////////////////////////////////////////
// GRAMMAR Section
///////////////////////////////////////////////////////////////////
Token Program():
{
Token retval = getToken(1);
}
{
(PackageDefinition())* [Directives()] <EOF>
{
_jjtRoot = jjtThis;
return retval;
}
}
/////////////////////////////////////////////////////
// Expressions
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
// Identifier
/////////////////////////////////////////////////////
void Identifier():
{}
{
<IDENTIFIER>
| <GET>
| <SET>
| <INCLUDE>
// | <NAMESPACE>
}
/////////////////////////////////////////////////////
// Qualified Identifier
/////////////////////////////////////////////////////
void SimpleQualifiedIdentifier():
{}
{
Identifier() [<QUALIFIER> Identifier()]
| ReservedNamespace() [<QUALIFIER> Identifier()]
}
void ExpressionQualifiedIdentifier():
{}
{
<LPAREN> AssignmentExpression() <RPAREN> <QUALIFIER> Identifier()
}
void QualifiedIdentifier():
{}
{
SimpleQualifiedIdentifier()
| ExpressionQualifiedIdentifier()
}
/////////////////////////////////////////////////////
// Primary Expressions
/////////////////////////////////////////////////////
void PrimaryExpression ():
{}
{
(
<NULL>
| <TRUE>
| <FALSE>
| <DECIMAL_LITERAL>
| <OCTAL_LITERAL>
| <HEX_LITERAL>
| <FLOATING_POINT_LITERAL>
| <STRING_LITERAL>
| <THIS>
| <REGULAR_EXPRESSION>
| <LPAREN> ListExpression() <RPAREN>
| ArrayLiteral()
| ObjectLiteral()
| FunctionExpression()
)
{
token_source.setRegValid();
}
}
void ReservedNamespace ():
{}
{
<PUBLIC>
| <PROTECTED>
| <PRIVATE>
}
/////////////////////////////////////////////////////
// Function Expression
/////////////////////////////////////////////////////
void FunctionExpression ():
{}
{
LOOKAHEAD(2) <FUNCTION> FunctionCommon()
| <FUNCTION> Identifier() FunctionCommon()
}
/////////////////////////////////////////////////////
// Object Literals
/////////////////////////////////////////////////////
void ObjectLiteral ():
{}
{
<LBRACE> [FieldList()] <RBRACE>
}
void FieldList():
{}
{
LiteralField() (<COMMA> LiteralField())*
}
void LiteralField ():
{}
{
FieldName() <COLON> AssignmentExpression()
}
void FieldName ():
{}
{
<STRING_LITERAL>
| <DECIMAL_LITERAL>
| SimpleQualifiedIdentifier()
| <LPAREN> AssignmentExpression() <RPAREN> [<QUALIFIER> Identifier()]
}
/////////////////////////////////////////////////////
// Array Literal
/////////////////////////////////////////////////////
void ArrayLiteral():
{}
{
<LBRACKET> [ElementList()] <RBRACKET>
}
void ElementList():
{}
{
LiteralElement() (<COMMA> LiteralElement())*
}
void LiteralElement():
{}
{
AssignmentExpression()
}
/////////////////////////////////////////////////////
// Super Expression
/////////////////////////////////////////////////////
void SuperExpression ():
{}
{
<SUPER> [LOOKAHEAD(2) <LPAREN> AssignmentExpression() <RPAREN>]
}
/////////////////////////////////////////////////////
// Postfix Expression
/////////////////////////////////////////////////////
void PostfixExpression ():
{}
{
AttributeExpression () [PostfixOp()]
| {token_source.setRegInvalid();}
FullPostfixExpression () (PropertyOrArguments())* [PostfixOp()]
| SuperExpression() PropertyOperator()
}
void AttributeExpression ():
{}
{
SimpleQualifiedIdentifier() (PropertyOrArguments())*
}
void FullPostfixExpression ():
{}
{
LOOKAHEAD(<LPAREN> AssignmentExpression() <RPAREN> <QUALIFIER>)
ExpressionQualifiedIdentifier()
| PrimaryExpression()
| FullNewExpression()
}
void FullNewExpression ():
{}
{
<NEW> FullNewSubexpression() (LOOKAHEAD(2) PropertyOperator())* [LOOKAHEAD(2) Arguments()]
}
void FunctionConstructor():
{}
{
<FUNCTION_> Arguments()
}
void FullNewSubexpression ():
{}
{
LOOKAHEAD(<LPAREN> AssignmentExpression() <RPAREN> <QUALIFIER>)
ExpressionQualifiedIdentifier()
| PrimaryExpression()
| SimpleQualifiedIdentifier()
| SuperExpression()
| FullNewExpression()
| FunctionConstructor()
}
void PostfixOp():
{}
{
<INCR>
| <DECR>
}
void PropertyOrArguments ():
{}
{
Arguments()
| PropertyOperator()
}
/////////////////////////////////////////////////////
// Property Operators
/////////////////////////////////////////////////////
void PropertyOperator ():
{}
{
<DOT> QualifiedIdentifier()
| LOOKAHEAD(2) <LBRACKET> <RBRACKET>
| LOOKAHEAD(2) <LBRACKET> <ELIPSE> AssignmentExpression() <RBRACKET>
| <LBRACKET> ListExpression() [<ELIPSE> AssignmentExpression()] <RBRACKET>
}
void Arguments ():
{{token_source.setRegValid();}}
{
LOOKAHEAD(2) <LPAREN> <RPAREN>
| LOOKAHEAD(2) <LPAREN> <ELIPSE> AssignmentExpression() <RPAREN>
| <LPAREN> ListExpression() [<ELIPSE> AssignmentExpression()] <RPAREN>
}
/////////////////////////////////////////////////////
// Unary Operators
/////////////////////////////////////////////////////
void UnaryExpression ():
{}
{
PostfixExpression()
| <DELETE> PostfixExpression()
| <VOID> UnaryExpression()
| <TYPEOF> UnaryExpression()
| <INCR> PostfixExpression()
| <DECR> PostfixExpression()
| <PLUS> UnaryExpression()
| <MINUS> UnaryExpression()
| <TILDE> UnaryExpression()
| <BANG> UnaryExpression()
}
/////////////////////////////////////////////////////
// Multiplicative Operators
/////////////////////////////////////////////////////
void MulOp():
{}
{
<STAR>
| <SLASH>
| <REM>
}
void MultiplicativeExpression():
{}
{
UnaryExpression() (MulOp() UnaryExpression())*
}
/////////////////////////////////////////////////////
// Additive Operators
/////////////////////////////////////////////////////
void AddOp():
{}
{
<PLUS>
| <MINUS>
}
void AdditiveExpression():
{}
{
MultiplicativeExpression() (AddOp() MultiplicativeExpression())*
}
/////////////////////////////////////////////////////
// Bitwise Shift Operators
/////////////////////////////////////////////////////
void ShiftOp():
{}
{
<LSHIFT>
| <RSIGNEDSHIFT>
| <RUNSIGNEDSHIFT>
}
void ShiftExpression():
{}
{
AdditiveExpression() (ShiftOp() AdditiveExpression())*
}
/////////////////////////////////////////////////////
// Relational Operators
/////////////////////////////////////////////////////
void RelOp():
{}
{
<LT>
| <GT>
| <LE>
| <GE>
| <IS>
| <AS>
}
void RelationalExpression():
{}
{
ShiftExpression()
(LOOKAHEAD(3)(RelOp() | <IN> | <INSTANCEOF> ) ShiftExpression())*
}
void RelationalExpressionNoIN():
{}
{
ShiftExpression()
((RelOp() | <INSTANCEOF>) ShiftExpression())*
}
/////////////////////////////////////////////////////
// Equality Operators
/////////////////////////////////////////////////////
void EqualOp():
{}
{
<EQ>
| <NE>
| <IDENTITYOPER>
| <NOTIDENTITYOPER>
}
void EqualityExpression():
{}
{
RelationalExpression() (EqualOp() RelationalExpression())*
}
void EqualityExpressionNoIN():
{}
{
RelationalExpressionNoIN() (EqualOp() RelationalExpressionNoIN())*
}
/////////////////////////////////////////////////////
// Binary Bitwise Operators
/////////////////////////////////////////////////////
void BitwiseANDOp():
{}
{
<BIT_AND>
}
void BitwiseANDExpression():
{}
{
EqualityExpression() (BitwiseANDOp() EqualityExpression())*
}
void BitwiseANDExpressionNoIN():
{}
{
EqualityExpressionNoIN() (BitwiseANDOp() EqualityExpressionNoIN())*
}
void BitwiseXOROp():
{}
{
<XOR>
}
void BitwiseXORExpression():
{}
{
BitwiseANDExpression() (BitwiseXOROp() BitwiseANDExpression())*
}
void BitwiseXORExpressionNoIN():
{}
{
BitwiseANDExpressionNoIN() (BitwiseXOROp() BitwiseANDExpressionNoIN())*
}
void BitwiseOROp():
{}
{
<BIT_OR>
}
void BitwiseORExpression():
{}
{
BitwiseXORExpression() (BitwiseOROp() BitwiseXORExpression())*
}
void BitwiseORExpressionNoIN():
{}
{
BitwiseXORExpressionNoIN() (BitwiseOROp() BitwiseXORExpressionNoIN())*
}
/////////////////////////////////////////////////////
// Binary Logical Operators
/////////////////////////////////////////////////////
void LogicalANDExpression():
{}
{
BitwiseORExpression() (<SC_AND> BitwiseORExpression())*
}
void LogicalANDExpressionNoIN():
{}
{
BitwiseORExpressionNoIN() (<SC_AND> BitwiseORExpressionNoIN())*
}
void LogicalORExpression():
{}
{
LogicalANDExpression() (<SC_OR> LogicalANDExpression())*
}
void LogicalORExpressionNoIN():
{}
{
LogicalANDExpressionNoIN() (<SC_OR> LogicalANDExpressionNoIN())*
}
/////////////////////////////////////////////////////
// Conditional Operators
/////////////////////////////////////////////////////
void ConditionalExpression():
{}
{
LogicalORExpression() [<HOOK> AssignmentExpression()
<COLON> AssignmentExpression()]
}
void ConditionalExpressionNoIN():
{}
{
LogicalORExpressionNoIN() [<HOOK> AssignmentExpressionNoIN()
<COLON> AssignmentExpressionNoIN()]
}
void NonAssignmentExpression():
{}
{
LogicalORExpression() [<HOOK> NonAssignmentExpression()
<COLON> NonAssignmentExpression()]
}
void NonAssignmentExpressionNoIN():
{}
{
LogicalORExpressionNoIN() [<HOOK> NonAssignmentExpressionNoIN()
<COLON> NonAssignmentExpressionNoIN()]
}
/////////////////////////////////////////////////////
// Assignment Operators
/////////////////////////////////////////////////////
void AssignementOperator():
{}
{
<ASSIGN>
| <STARASSIGN>
| <SLASHASSIGN>
| <REMASSIGN>
| <PLUSASSIGN>
| <MINUSASSIGN>
| <LSHIFTASSIGN>
| <RSIGNEDSHIFTASSIGN>
| <RUNSIGNEDSHIFTASSIGN>
| <ANDASSIGN>
| <XORASSIGN>
| <ORASSIGN>
| <SC_ANDASSIGN>
| <SC_XORASSIGN>
| <SC_ORASSIGN>
}
void AssignmentExpression():
{}
{
ConditionalExpression() [LOOKAHEAD(2) AssignementOperator() AssignmentExpression()]
}
void AssignmentExpressionNoIN():
{}
{
ConditionalExpressionNoIN() [LOOKAHEAD(2) AssignementOperator() AssignmentExpressionNoIN()]
}
/////////////////////////////////////////////////////
// Comma Expressions
/////////////////////////////////////////////////////
void ListExpression ():
{}
{
AssignmentExpression() (<COMMA> AssignmentExpression())*
}
void ListExpressionNoIN ():
{}
{
AssignmentExpressionNoIN() (<COMMA> AssignmentExpressionNoIN())*
}
/////////////////////////////////////////////////////
// Type Expressions
/////////////////////////////////////////////////////
void TypeExpression ():
{}
{
NonAssignmentExpression()
}
void TypeExpressionNoIN ():
{}
{
NonAssignmentExpressionNoIN()
}
void TypeExpressionList ():
{}
{
NonAssignmentExpression() (<COMMA> NonAssignmentExpression())*
}
/////////////////////////////////////////////////////
// Staements (abbrev, noShortIf, full)
/////////////////////////////////////////////////////
void Statement ():
{}
{
LOOKAHEAD(3) ExpressionStatement() Sc()
| SuperStatement() Sc()
| Block()
| LabeledStatement()
| IfStatement()
| SwitchStatement()
| DoStatement() Sc()
| WhileStatement()
| ForStatement()
| WithStatement()
| ContinueStatement() Sc()
| BreakStatement() Sc()
| ReturnStatement() Sc()
| ThrowStatement() Sc()
| TryStatement()
}
void Substatement ():
{}
{
EmptyStatement()
| LOOKAHEAD(2) Statement()
| SimpleVariableDefinition() Sc()
| Attributes() <LBRACE> Substatements() <RBRACE>
}
void Substatements ():
{}
{
(Substatement())+
}
JAVACODE
void Sc() {
Token tok = getToken(1);
if (tok.kind == SEMICOLON) {
tok = getNextToken();
} else if (tok.specialToken != null) {
if (!EolCommentSkipWs(tok.specialToken) && (tok.kind != EOF)) {
throw generateParseException();
}
} else if ((tok.kind != EOF) && (tok.kind!=RBRACE)) {
throw generateParseException();
}
}
JAVACODE
boolean EolCommentSkipWs(Token t) {
boolean retVal = false;
Token specialToken = t;
while(specialToken != null) {
if(specialToken.kind == WS) {
specialToken = specialToken.specialToken;
continue;
}
else if(specialToken.kind == EOL ||
specialToken.kind == SINGLE_LINE_COMMENT) {
retVal = true;
break;
}
else {
break;
}
}
return retVal;
}
/////////////////////////////////////////////////////
// Empty Statement
/////////////////////////////////////////////////////
void EmptyStatement():
{}
{
<SEMICOLON>
}
/////////////////////////////////////////////////////
// Expresion Statement
/////////////////////////////////////////////////////
void ExpressionStatement():
{}
{
ListExpression()
}
/////////////////////////////////////////////////////
// Super Statement
/////////////////////////////////////////////////////
void SuperStatement ():
{}
{
<SUPER> Arguments()
}
/////////////////////////////////////////////////////
// Block Statement
/////////////////////////////////////////////////////
void Block ():
{}
{
<LBRACE> [Directives()] <RBRACE>
}
/////////////////////////////////////////////////////
// Labeled Statement (maps to literal field)
/////////////////////////////////////////////////////
void LabeledStatement ():
{}
{
Identifier() <COLON> Substatement()
}
/////////////////////////////////////////////////////
// If Statement
/////////////////////////////////////////////////////
void IfStatement():
{}
{
<IF> <LPAREN> ListExpression() <RPAREN>
Substatement()
[LOOKAHEAD(1) <ELSE> Substatement()]
}
/////////////////////////////////////////////////////
// Switch Statement
/////////////////////////////////////////////////////
void SwitchStatement ():
{}
{
<SWITCH> <LPAREN> ListExpression() <RPAREN>
<LBRACE> [CaseElements()] <RBRACE>
}
void CaseElements ():
{}
{
CaseLabel() (CaseElement())*
}
void CaseElement ():
{}
{
Directive()
| CaseLabel()
}
void CaseLabel ():
{}
{
<CASE> ListExpression() <COLON>
| <_DEFAULT> <COLON>
}
/////////////////////////////////////////////////////
// Do-While Statement
/////////////////////////////////////////////////////
void DoStatement():
{}
{
<DO> Substatement() <WHILE> <LPAREN> ListExpression() <RPAREN>
}
/////////////////////////////////////////////////////
// While Statement
/////////////////////////////////////////////////////
void WhileStatement ():
{}
{
<WHILE> <LPAREN> ListExpression() <RPAREN>
Substatement()
}
/////////////////////////////////////////////////////
// For Statements
/////////////////////////////////////////////////////
void ForStatement ():
{}
{
LOOKAHEAD(<FOR> <LPAREN> ForInBinding() <IN>)
<FOR> <LPAREN> ForInBinding() <IN> ListExpression() <RPAREN>
Substatement()
| <FOR> <LPAREN> [ForInitializer()] <SEMICOLON>
[ListExpression()] <SEMICOLON>
[ListExpression()] <RPAREN>
Substatement()
}
void ForInitializer ():
{}
{
LOOKAHEAD(3) ListExpressionNoIN()
| VariableDefinitionNoIN()
| Attributes() VariableDefinitionNoIN()
}
void ForInBinding ():
{}
{
LOOKAHEAD(3) PostfixExpression()
| VariableDefinitionKind() VariableBindingNoIN()
| Attributes() VariableDefinitionKind() VariableBindingNoIN()
}
/////////////////////////////////////////////////////
// With Statement
/////////////////////////////////////////////////////
void WithStatement():
{}
{
<WITH> <LPAREN> ExpressionStatement() <RPAREN>
Substatement()
}
/////////////////////////////////////////////////////
// Continue and Break Statement
/////////////////////////////////////////////////////
void ContinueStatement():
{}
{
<CONTINUE> [Identifier()]
}
void BreakStatement():
{}
{
<BREAK> [Identifier()]
}
/////////////////////////////////////////////////////
// Return Statement
/////////////////////////////////////////////////////
void ReturnStatement():
{}
{
<RETURN> [ListExpression()]
}
/////////////////////////////////////////////////////
// Throw Statement
/////////////////////////////////////////////////////
void ThrowStatement():
{}
{
<THROW> ListExpression()
}
/////////////////////////////////////////////////////
// Try Statement
/////////////////////////////////////////////////////
void TryStatement():
{}
{
<TRY> Block()
(<CATCH> <LPAREN> Identifier() <RPAREN> Block())*
[<FINALLY> Block()]
}
/////////////////////////////////////////////////////
// Directives
/////////////////////////////////////////////////////
void Directives ():
{}
{
(Directive())+
}
void Directive ():
{}
{
EmptyStatement()
| LOOKAHEAD(3) Statement()
| LOOKAHEAD(2) AnnotatableDirective()
| LOOKAHEAD(2) Attributes() <LBRACE> Directives() <RBRACE>
| LOOKAHEAD(2) Attributes() AnnotatableDirective()
| IncludeDirective() Sc()
| Pragma() Sc()
}
void AnnotatableDirective ():
{}
{
VariableDefinition() Sc()
| FunctionDefinition()
| ClassDefinition()
| InterfaceDefinition()
| NamespaceDefinition() Sc()
| ImportDirective() Sc()
| ExportDefinition() Sc()
| UseDirective() Sc()
}
/////////////////////////////////////////////////////
// Attributes
/////////////////////////////////////////////////////
void Attributes ():
{}
{
(Attribute ())+
}
void Attribute ():
{}
{
AttributeExpression()
| <TRUE>
| <FALSE>
}
/////////////////////////////////////////////////////
// Use Directive
/////////////////////////////////////////////////////
void UseDirective ():
{}
{
<USE> <NAMESPACE> <LPAREN> ListExpression() <RPAREN>
}
/////////////////////////////////////////////////////
// Import Directive
/////////////////////////////////////////////////////
void ImportDirective ():
{}
{
LOOKAHEAD(3) <IMPORT> PackageName()
| <IMPORT> Identifier() <ASSIGN> PackageName()
}
/////////////////////////////////////////////////////
// Include Directive
/////////////////////////////////////////////////////
void IncludeDirective ():
{}
{
<INCLUDE> <STRING_LITERAL>
}
/////////////////////////////////////////////////////
// Pragma
/////////////////////////////////////////////////////
void Pragma ():
{}
{
<USE> PragmaItems()
}
void PragmaItems ():
{}
{
PragmaItem() (<COMMA> PragmaItem())
}
void PragmaItem ():
{}
{
PragmaExpr() [<HOOK>]
}
void PragmaExpr ():
{}
{
Identifier() [<LPAREN> PragmaArgument() <RPAREN>]
}
void PragmaArgument ():
{}
{
<TRUE>
| <FALSE>
| <DECIMAL_LITERAL>
| <OCTAL_LITERAL>
| <HEX_LITERAL>
| <FLOATING_POINT_LITERAL>
| <STRING_LITERAL>
}
/////////////////////////////////////////////////////
// Definitions
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
// Export Definition
/////////////////////////////////////////////////////
void ExportDefinition ():
{}
{
<EXPORT> ExportBindingList ()
}
void ExportBindingList ():
{}
{
ExportBinding() (<COMMA> ExportBinding())*
}
void ExportBinding ():
{}
{
LOOKAHEAD(2) FunctionName ()
| FunctionName () <ASSIGN> FunctionName ()
}
/////////////////////////////////////////////////////
// Variable Definition (in, NoIN)
/////////////////////////////////////////////////////
void VariableDefinition ():
{}
{
VariableDefinitionKind() VariableBindingList()
}
void VariableDefinitionNoIN ():
{}
{
VariableDefinitionKind() VariableBindingListNoIN()
}
void VariableDefinitionKind ():
{}
{
<VAR>
| <CONST>
}
void VariableBindingList ():
{}
{
VariableBinding() (<COMMA> VariableBinding ())*
}
void VariableBindingListNoIN ():
{}
{
VariableBindingNoIN() (<COMMA> VariableBindingNoIN())*
}
void VariableBinding ():
{}
{
TypedIdentifier() [VariableInitialisation()]
}
void VariableBindingNoIN ():
{}
{
TypedIdentifierNoIN() [VariableInitialisationNoIN()]
}
void VariableInitialisation ():
{}
{
<ASSIGN> VariableInitializer ()
}
void VariableInitialisationNoIN ():
{}
{
<ASSIGN> VariableInitializerNoIN ()
}
void VariableInitializer ():
{}
{
LOOKAHEAD(3) AssignmentExpression ()
| Attributes ()
}
void VariableInitializerNoIN ():
{}
{
LOOKAHEAD(3) AssignmentExpressionNoIN ()
| Attributes ()
}
void TypedIdentifier ():
{}
{
Identifier () [<COLON> TypeExpression()]
}
void TypedIdentifierNoIN ():
{}
{
Identifier () [<COLON> TypeExpressionNoIN()]
}
/////////////////////////////////////////////////////
// Simple Variable Definition
/////////////////////////////////////////////////////
void SimpleVariableDefinition ():
{}
{
<VAR> UntypedVariableBindingList()
}
void UntypedVariableBindingList ():
{}
{
UntypedVariableBinding() (<COMMA> UntypedVariableBinding())*
}
void UntypedVariableBinding ():
{}
{
Identifier() VariableInitialisation()
}
/////////////////////////////////////////////////////
// Function Definition
/////////////////////////////////////////////////////
void FunctionDefinition ():
{}
{
<FUNCTION> FunctionName() FunctionCommon()
}
void FunctionName ():
{}
{
// no line break after get
LOOKAHEAD(2) <GET> Identifier()
// no line break after get
| LOOKAHEAD(2) <SET> Identifier()
| Identifier()
}
void FunctionCommon ():
{}
{
<LPAREN> [Parameters()] <RPAREN> [Result()] Block()
}
void Parameters ():
{}
{
RestParameters()
| ParameterInit() (<COMMA> ParameterInit())* [RestParameters()]
}
void Parameter ():
{}
{
[<CONST>] TypedIdentifier()
}
void ParameterInit ():
{}
{
Parameter() [<ASSIGN> AssignmentExpression()]
}
void RestParameters ():
{}
{
<ELIPSE> [<CONST> Identifier()]
}
void Result ():
{}
{
<COLON> TypeExpression()
}
/////////////////////////////////////////////////////
// Class Definition
/////////////////////////////////////////////////////
void ClassDefinition ():
{}
{
<CLASS> Identifier() [Inheritance()] Block()
}
void InterfaceDefinition ():
{}
{
LOOKAHEAD(3) <INTERFACE> Identifier() Sc()
| <INTERFACE> Identifier()
[<EXTENDS> TypeExpressionList()] Block()
}
void Inheritance ():
{}
{
<EXTENDS> TypeExpression() [<IMPLEMENTS> TypeExpressionList()]
| <IMPLEMENTS> TypeExpressionList()
}
/////////////////////////////////////////////////////
// Namespace Definition
/////////////////////////////////////////////////////
void NamespaceDefinition ():
{}
{
<NAMESPACE> Identifier()
}
/////////////////////////////////////////////////////
// Package Definition
/////////////////////////////////////////////////////
void PackageDefinition ():
{}
{
<PACKAGE> [PackageName()] Block()
}
void PackageName ():
{}
{
<STRING_LITERAL>
| PackageIdentifiers()
}
void PackageIdentifiers ():
{}
{
Identifier() (<DOT> Identifier())*
}