BNF for LARAEcmaScript.jj

TOKENS

/*****************************************
 * LEXICAL & REGEXP GRAMMARS STARTS HERE *
 *****************************************/


/* Section 7 : Lexical Conventions */

/* Section 7.2 : White Space */
<DEFAULT,IN_REGEX> SPECIAL : {
<WHITE_SPACE: <TAB> | <VT> | <FF> | <SP> | <NBSP>>
| <#TAB: "\t" | "\t">
| <#VT: "\u000b">
| <#FF: "\f" | "\f">
| <#SP: " " | " ">
| <#NBSP: "\u00a0">
| <#USP: ["\u2000"] | ["\u2001"] | ["\u2002"] | ["\u2003"] | ["\u2004"] | ["\u2005"] | ["\u2006"] | ["\u2007"] | ["\u2008"] | ["\u2009"] | ["\u200a"] | ["\u200b"] | ["\u3000"]>
}

   
/* Section 7.3 : Line Terminators */
<DEFAULT,IN_REGEX> SPECIAL : {
<LINE_TERMINATOR: <LF> | <CR> | <LS> | <PS>>
| <#LF: "\n">
| <#CR: "\r">
| <#LS: "\u2028">
| <#PS: "\u2029">
}

   
/* Comments */
<DEFAULT,IN_REGEX> MORE : {
"//" : IN_SINGLE_LINE_COMMENT
| "/*" : IN_MULTI_LINE_COMMENT
}

   
<IN_SINGLE_LINE_COMMENT> SPECIAL : {
<SINGLE_LINE_COMMENT: (~["\n","\r"])* ("\n" | "\r" | "\r\n")?> : DEFAULT
}

   
<IN_MULTI_LINE_COMMENT> SPECIAL : {
<MULTI_LINE_COMMENT: "*/"> : DEFAULT
}

   
<IN_SINGLE_LINE_COMMENT,IN_MULTI_LINE_COMMENT,IN_PATTERN> MORE : {
<~[]>
}

   
/* Section 7.5.1: Reserved Words */
<DEFAULT,IN_REGEX> TOKEN : {
<INCLUDE: "include"> : DEFAULT
| <ASPECTDEF: "aspectdef"> : DEFAULT
| <CODEDEF: "codedef"> : DEFAULT
| <INPUT: "input"> : DEFAULT
| <OUTPUT: "output"> : DEFAULT
| <STATICDECL: "static"> : DEFAULT
| <SELECT: "select"> : DEFAULT
| <APPLY: "apply"> : DEFAULT
| <TO: "to"> : DEFAULT
| <CALL: "call"> : DEFAULT
| <RUN: "run"> : DEFAULT
| <CMD: "cmd"> : DEFAULT
| <CONDITION: "condition"> : DEFAULT
| <BEGIN: "begin"> : DEFAULT
| <INSERT: "insert"> : DEFAULT
| <EXEC: "exec"> : DEFAULT
| <OUTPUT_ACT: "out"> : DEFAULT
| <BEFORE: "before"> : DEFAULT
| <AFTER: "after"> : DEFAULT
| <AROUND: "around"> : DEFAULT
| <REPLACE: "replace"> : DEFAULT
| <DEFINE: "def"> : DEFAULT
| <CHECK: "check"> : DEFAULT
| <INITIALIZE: "initialize"> : DEFAULT
| <FINALIZE: "finalize"> : DEFAULT
| <END: "end"> : DEFAULT
| <DYNAMIC: "dynamic"> : DEFAULT
| <SEQUENCIAL: "seq"> : DEFAULT
| <PARALLEL: "par"> : DEFAULT
| <BREAK: "break"> : DEFAULT
| <CONTINUE: "continue"> : DEFAULT
| <DELETE: "delete"> : DEFAULT
| <ELSE: "else"> : DEFAULT
| <FOR: "for"> : DEFAULT
| <FUNCTION: "function"> : DEFAULT
| <IF: "if"> : DEFAULT
| <IN: "in"> : DEFAULT
| <OF: "of"> : DEFAULT
| <EACH: "each"> : DEFAULT
| <NEW: "new"> : DEFAULT
| <RETURN: "return"> : DEFAULT
| <THIS: "this"> : IN_REGEX
| <TYPEOF: "typeof"> : DEFAULT
| <VAR: "var"> : DEFAULT
| <VOID: "void"> : DEFAULT
| <WHILE: "while"> : DEFAULT
| <WITH: "with"> : DEFAULT
| <CASE: "case"> : DEFAULT
| <CATCH: "catch"> : DEFAULT
| <CLASS: "class"> : DEFAULT
| <CONST: "const"> : DEFAULT
| <DEBUGGER: "debugger"> : DEFAULT
| <_DEFAULT: "default"> : DEFAULT
| <DO: "do"> : DEFAULT
| <ENUM: "enum"> : DEFAULT
| <EXTENDS: "extends"> : DEFAULT
| <FINALLY: "finally"> : DEFAULT
| <IMPORT: "import"> : DEFAULT
| <SUPER: "super"> : DEFAULT
| <SWITCH: "switch"> : DEFAULT
| <THROW: "throw"> : DEFAULT
| <TRY: "try"> : DEFAULT
| <UTF8_BOM: "\u00ef\u00bb\u00bf"> : DEFAULT
}

   
/* JScript .NET Tokens

TOKEN :
{
	< BYTE: "byte" >
	| < SBYTE: "sbyte" >
	| < SHORT: "short" >
	| < USHORT: "ushort" >
	| < UINT: "uint" >
	| < LONG: "long" >
	| < ULONG: "ulong" >
	| < FLOAT: "float" >
	| < NUMBER: "Number" >
	| < DOUBLE: "double" >
	| < DECIMAL: "decimal" >
	| < BOOLEAN: "boolean" >
	| < STRING: "String" >
	| < CHAR: "char" >
}

*/


/* Section 7.7: Punctuators */
<DEFAULT,IN_REGEX> TOKEN : {
<LBRACE: "{"> : DEFAULT
| <RBRACE: "}"> : IN_REGEX
| <LPAREN: "("> : DEFAULT
| <RPAREN: ")"> : IN_REGEX
| <LBRACKET: "["> : DEFAULT
| <RBRACKET: "]"> : IN_REGEX
| <DOT: "."> : DEFAULT
| <SEMICOLON: ";"> : DEFAULT
| <COMMA: ","> : DEFAULT
| <LT: "<"> : DEFAULT
| <GT: ">"> : DEFAULT
| <LE: "<="> : DEFAULT
| <GE: ">="> : DEFAULT
| <EQ: "=="> : DEFAULT
| <NE: "!="> : DEFAULT
| <MATCH: "~="> : DEFAULT
| <SEQ: "==="> : DEFAULT
| <SNEQ: "!=="> : DEFAULT
| <PLUS: "+"> : DEFAULT
| <MINUS: "-"> : DEFAULT
| <STAR: "*"> : DEFAULT
| <REM: "%"> : DEFAULT
| <INCR: "++"> : IN_REGEX
| <DECR: "--"> : IN_REGEX
| <LSHIFT: "<<"> : DEFAULT
| <RSHIFT: ">>"> : DEFAULT
| <RUNSHIFT: ">>>"> : DEFAULT
| <BIT_AND: "&"> : DEFAULT
| <BIT_OR: "|"> : DEFAULT
| <XOR: "^"> : DEFAULT
| <BANG: "!"> : DEFAULT
| <TILDE: "~"> : IN_REGEX
| <SC_AND: "&&"> : DEFAULT
| <SC_OR: "||"> : DEFAULT
| <HOOK: "?"> : DEFAULT
| <NATURAL_JOIN: "::"> : DEFAULT
| <COLON: ":"> : DEFAULT
| <ASSIGN: "="> : DEFAULT
| <PLUSASSIGN: "+="> : DEFAULT
| <MINUSASSIGN: "-="> : DEFAULT
| <STARASSIGN: "*="> : DEFAULT
| <REMASSIGN: "%="> : DEFAULT
| <LSHIFTASSIGN: "<<="> : DEFAULT
| <RSIGNEDSHIFTASSIGN: ">>="> : DEFAULT
| <RUNSIGNEDSHIFTASSIGN: ">>>="> : DEFAULT
| <ANDASSIGN: "&="> : DEFAULT
| <ORASSIGN: "|="> : DEFAULT
| <XORASSIGN: "^="> : DEFAULT
| <INTANCE_OF: "instanceof"> : DEFAULT
}

   
/* Section 7.8.3: Numeric Literals */
<DEFAULT,IN_REGEX> TOKEN : {
<DECIMAL_LITERAL: <DECIMAL_INTEGER_LITERAL> "." (<DECIMAL_DIGITS>)? (<EXPONENT_PART>)? | "." <DECIMAL_DIGITS> (<EXPONENT_PART>)? | <DECIMAL_INTEGER_LITERAL> (<EXPONENT_PART>)?> : IN_REGEX
| <#NON_ZERO_DIGIT: ["1"-"9"]>
| <#EXPONENT_PART: ("e" | "E") (["+","-"])? <DECIMAL_DIGITS>>
}

   
<DEFAULT,IN_REGEX> TOKEN : {
<DECIMAL_INTEGER_LITERAL: "0" | <NON_ZERO_DIGIT> (<DECIMAL_DIGITS>)?> : IN_REGEX
}

   
<DEFAULT,IN_REGEX> TOKEN : {
<HEX_INTEGER_LITERAL: "0" ["x","X"] (<HEX_DIGIT>)+> : IN_REGEX
}

   
<DEFAULT,IN_REGEX> TOKEN : {
<DECIMAL_DIGITS: (<DECIMAL_DIGIT>)+> : IN_REGEX
}

   
<DEFAULT> TOKEN : {
<DECIMAL_DIGIT: ["0"-"9"]>
}

   
/* Section 7.8.1: NULL Literals */
<DEFAULT,IN_REGEX> TOKEN : {
<NULL_LITERAL: "null"> : IN_REGEX
}

   
/* Section 7.8.2: Boolean Literals */
<DEFAULT,IN_REGEX> TOKEN : {
<BOOLEAN_LITERAL: "true" | "false"> : IN_REGEX
}

   
/* Section 7.8.4: String Literals */
<DEFAULT,IN_REGEX> TOKEN : {
<STRING_LITERAL: "\"" (<DOUBLE_STRING_CHARACTERS>)? "\"" | "\'" (<SINGLE_STRING_CHARACTERS>)? "\'"> : IN_REGEX
| <#DOUBLE_STRING_CHARACTERS: (<DOUBLE_STRING_CHARACTER>)*>
| <#SINGLE_STRING_CHARACTERS: (<SINGLE_STRING_CHARACTER>)*>
| <#DOUBLE_STRING_CHARACTER: (~["\"","\\","\n","\r","\u2028","\u2029"])* | "\\" <ESCAPE_SEQUENCE>>
| <#SINGLE_STRING_CHARACTER: ~["\'","\\","\n","\r","\u2028","\u2029"] | "\\" <ESCAPE_SEQUENCE>>
| <#ESCAPE_SEQUENCE: <CHARACTER_ESCAPE_SEQUENCE> | "0" | <HEX_ESCAPE_SEQUENCE> | <UNICODE_ESCAPE_SEQUENCE>>
| <#CHARACTER_ESCAPE_SEQUENCE: <SINGLE_ESCAPE_CHARACTER> | <NON_ESCAPE_CHARACTER>>
| <#SINGLE_ESCAPE_CHARACTER: ["\'","\"","\\","b","f","n","r","t","v"]>
| <#NON_ESCAPE_CHARACTER: ~["\n","\r","\u2028","\u2029"] | ~["\'","\"","\\","b","f","n","r","t","v","x","u"] | ~["0"-"9"]>
}

   
<DEFAULT> TOKEN : {
<HEX_ESCAPE_SEQUENCE: "x" <HEX_DIGIT> <HEX_DIGIT>>
}

   
<DEFAULT,IN_REGEX> TOKEN : {
<CODE_LITERAL: "%{" (~["}"])* "}" ("}" | ~["}","%"] (~["}"])* "}")* "%"> : DEFAULT
}

   
/*
TOKEN:
{
  < ESCAPE_CHARACTER:
	  ["'" , "\"" , "\\" , "b" , "f" , "n" , "r" , "t" , "v"]
	| ["0"-"9"]
	| "x"
	| "u"
  >
}
*/

/* Section 7.6: Identifiers */
<DEFAULT,IN_REGEX> TOKEN : {
<LABEL_IDENTIFIER: "#" (<IDENTIFIER_PART>)*> : IN_REGEX
| <IDENTIFIER_NAME: <DOLLAR_SIGN> (<DOLLAR_SIGN> | "*" | "#" | "^") | (<DOLLAR_SIGN> | <AT_SIGN>)? <IDENTIFIER_START> (<IDENTIFIER_PART>)*> : IN_REGEX
| <#IDENTIFIER_START: <UNICODE_LETTER> | <UNDER_SCORE> | <UNICODE_ESCAPE_SEQUENCE>>
| <#IDENTIFIER_PART: <IDENTIFIER_START> | <UNICODE_COMBINING_MARK> | <UNICODE_DIGIT> | <UNICODE_CONNECTOR_PUNCTUATION> | <UNICODE_ESCAPE_SEQUENCE>>
| <#DOLLAR_SIGN: "$">
| <#AT_SIGN: "@">
| <#UNDER_SCORE: "_">
| <#UNICODE_LETTER: ["A"-"Z"] | ["a"-"z"] | ["A"-"Z"] | ["a"-"z"] | ["\u00aa"] | ["\u00b5"] | ["\u00ba"] | ["\u00c0"-"\u00d6"] | ["\u00d8"-"\u00f6"] | ["\u00f8"-"\u021f"] | ["\u0222"-"\u0233"] | ["\u0250"-"\u02ad"] | ["\u02b0"-"\u02b8"] | ["\u02bb"-"\u02c1"] | ["\u02d0"-"\u02d1"] | ["\u02e0"-"\u02e4"] | ["\u02ee"] | ["\u037a"] | ["\u0386"] | ["\u0388"-"\u038a"] | ["\u038c"] | ["\u038e"-"\u03a1"] | ["\u03a3"-"\u03ce"] | ["\u03d0"-"\u03d7"] | ["\u03da"-"\u03f3"] | ["\u0400"-"\u0481"] | ["\u048c"-"\u04c4"] | ["\u04c7"-"\u04c8"] | ["\u04cb"-"\u04cc"] | ["\u04d0"-"\u04f5"] | ["\u04f8"-"\u04f9"] | ["\u0531"-"\u0556"] | ["\u0559"] | ["\u0561"-"\u0587"] | ["\u05d0"-"\u05ea"] | ["\u05f0"-"\u05f2"] | ["\u0621"-"\u063a"] | ["\u0640"-"\u064a"] | ["\u0671"-"\u06d3"] | ["\u06d5"] | ["\u06e5"-"\u06e6"] | ["\u06fa"-"\u06fc"] | ["\u0710"] | ["\u0712"-"\u072c"] | ["\u0780"-"\u07a5"] | ["\u0905"-"\u0939"] | ["\u093d"] | ["\u0950"] | ["\u0958"-"\u0961"] | ["\u0985"-"\u098c"] | ["\u098f"-"\u0990"] | ["\u0993"-"\u09a8"] | ["\u09aa"-"\u09b0"] | ["\u09b2"] | ["\u09b6"-"\u09b9"] | ["\u09dc"-"\u09dd"] | ["\u09df"-"\u09e1"] | ["\u09f0"-"\u09f1"] | ["\u0a05"-"\u0a0a"] | ["\u0a0f"-"\u0a10"] | ["\u0a13"-"\u0a28"] | ["\u0a2a"-"\u0a30"] | ["\u0a32"-"\u0a33"] | ["\u0a35"-"\u0a36"] | ["\u0a38"-"\u0a39"] | ["\u0a59"-"\u0a5c"] | ["\u0a5e"] | ["\u0a72"-"\u0a74"] | ["\u0a85"-"\u0a8b"] | ["\u0a8d"] | ["\u0a8f"-"\u0a91"] | ["\u0a93"-"\u0aa8"] | ["\u0aaa"-"\u0ab0"] | ["\u0ab2"-"\u0ab3"] | ["\u0ab5"-"\u0ab9"] | ["\u0abd"] | ["\u0ad0"] | ["\u0ae0"] | ["\u0b05"-"\u0b0c"] | ["\u0b0f"-"\u0b10"] | ["\u0b13"-"\u0b28"] | ["\u0b2a"-"\u0b30"] | ["\u0b32"-"\u0b33"] | ["\u0b36"-"\u0b39"] | ["\u0b3d"] | ["\u0b5c"-"\u0b5d"] | ["\u0b5f"-"\u0b61"] | ["\u0b85"-"\u0b8a"] | ["\u0b8e"-"\u0b90"] | ["\u0b92"-"\u0b95"] | ["\u0b99"-"\u0b9a"] | ["\u0b9c"] | ["\u0b9e"-"\u0b9f"] | ["\u0ba3"-"\u0ba4"] | ["\u0ba8"-"\u0baa"] | ["\u0bae"-"\u0bb5"] | ["\u0bb7"-"\u0bb9"] | ["\u0c05"-"\u0c0c"] | ["\u0c0e"-"\u0c10"] | ["\u0c12"-"\u0c28"] | ["\u0c2a"-"\u0c33"] | ["\u0c35"-"\u0c39"] | ["\u0c60"-"\u0c61"] | ["\u0c85"-"\u0c8c"] | ["\u0c8e"-"\u0c90"] | ["\u0c92"-"\u0ca8"] | ["\u0caa"-"\u0cb3"] | ["\u0cb5"-"\u0cb9"] | ["\u0cde"] | ["\u0ce0"-"\u0ce1"] | ["\u0d05"-"\u0d0c"] | ["\u0d0e"-"\u0d10"] | ["\u0d12"-"\u0d28"] | ["\u0d2a"-"\u0d39"] | ["\u0d60"-"\u0d61"] | ["\u0d85"-"\u0d96"] | ["\u0d9a"-"\u0db1"] | ["\u0db3"-"\u0dbb"] | ["\u0dbd"] | ["\u0dc0"-"\u0dc6"] | ["\u0e01"-"\u0e30"] | ["\u0e32"-"\u0e33"] | ["\u0e40"-"\u0e46"] | ["\u0e81"-"\u0e82"] | ["\u0e84"] | ["\u0e87"-"\u0e88"] | ["\u0e8a"] | ["\u0e8d"] | ["\u0e94"-"\u0e97"] | ["\u0e99"-"\u0e9f"] | ["\u0ea1"-"\u0ea3"] | ["\u0ea5"] | ["\u0ea7"] | ["\u0eaa"-"\u0eab"] | ["\u0ead"-"\u0eb0"] | ["\u0eb2"-"\u0eb3"] | ["\u0ebd"-"\u0ec4"] | ["\u0ec6"] | ["\u0edc"-"\u0edd"] | ["\u0f00"] | ["\u0f40"-"\u0f6a"] | ["\u0f88"-"\u0f8b"] | ["\u1000"-"\u1021"] | ["\u1023"-"\u1027"] | ["\u1029"-"\u102a"] | ["\u1050"-"\u1055"] | ["\u10a0"-"\u10c5"] | ["\u10d0"-"\u10f6"] | ["\u1100"-"\u1159"] | ["\u115f"-"\u11a2"] | ["\u11a8"-"\u11f9"] | ["\u1200"-"\u1206"] | ["\u1208"-"\u1246"] | ["\u1248"] | ["\u124a"-"\u124d"] | ["\u1250"-"\u1256"] | ["\u1258"] | ["\u125a"-"\u125d"] | ["\u1260"-"\u1286"] | ["\u1288"] | ["\u128a"-"\u128d"] | ["\u1290"-"\u12ae"] | ["\u12b0"] | ["\u12b2"-"\u12b5"] | ["\u12b8"-"\u12be"] | ["\u12c0"] | ["\u12c2"-"\u12c5"] | ["\u12c8"-"\u12ce"] | ["\u12d0"-"\u12d6"] | ["\u12d8"-"\u12ee"] | ["\u12f0"-"\u130e"] | ["\u1310"] | ["\u1312"-"\u1315"] | ["\u1318"-"\u131e"] | ["\u1320"-"\u1346"] | ["\u1348"-"\u135a"] | ["\u13a0"-"\u13b0"] | ["\u13b1"-"\u13f4"] | ["\u1401"-"\u1676"] | ["\u1681"-"\u169a"] | ["\u16a0"-"\u16ea"] | ["\u1780"-"\u17b3"] | ["\u1820"-"\u1877"] | ["\u1880"-"\u18a8"] | ["\u1e00"-"\u1e9b"] | ["\u1ea0"-"\u1ee0"] | ["\u1ee1"-"\u1ef9"] | ["\u1f00"-"\u1f15"] | ["\u1f18"-"\u1f1d"] | ["\u1f20"-"\u1f39"] | ["\u1f3a"-"\u1f45"] | ["\u1f48"-"\u1f4d"] | ["\u1f50"-"\u1f57"] | ["\u1f59"] | ["\u1f5b"] | ["\u1f5d"] | ["\u1f5f"-"\u1f7d"] | ["\u1f80"-"\u1fb4"] | ["\u1fb6"-"\u1fbc"] | ["\u1fbe"] | ["\u1fc2"-"\u1fc4"] | ["\u1fc6"-"\u1fcc"] | ["\u1fd0"-"\u1fd3"] | ["\u1fd6"-"\u1fdb"] | ["\u1fe0"-"\u1fec"] | ["\u1ff2"-"\u1ff4"] | ["\u1ff6"-"\u1ffc"] | ["\u207f"] | ["\u2102"] | ["\u2107"] | ["\u210a"-"\u2113"] | ["\u2115"] | ["\u2119"-"\u211d"] | ["\u2124"] | ["\u2126"] | ["\u2128"] | ["\u212a"-"\u212d"] | ["\u212f"-"\u2131"] | ["\u2133"-"\u2139"] | ["\u2160"-"\u2183"] | ["\u3005"-"\u3007"] | ["\u3021"-"\u3029"] | ["\u3031"-"\u3035"] | ["\u3038"-"\u303a"] | ["\u3041"-"\u3094"] | ["\u309d"-"\u309e"] | ["\u30a1"-"\u30fa"] | ["\u30fc"-"\u30fe"] | ["\u3105"-"\u312c"] | ["\u3131"-"\u318e"] | ["\u31a0"-"\u31b7"] | ["\u3400"] | ["\u4db5"] | ["\u4e00"] | ["\u9fa5"] | ["\ua000"-"\ua48c"] | ["\uac00"] | ["\ud7a3"] | ["\uf900"-"\ufa2d"] | ["\ufb00"-"\ufb06"] | ["\ufb13"-"\ufb17"] | ["\ufb1d"] | ["\ufb1f"-"\ufb28"] | ["\ufb2a"-"\ufb36"] | ["\ufb38"-"\ufb3c"] | ["\ufb3e"] | ["\ufb40"-"\ufb41"] | ["\ufb43"-"\ufb44"] | ["\ufb46"-"\ufbb1"] | ["\ufbd3"-"\ufd3d"] | ["\ufd50"-"\ufd8f"] | ["\ufd92"-"\ufdc7"] | ["\ufdf0"-"\ufdfb"] | ["\ufe70"-"\ufe72"] | ["\ufe74"] | ["\ufe76"-"\ufefc"] | ["\uff21"-"\uff3a"] | ["\uff41"-"\uff5a"] | ["\uff66"-"\uffbe"] | ["\uffc2"-"\uffc7"] | ["\uffca"-"\uffcf"] | ["\uffd2"-"\uffd7"] | ["\uffda"-"\uffdc"]>
}

   
/*
 * Unicode categories Non-spacing mark (MN) OR Combining spacing mark (MC)
 */
<DEFAULT> MORE : {
<UNICODE_COMBINING_MARK: <MN> | <MC>>
}

   
<DEFAULT> TOKEN : {
<MC: ["\u0903"] | ["\u093e"] | ["\u093f"] | ["\u0940"] | ["\u0949"] | ["\u094a"] | ["\u094b"] | ["\u094c"] | ["\u0982"] | ["\u0983"] | ["\u09be"] | ["\u09bf"] | ["\u09c0"] | ["\u09c7"] | ["\u09c8"] | ["\u09cb"] | ["\u09cc"] | ["\u09d7"] | ["\u0a03"] | ["\u0a3e"] | ["\u0a3f"] | ["\u0a40"] | ["\u0a83"] | ["\u0abe"] | ["\u0abf"] | ["\u0ac0"] | ["\u0ac9"] | ["\u0acb"] | ["\u0acc"] | ["\u0b02"] | ["\u0b03"] | ["\u0b3e"] | ["\u0b40"] | ["\u0b47"] | ["\u0b48"] | ["\u0b4b"] | ["\u0b4c"] | ["\u0b57"] | ["\u0bbe"] | ["\u0bbf"] | ["\u0bc1"] | ["\u0bc2"] | ["\u0bc6"] | ["\u0bc7"] | ["\u0bc8"] | ["\u0bca"] | ["\u0bcb"] | ["\u0bcc"] | ["\u0bd7"] | ["\u0c01"] | ["\u0c02"] | ["\u0c03"] | ["\u0c41"] | ["\u0c42"] | ["\u0c43"] | ["\u0c44"] | ["\u0c82"] | ["\u0c83"] | ["\u0cbe"] | ["\u0cc0"] | ["\u0cc1"] | ["\u0cc2"] | ["\u0cc3"] | ["\u0cc4"] | ["\u0cc7"] | ["\u0cc8"] | ["\u0cca"] | ["\u0ccb"] | ["\u0cd5"] | ["\u0cd6"] | ["\u0d02"] | ["\u0d03"] | ["\u0d3e"] | ["\u0d3f"] | ["\u0d40"] | ["\u0d46"] | ["\u0d47"] | ["\u0d48"] | ["\u0d4a"] | ["\u0d4b"] | ["\u0d4c"] | ["\u0d57"] | ["\u0d82"] | ["\u0d83"] | ["\u0dcf"] | ["\u0dd0"] | ["\u0dd1"] | ["\u0dd8"] | ["\u0dd9"] | ["\u0dda"] | ["\u0ddb"] | ["\u0ddc"] | ["\u0ddd"] | ["\u0dde"] | ["\u0ddf"] | ["\u0df2"] | ["\u0df3"] | ["\u0f3e"] | ["\u0f3f"] | ["\u0f7f"] | ["\u102c"] | ["\u1031"] | ["\u1038"] | ["\u1056"] | ["\u1057"] | ["\u17b6"] | ["\u17be"] | ["\u17bf"] | ["\u17c0"] | ["\u17c1"] | ["\u17c2"] | ["\u17c3"] | ["\u17c4"] | ["\u17c5"] | ["\u17c7"] | ["\u17c8"] | ["\u1923"] | ["\u1924"] | ["\u1925"] | ["\u1926"] | ["\u1929"] | ["\u192a"] | ["\u192b"] | ["\u1930"] | ["\u1931"] | ["\u1933"] | ["\u1934"] | ["\u1935"] | ["\u1936"] | ["\u1937"] | ["\u1938"] | ["\u19b0"] | ["\u19b1"] | ["\u19b2"] | ["\u19b3"] | ["\u19b4"] | ["\u19b5"] | ["\u19b6"] | ["\u19b7"] | ["\u19b8"] | ["\u19b9"] | ["\u19ba"] | ["\u19bb"] | ["\u19bc"] | ["\u19bd"] | ["\u19be"] | ["\u19bf"] | ["\u19c0"] | ["\u19c8"] | ["\u19c9"] | ["\u1a19"] | ["\u1a1a"] | ["\u1a1b"] | ["\ua802"] | ["\ua823"] | ["\ua824"] | ["\ua827"] | ["\u1d16"] | ["\u1d16"] | ["\u1d16"] | ["\u1d16"] | ["\u1d16"] | ["\u1d17"] | ["\u1d17"] | ["\u1d17"]>
| <MN: ["\u0300"-"\u034e"] | ["\u0360"-"\u0362"] | ["\u0483"-"\u0486"] | ["\u0591"-"\u05a1"] | ["\u05a3"-"\u05b9"] | ["\u05bb"-"\u05bd"] | ["\u05bf"] | ["\u05c1"-"\u05c2"] | ["\u05c4"] | ["\u064b"-"\u0655"] | ["\u0670"] | ["\u06d6"-"\u06dc"] | ["\u06df"-"\u06e4"] | ["\u06e7"-"\u06e8"] | ["\u06ea"-"\u06ed"] | ["\u0711"] | ["\u0730"-"\u074a"] | ["\u07a6"-"\u07b0"] | ["\u0901"-"\u0903"] | ["\u093c"] | ["\u093e"-"\u094d"] | ["\u0951"-"\u0954"] | ["\u0962"-"\u0963"] | ["\u0981"-"\u0983"] | ["\u09bc"-"\u09c4"] | ["\u09c7"-"\u09c8"] | ["\u09cb"-"\u09cd"] | ["\u09d7"] | ["\u09e2"-"\u09e3"] | ["\u0a02"] | ["\u0a3c"] | ["\u0a3e"-"\u0a42"] | ["\u0a47"-"\u0a48"] | ["\u0a4b"-"\u0a4d"] | ["\u0a70"-"\u0a71"] | ["\u0a81"-"\u0a83"] | ["\u0abc"] | ["\u0abe"-"\u0ac5"] | ["\u0ac7"-"\u0ac9"] | ["\u0acb"-"\u0acd"] | ["\u0b01"-"\u0b03"] | ["\u0b3c"] | ["\u0b3e"-"\u0b43"] | ["\u0b47"-"\u0b48"] | ["\u0b4b"-"\u0b4d"] | ["\u0b56"-"\u0b57"] | ["\u0b82"-"\u0b83"] | ["\u0bbe"-"\u0bc2"] | ["\u0bc6"-"\u0bc8"] | ["\u0bca"-"\u0bcd"] | ["\u0bd7"] | ["\u0c01"-"\u0c03"] | ["\u0c3e"-"\u0c44"] | ["\u0c46"-"\u0c48"] | ["\u0c4a"-"\u0c4d"] | ["\u0c55"-"\u0c56"] | ["\u0c82"-"\u0c83"] | ["\u0cbe"-"\u0cc4"] | ["\u0cc6"-"\u0cc8"] | ["\u0cca"-"\u0ccd"] | ["\u0cd5"-"\u0cd6"] | ["\u0d02"-"\u0d03"] | ["\u0d3e"-"\u0d43"] | ["\u0d46"-"\u0d48"] | ["\u0d4a"-"\u0d4d"] | ["\u0d57"] | ["\u0d82"-"\u0d83"] | ["\u0dca"] | ["\u0dcf"-"\u0dd4"] | ["\u0dd6"] | ["\u0dd8"-"\u0ddf"] | ["\u0df2"-"\u0df3"] | ["\u0e31"] | ["\u0e34"-"\u0e3a"] | ["\u0e47"-"\u0e4e"] | ["\u0eb1"] | ["\u0eb4"-"\u0eb9"] | ["\u0ebb"-"\u0ebc"] | ["\u0ec8"-"\u0ecd"] | ["\u0f18"-"\u0f19"] | ["\u0f35"] | ["\u0f37"] | ["\u0f39"] | ["\u0f3e"-"\u0f3f"] | ["\u0f71"-"\u0f84"] | ["\u0f86"-"\u0f87"] | ["\u0f90"-"\u0f97"] | ["\u0f99"-"\u0fbc"] | ["\u0fc6"] | ["\u102c"-"\u1032"] | ["\u1036"-"\u1039"] | ["\u1056"-"\u1059"] | ["\u17b4"-"\u17d3"] | ["\u18a9"] | ["\u20d0"-"\u20dc"] | ["\u20e1"] | ["\u302a"-"\u302f"] | ["\u3099"-"\u309a"] | ["\ufb1e"] | ["\ufe20"-"\ufe23"]>
}

   
<DEFAULT> TOKEN : {
<UNICODE_DIGIT: ["0"-"9"] | ["\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"] | ["\u0f20"-"\u0f29"] | ["\u1040"-"\u1049"] | ["\u1369"-"\u1371"] | ["\u17e0"-"\u17e9"] | ["\u1810"-"\u1819"] | ["\uff10"-"\uff19"]>
}

   
<DEFAULT> TOKEN : {
<UNICODE_CONNECTOR_PUNCTUATION: ["_"] | ["\u203f"-"\u2040"] | ["\u30fb"] | ["\ufe33"-"\ufe34"] | ["\ufe4d"-"\ufe4f"] | ["\uff3f"] | ["\uff65"]>
}

   
<DEFAULT> TOKEN : {
<UNICODE_ESCAPE_SEQUENCE: "u" <HEX_DIGIT> <HEX_DIGIT> <HEX_DIGIT> <HEX_DIGIT>>
}

   
<DEFAULT> TOKEN : {
<HEX_DIGIT: ["0"-"9"] | ["a"-"f"] | ["A"-"F"]>
}

   
<IN_REGEX> TOKEN : {
<SLASHASSIGN: "/="> : DEFAULT
| <SLASH: "/"> : DEFAULT
}

   
/************************** LARA TOKENS *************************************

TOKEN : /* JP IDENTIFIERS *
{
  < JPVAR: "$" ( | )>  :DEFAULT |
  < #IN_JPVAR:  |  | < END > |  |  |  |  |  >
}
 /************************** LARA TOKENS *************************************/

/* Section 7.8.5: Regular Expression Literals */
<DEFAULT> TOKEN : {
<REGULAR_EXPRESSION_LITERAL: "/" (~["\n","\r","\\","/","*"] | <BACKSLASH_SEQUENCE>) (~["\n","\r","\\","/"] | <BACKSLASH_SEQUENCE>)* "/" (<IDENTIFIER_PART>)*> : IN_REGEX
| <#BACKSLASH_SEQUENCE: "\\" ~["\n","\r"]>
}

   

NON-TERMINALS

/** Get the join point Identifier
	 * Function that returns the join point identifier, which can any identifier or one of the following reserved words
	 **/
getNoReservedIdentifier ::= ( <IDENTIFIER_NAME> | <CALL> | <BEGIN> | <END> | <FUNCTION> | <VAR> | <RETURN> | <IF> | <ELSE> | <TO> | <IN> | <INPUT> | <OUTPUT> | <CONDITION> | <_DEFAULT> | <CLASS> )
noReservedIdentifier ::= ( <IDENTIFIER_NAME> | <CALL> | <BEGIN> | <END> | <FUNCTION> | <VAR> | <RETURN> | <IF> | <ELSE> | <TO> | <IN> | <INPUT> | <OUTPUT> | <CONDITION> | <_DEFAULT> | <CLASS> )
/*****************************************
 * ECMA SYNTACTIC GRAMMARS  STARTS HERE  *
 *****************************************/

/*******************************************************************************
 ************************    LARA SYNTACTIC GRAMMAR    ************************* 
 *******************************************************************************/

        /** LARA Start
	 * A LARA file can contain zero or more includes and imports, followed by definitions of aspectdefs, codedefs, functions and global variables
	 **/
Start ::= ( <UTF8_BOM> )? ( Import )* ( AspectDef | CodeDef )* <EOF>
/** Import
	 * Imports the path to a file that is not in the same path of the invoked LARA file.
	 * With one import it is possible to import one or every file within a package
	 **/
Import ::= <IMPORT> FilePath EndStatement
/** FilePath
	* gets the path to a file or all the files in the package 
	**/
FilePath ::= ( Identifier <DOT> )* ( <IDENTIFIER_NAME> | <STAR> )
/** FilePathNoSTar
	* gets the path to a file in a package
	**/
FilePathNoSTar ::= ( Identifier <DOT> )+
/** Code Definition
	 * A parcel of native code or LARA-Code to be used by the insert/output action. To define the target language, one has to define the type of the codedef, such as: codedef, this means that the code to be inserted is written in C language.
	 * A code definition needs an identifier and its body is code that can contain a tag such as "" to insert information on the code such as: join point property or a variable value. To use those tags, the codedef must have input arguments to refer those to specific values.
	 **/
CodeDef ::= <CODEDEF> ( <LT> <IDENTIFIER_NAME> <GT> )? <IDENTIFIER_NAME> ( ( <LPAREN> FormalParameterList <RPAREN> )? ) <CODE_LITERAL> <END>
/** Input arguments
	 * The arguments to be defined when a "aspect-call" action is stated.
	 * They can be normal variables or variables referent to a specific join point. The normal variables can have a default value
	 **/
Input ::= <INPUT> VariableDeclarationList ( <SEMICOLON> )? <END>
/** Output arguments
	 * List of normal variables or variables referent to a specific join point. The normal variables can have a default value
	 **/
Output ::= <OUTPUT> VariableDeclarationList ( <SEMICOLON> )? <END>
/** Static
	 * List of static variables and functions, which can be accessed statically in the aspect. The variables values are shared
	 * between all aspect instances
	 **/
Static ::= <STATICDECL> ( VariableStatement | FunctionDeclaration )* <END>
/** Initialize
	 * Similar to a constructor. A block of JavaScript code to initialize variables, inter alia
	 **/
Initialize ::= <INITIALIZE> JavaScript <END>
/** Finalize
	 * Similar to a destructor. A block of JavaScript code to finalize output variables, inter alia
	 **/
Finalize ::= <FINALIZE> JavaScript <END>
/** Check
	 * Set of conditions to verify input arguments and other important stats that specify if the aspect can be executed
	 **/
Check ::= <CHECK> ( LogicalORExpression EndStatement )* <END>
/** Aspect Definition
	 * The aspect definition can contain outputs and inputs variables, a check to verify those variables, an initializer and a finalizer to deal with information to be handler before and after the aspect, respectively.
	 * The body of the aspect consists of selects, applies and conditions to apply the aspect in the target program, and afters, befores, function and variable declaration to assist the apply and condition section.
	 */
AspectDef ::= <ASPECTDEF> <IDENTIFIER_NAME> ( Input | Output | Static )* ( Initialize )? ( Check )? ( ( Select | Apply | AroundApply | Condition | SourceElement ) )* ( Finalize )? <END>
/** Select
	 * Pointcut expression to specify which join points are intended to influence.
	 * It can contain an unique label, so it can be advised, and a pointcut expression
	 */
Select ::= ( <IDENTIFIER_NAME> <COLON> )? <SELECT> ( Pointcut | FourthSetOp ) <END>
FourthSetOp ::= ThirdSetOp ( <PLUS> FourthSetOp )?
ThirdSetOp ::= FirstSetOp ( ( <NATURAL_JOIN> | <BIT_AND> ) ThirdSetOp )?
FirstSetOp ::= Identifier
| ( <LPAREN> FourthSetOp <RPAREN> )
/** Pointcut
	 * It can contain an identifier for the join point, a join point identifier and a possible property expression. 
	 * Each join point can have a child, the join point down to its hierarchy
	 */
Pointcut ::= ( getNoReservedIdentifier | <LPAREN> <IDENTIFIER_NAME> <ASSIGN> getNoReservedIdentifier <RPAREN> ) ( PointcutFilters )? ( <DOT> Pointcut )?
/** Pointcut  properties
	 * The properties of a pointcut can be declared in three different ways:
		- it can be any property (*)
		- a set of properties that will be mapped to the default attribute
		- a property expression
	 */
PointcutFilters ::= <LBRACE> ( <STAR> | ( ( OrFiltersExpr ) | ( ( ConditionalExpression ( <COMMA> ConditionalExpression )* ) ) ) ) <RBRACE>
/** "OR" Property Expr
	 * In the pointcut properties declaration, the comma is used as an OR operator (similar to ||)
	 **/
OrFiltersExpr ::= ( ANDFiltersExpr ( <COMMA> ANDFiltersExpr )* )
/** "AND" Property Expression
	 * To combine properties such as an AND operation, the properties are declared inside brackets, converting the comma (which is the OR operator) into an AND.
	 */
ANDFiltersExpr ::= Filter
| <LPAREN> ( Filter ( <COMMA> Filter )* ) <RPAREN>
/** Property
	 * The property is defined by comparing a join point attribute to a value
	 **/
Filter ::= <IDENTIFIER_NAME> ( EqualityOperator | RelationalOperator ) ConditionalExpression
/** Around
	 * A Statement to occur around an apply
	 * It contains a list of applies that this statement refers to. The body of this statement is JavaScript, and can be used to prepare information for the applies.
	 **/
AroundApply ::= ( <IDENTIFIER_NAME> <COLON> )? ( <BEFORE> | <AFTER> ) ( ( Identifier ( ( <COMMA> Identifier )* ) ) )? <DO> JavaScript <END>
/** Apply
	 * Old Version of apply, only static weaving
	 * Advice each join point of the related select(s).
	 * It can contain an unique label and a list of selects to be advised by the apply. If no select is inserted, the last select with no label will be used.
	 * The body contains JavaScript, in which the actions can be declared
	 **
	void Apply() #Apply:
	{Token name, apply, end;}
	{
	  [name={jjtThis.setName(name.image);} ] apply= [To()]
	  		JavaScript()
	  end=
	  { jjtThis.setCoord(apply,end);}
	}
	/**/

        /** Apply (Static/Dynamic)
	 * The new version of the Apply statement: static or dynamic weaving
	 * Advice each join point of the related select(s).
	 * It can contain an unique label and a list of selects to be advised by the apply. If no select is inserted, the last select with no label will be used.
	 * The body contains JavaScript, in which the actions can be declared
	 **/
Apply ::= ( <IDENTIFIER_NAME> <COLON> )? <APPLY> ( <DYNAMIC> ( <PARALLEL> | <SEQUENCIAL> )? ( <BEFORE> | <AFTER> | <REPLACE> )? )? ( To )? JavaScript <END>
/** To
	 * list of selects that will be influenced by the apply
	 **/
To ::= <TO> FourthSetOp ( <COMMA> FourthSetOp )*
SimpleAction ::= ( Insert | Define | Perform | OutputAct ) EndStatement
/** Action
	 * Actions that can be used to influence the join points.
	 * A join point variable can be used to specify the targeted join point where the action takes place 
	 **/
Action ::= ( ( ( <IDENTIFIER_NAME> ) ) ( MemberExpressionPart )* <DOT> ) ( Insert | Define | Perform | OutputAct ) EndStatement
/** Call
	 * Action to invoke an aspect.
	 * The aspect is called with the input arguments that requires and the call instance can have a reference variable to be used to recover information from the invoked aspect.
	 **/
Call ::= <CALL> ( LeftHandSideExpression <COLON> )? ( FilePathNoSTar )? <IDENTIFIER_NAME> ( Arguments )? EndStatement
/** Run
	 * Execution of an external tool.
	 **/
Run ::= <RUN> ( LeftHandSideExpression <COLON> )? ( getNoReservedIdentifier )? Arguments ( <GT> AssignmentExpression )? EndStatement
/** Command
	 * Execution of a command.
	 **/
Cmd ::= ( <CMD> | <RUN> <CMD> ) ( LeftHandSideExpression <COLON> )? Arguments ( <GT> AssignmentExpression )? EndStatement
/** OLD CALL **
	void Call() #Call:
	{Token aspVarName,aspName,ref, end;}
	{
	    [LOOKAHEAD( )
	   					aspVarName=
	   							{jjtThis.setAspVarName(aspVarName.image);}]
   			  [LOOKAHEAD(2)FilePathNoSTar()]aspName=
		{jjtThis.setAspName(aspName.image);}
	    	[LOOKAHEAD(Arguments())Arguments()] end=
	   { jjtThis.setCoord(aspName,end);}
	}
	/***/

        /** Insert
	 * The insertion of code is made by indicating a codedefinition's identifier with the required arguments or writing the desired code, with the possibility of using LARA-code to be defined into the target language, such as insert before %{�}%.
	 * It is also needed to say if the code is inserted before, after or around the pointcut.
	 **/
Insert ::= <INSERT> ( ( ( <LT> <IDENTIFIER_NAME> <GT> )? ( <BEFORE> | <AFTER> | <AROUND> | <REPLACE> ) ( TemplateLiteral | ( ( Identifier ( Arguments )? ) ) ) ) | ( Arguments ) )
/** Perform
	 * Perform an action over the join point
	 **/
Perform ::= <EXEC> getNoReservedIdentifier ( Arguments )?
/** Output
	 * Similar to Insert, however it is used to output in runtime
	 **/
OutputAct ::= <OUTPUT_ACT> ( ( TemplateLiteral | ( ( Identifier ( Arguments )? ) ) ) | Arguments )
/** Define
	 *  Assign a value to a join point attribute
	 **/
Define ::= <DEFINE> ( noReservedIdentifier <ASSIGN> AssignmentExpression | Arguments )
/** Condition
	 *  Boolean expression that verifies if the apply can take place in a join point
	 **/
Condition ::= ( <IDENTIFIER_NAME> <COLON> )? <CONDITION> ( <FOR> ( Identifier ( <COMMA> Identifier )* ) )? LogicalORExpression <END>
/*******************************************************************************
 **********************   END OF LARA SYNTACTIC GRAMMAR    ********************* 
 *******************************************************************************/

        /* The following part of the grammar is the EcmaScript grammar created by The Dojo Foundation (2004-2005), and it was partially updated to conform to the requirements of LARA grammar, such as the use of actions and join point variables.
	**/

        /* Section 11.1: Primary Expressions */
PrimaryExpression ::= "this"
| ObjectLiteral
| ArrayLiteral
| ( "(" Expression ")" )
| Identifier
| Literal
/* Section 7.8: Literals */
Literal ::= ( <DECIMAL_LITERAL> | <HEX_INTEGER_LITERAL> | <STRING_LITERAL> | <BOOLEAN_LITERAL> | <NULL_LITERAL> | <REGULAR_EXPRESSION_LITERAL> | <CODE_LITERAL> )
TemplateLiteral ::= ( <STRING_LITERAL> | <CODE_LITERAL> )
Identifier ::= <IDENTIFIER_NAME>
LabelIdentifier ::= ( <LABEL_IDENTIFIER> | <IDENTIFIER_NAME> )
/* Section 11.1.4: Array Initialiser */
ArrayLiteral ::= "[" ( ( ElisionFirst )? ( ElementList Elision "]" | ( ElementList )? "]" ) )
ElementList ::= AssignmentExpression ( Elision AssignmentExpression )*
Elision ::= ( "," ) ( ( "," )+ )?
ElisionFirst ::= ( "," ) ( ( "," )+ )?
/* Section 11.1.5: Object Initialiser */
ObjectLiteral ::= <LBRACE> ( PropertyNameAndValueList )? <RBRACE>
PropertyNameAndValueList ::= PropertyNameAndValue ( "," PropertyNameAndValue | "," )*
PropertyNameAndValue ::= PropertyName ":" AssignmentExpression
PropertyName ::= noReservedIdentifier
| Literal
/* Section 11.2: Left-Hand-Side Expressions */
MemberExpression ::= ( ( FunctionExpression | PrimaryExpression ) ( MemberExpressionPart )* )
| AllocationExpression
MemberExpressionForIn ::= ( ( FunctionExpression | PrimaryExpression ) ( MemberExpressionPart )* )
AllocationExpression ::= ( "new" MemberExpression ( ( Arguments ( MemberExpressionPart )* )* ) )
MemberExpressionPart ::= ( ( "[" Expression "]" ) | ( <LBRACE> Expression <RBRACE> ) )
| ( "." ( noReservedIdentifier ) )
CallExpression ::= MemberExpression Arguments ( CallExpressionPart )*
CallExpressionForIn ::= MemberExpressionForIn Arguments ( CallExpressionPart )*
CallExpressionPart ::= Arguments
| ( "[" Expression "]" )
| ( "." noReservedIdentifier )
Arguments ::= "(" ( ( NamedArgumentList ) | ArgumentList )? ")"
NamedArgumentList ::= NamedArgument ( <COMMA> NamedArgument )*
NamedArgument ::= getNoReservedIdentifier <COLON> AssignmentExpression
ArgumentList ::= AssignmentExpression ( "," AssignmentExpression )*
LeftHandSideExpression ::= CallExpression
| MemberExpression
LeftHandSideExpressionForIn ::= CallExpressionForIn
| MemberExpressionForIn
/* Section 11.3 Postfix Expressions */
PostfixExpression ::= LeftHandSideExpression ( PostfixOperator )?
PostfixOperator ::= ( "++" | "--" )
/* Section 11.4 Unary Operators */
UnaryExpression ::= ( PostfixExpression | ( UnaryOperator UnaryExpression )+ )
UnaryOperator ::= ( "delete" | "void" | "typeof" | "++" | "--" | "+" | "-" | "~" | "!" )
/* Section 11.5: Multiplicative Operators */
MultiplicativeExpression ::= UnaryExpression ( MultiplicativeOperator UnaryExpression )*
MultiplicativeOperator ::= ( "*" | <SLASH> | "%" )
/* Section 11.6: Additive Operators */
AdditiveExpression ::= MultiplicativeExpression ( AdditiveOperator MultiplicativeExpression )*
AdditiveOperator ::= ( "+" | "-" )
/* Section 11.7: Bitwise Shift Operators */
ShiftExpression ::= AdditiveExpression ( ShiftOperator AdditiveExpression )*
ShiftOperator ::= ( "<<" | ">>" | ">>>" )
/* Section 11.4: Relational Operators */
RelationalExpression ::= ShiftExpression ( RelationalOperator ShiftExpression )*
RelationalOperator ::= ( "<" | ">" | "<=" | ">=" | "instanceof" | "in" )
RelationalExpressionNoIn ::= ShiftExpression ( RelationalNoInOperator ShiftExpression )*
RelationalNoInOperator ::= ( "<" | ">" | "<=" | ">=" | "instanceof" )
/* Section 11.9: Equality Operators */
EqualityExpression ::= RelationalExpression ( EqualityOperator RelationalExpression )*
EqualityExpressionNoIn ::= RelationalExpressionNoIn ( EqualityOperator RelationalExpressionNoIn )*
EqualityOperator ::= ( "==" | "!=" | "===" | "!==" | <MATCH> )
/* Section 11.10: Binary Bitwise Operators */
BitwiseANDExpression ::= EqualityExpression ( BitwiseANDOperator EqualityExpression )*
BitwiseANDExpressionNoIn ::= EqualityExpressionNoIn ( BitwiseANDOperator EqualityExpressionNoIn )*
BitwiseANDOperator ::= "&"
BitwiseXORExpression ::= BitwiseANDExpression ( BitwiseXOROperator BitwiseANDExpression )*
BitwiseXORExpressionNoIn ::= BitwiseANDExpressionNoIn ( BitwiseXOROperator BitwiseANDExpressionNoIn )*
BitwiseXOROperator ::= "^"
BitwiseORExpression ::= BitwiseXORExpression ( BitwiseOROperator BitwiseXORExpression )*
BitwiseORExpressionNoIn ::= BitwiseXORExpressionNoIn ( BitwiseOROperator BitwiseXORExpressionNoIn )*
BitwiseOROperator ::= "|"
/* Section 11.11: Binary Logical Operators */
LogicalANDExpression ::= BitwiseORExpression ( LogicalANDOperator BitwiseORExpression )*
LogicalANDExpressionNoIn ::= BitwiseORExpressionNoIn ( LogicalANDOperator BitwiseORExpressionNoIn )*
LogicalANDOperator ::= "&&"
LogicalORExpression ::= LogicalANDExpression ( LogicalOROperator LogicalANDExpression )*
LogicalORExpressionNoIn ::= LogicalANDExpressionNoIn ( LogicalOROperator LogicalANDExpressionNoIn )*
LogicalOROperator ::= "||"
/* Section 11.12: Conditional Operator */
ConditionalExpression ::= LogicalORExpression ( "?" AssignmentExpression ":" AssignmentExpression )?
ConditionalExpressionNoIn ::= LogicalORExpressionNoIn ( "?" AssignmentExpression ":" AssignmentExpressionNoIn )?
/* Section 11.13: Assignment Operators */
AssignmentExpression ::= ( LeftHandSideExpression AssignmentOperator AssignmentExpression | ConditionalExpression )
AssignmentExpressionNoIn ::= ( LeftHandSideExpression AssignmentOperator AssignmentExpressionNoIn | ConditionalExpressionNoIn )
AssignmentOperator ::= ( "=" | "*=" | <SLASHASSIGN> | "%=" | "+=" | "-=" | "<<=" | ">>=" | ">>>=" | "&=" | "^=" | "|=" )
/* Section 11.14: Comma Operator */
Expression ::= AssignmentExpression ( "," AssignmentExpression )*
ExpressionNoIn ::= AssignmentExpressionNoIn ( "," AssignmentExpressionNoIn )*
/* Section 12: STATEMENTS */
Statement ::= BodiedStatement
| SingleStatement
SingleStatement ::= ( SimpleAction | Action | Call | Cmd | Run | VariableStatement | EmptyStatement | ExpressionStatement | LabelledStatement | ContinueStatement | BreakStatement | ImportStatement | ReturnStatement )
BodiedStatement ::= ( Block | IfStatement | IterationStatement | SwitchStatement | WithStatement | ThrowStatement | TryStatement )
/* 12.1 Block Statement */
Block ::= <LBRACE> ( StatementList )? <RBRACE>
StatementList ::= ( Statement )+
/* Section 12.2: Variable statement */
VariableStatement ::= <VAR> VariableDeclarationList EndStatement
VariableDeclarationList ::= VariableDeclaration ( "," VariableDeclaration )*
VariableDeclarationListNoIn ::= VariableDeclarationNoIn ( "," VariableDeclarationNoIn )*
VariableDeclaration ::= Identifier ( Initialiser )?
VariableDeclarationNoIn ::= Identifier ( InitialiserNoIn )?
Initialiser ::= "=" AssignmentExpression
InitialiserNoIn ::= "=" AssignmentExpressionNoIn
/* Section 12.3: Empty Statement */
EmptyStatement ::= ";"
/* Section 12.4: Expression Statement */
ExpressionStatement ::= Expression EndStatement
/* Section 12.5: The if Statement */
IfStatement ::= "if" "(" Expression ")" Statement ( "else" Statement )?
/* Section 12.6: Iteration Statements */
IterationStatement ::= DoStatement
| WhileStatement
| ForStatement
DoStatement ::= <DO> Statement <WHILE> <LPAREN> Expression <RPAREN> EndStatement
WhileStatement ::= <WHILE> <LPAREN> Expression <RPAREN> Statement
ForStatement ::= <FOR> ( <EACH> <LPAREN> ( ( "var" VariableDeclarationNoIn <IN> Expression <RPAREN> Statement ) | ( LeftHandSideExpressionForIn <IN> Expression <RPAREN> Statement ) ) | <LPAREN> ( ( ( ExpressionNoIn )? ";" ( Expression )? ";" ( Expression )? ")" Statement ) | ( "var" VariableDeclarationList ";" ( Expression )? ";" ( Expression )? <RPAREN> Statement ) | ( "var" VariableDeclarationNoIn ( <IN> | ( <OF> ) ) Expression <RPAREN> Statement ) | ( LeftHandSideExpressionForIn ( <IN> | ( <OF> ) ) Expression <RPAREN> Statement ) ) )
/* Section 12.7: The continue Statement */
ContinueStatement ::= "continue" ( LabelIdentifier )? EndStatement
/* Section 12.8: The break Statement */
BreakStatement ::= "break" ( LabelIdentifier )? EndStatement
/* Section 12.9 The return Statement */
ReturnStatement ::= "return" ( Expression )? EndStatement
/* Section 12.10: The with Statement */
WithStatement ::= "with" "(" Expression ")" Statement
/* 12.11 The switch Statement */
SwitchStatement ::= "switch" "(" Expression ")" CaseBlock
CaseBlock ::= <LBRACE> ( CaseClauses )? ( <RBRACE> | DefaultClause ( CaseClauses )? <RBRACE> )
CaseClauses ::= ( CaseClause )+
CaseClause ::= ( ( "case" Expression ":" ) ) ( StatementList )?
DefaultClause ::= ( ( "default" ":" ) ) ( StatementList )?
/* Section 12.12: Labelled Statements */
LabelledStatement ::= Identifier ":" Statement
ThrowStatement ::= "throw" Expression EndStatement
TryStatement ::= "try" Block ( ( Finally | Catch ( Finally )? ) )
Catch ::= "catch" "(" Identifier ")" Block
Finally ::= "finally" Block
/* Section 13: Function Definition */
FunctionDeclaration ::= "function" Identifier ( "(" ( FormalParameterList )? ")" ) FunctionBody
FunctionExpression ::= "function" ( Identifier )? ( "(" ( FormalParameterList )? ")" ) FunctionBody
FormalParameterList ::= ( Identifier ) ( "," ( Identifier ) )*
FunctionBody ::= <LBRACE> ( SourceElements )? <RBRACE>
/* Section 14: Program *

	ASTProgram Program() #Program :
	{}
	{  
		JavaScript()
				
		{ return jjtThis; }
	}
	/**/
JavaScript ::= ( SourceElements )?
SourceElements ::= ( SourceElement )+
SourceElement ::= FunctionDeclaration
| Statement
/*
	 * Grammar for parsing JScript .NET contructs: ( import System; var contents :
	 * String = reader.ReadToEnd(); ) Refer: src/hostenv_jsc.js
	 */
ImportStatement ::= "import" Name ( "." "*" )? EndStatement
Name ::= <IDENTIFIER_NAME> ( <DOT> <IDENTIFIER_NAME> )*
JScriptVarStatement ::= <VAR> JScriptVarDeclarationList EndStatement
JScriptVarDeclarationList ::= JScriptVarDeclaration ( <COMMA> JScriptVarDeclaration )*
JScriptVarDeclaration ::= Identifier ":" <IDENTIFIER_NAME> ( Initialiser )?
EndStatement ::= <SEMICOLON>
error_skipto ::= java code
error_noSkip ::= java code