/* Copyright (c) 2004-2005, The Dojo Foundation All Rights Reserved. Licensed under the Academic Free License version 2.1 or above OR the modified BSD license. For more information on Dojo licensing, see: http://dojotoolkit.org/community/licensing.shtml Code donated to the Dojo Foundation by AOL LLC under the terms of the Dojo CCLA (http://dojotoolkit.org/ccla.txt). */ options { /* * Default value is true. If true, all methods and class variables * are specified as static in the generated parser and token manager. This allows only * one parser object to be present, but it improves the performance of the parser. */ STATIC = false; /* * Options for obtaining debugging information */ DEBUG_PARSER = false; DEBUG_TOKEN_MANAGER = false; /* * Default value is false. When set to true, the generated parser * uses an input stream object that processes Java Unicode escapes before * sending characters to the token manager. */ JAVA_UNICODE_ESCAPE = true; /* * Default value is false. When set to true, the generated parser * uses uses an input stream object that reads Unicode files. By default, ASCII files * are assumed. */ UNICODE_INPUT = true; /* * Default value is false. Generate a multi mode parse tree. * The default for this is false, generating a simple mode parse tree. */ MULTI=true; /* * Default value is false. Instead of making each non-decorated * production an indefinite node, make it void instead. */ NODE_DEFAULT_VOID=true; /* * The package to generate the node classes into. */ NODE_PACKAGE = "org.dojo.jsl.parser"; /* * Default value is false. Insert a jjtAccept() method in the * node classes, and generate a visitor implementation with an entry for every * node type used in the grammar. */ VISITOR=true; /* * Default value is false. Insert calls to user-defined parser * methods on entry and exit of every node scope. See Node Scope Hooks above. */ NODE_SCOPE_HOOK=true; /* * JDK Version */ JDK_VERSION = "1.5"; } PARSER_BEGIN(EcmaScript) package org.dojo.jsl.parser; import java.io.*; import java.util.*; public class EcmaScript { public static void main(String args[]){ EcmaScript parser; if(args.length == 0){ System.out.println("EcmaScript Parser: Reading from standard input . . ."); parser = new EcmaScript(System.in); } else if(args.length == 1){ System.out.println("EcmaScript Parser: Reading from file " + args[0] + " . . ."); try { parser = new EcmaScript(new FileInputStream(args[0]), "UTF-8"); } catch(java.io.FileNotFoundException e){ System.out.println("EcmaScript Parser: File " + args[0] + " not found."); return; } } else { System.out.println("EcmaScript Parser: Usage is one of:"); System.out.println(" EcmaScript < inputfile"); System.out.println("OR"); System.out.println(" EcmaScript inputfile"); return; } try { SimpleNode n = parser.Program(); System.out.println("EcmaScript parser: EcmaScript program parsed successfully."); } catch (ParseException e) { System.out.println(e.getMessage()); System.out.println("EcmaScript parser: Encountered errors during parse."); } } void jjtreeOpenNodeScope(Node n){ Token t = getToken(1); if(t != null){ ((SimpleNode) n).setBeginToken(t); } } void jjtreeCloseNodeScope(Node n){ Token t = getToken(0); if(t != null){ ((SimpleNode) n).setEndToken(t); } } } PARSER_END(EcmaScript) TOKEN_MGR_DECLS : { public int htmlTokenNestingLevel = 0; public boolean expectActionScript = false; } /***************************************** * LEXICAL & REGEXP GRAMMARS STARTS HERE * *****************************************/ /* /* Section 7 : Lexical Conventions */ /* TOKEN: { < SOURCE_CHAR: ["\u0000"-"\uFFFE"] > } MORE : { < INPUT_ELEMENT_DIV: | | | <_TOKEN> | > } MORE: { < INPUTELEMENTREGEXP: | | | <_TOKEN> | > } */ /* Section 7.2 : White Space */ SPECIAL_TOKEN : { | | | | > | < #TAB: "\u0009" | "\t" > /* TAB */ | < #VT: "\u000B" > /* Vertical Tab */ | < #FF: "\u000C" | "\f"> /* Form Feed */ | < #SP: "\u0020" | " " > /* Space */ | < #NBSP: "\u00A0" > /* No-break space */ | < #USP: /* Other Unicode space seperator */ ["\u2000"] | ["\u2001"] | ["\u2002"] | ["\u2003"] | ["\u2004"] | ["\u2005"] | ["\u2006"] | ["\u2007"] | ["\u2008"] | ["\u2009"] | ["\u200A"] | ["\u200B"] | ["\u3000"] > } /* Section 7.3 : Line Terminators */ SPECIAL_TOKEN : { | | | > | < #LF: "\n" > /* Line Feed */ | < #CR: "\r" > /* Carriage Return */ | < #LS: "\u2028" > /* Line separator */ | < #PS: "\u2029" > /* Paragraph separator */ } /* Comments */ MORE : { "//" : IN_SINGLE_LINE_COMMENT | "/*" : IN_MULTI_LINE_COMMENT } SPECIAL_TOKEN : { : DEFAULT } SPECIAL_TOKEN : { : DEFAULT } MORE : { < ~[] > } /* Section 7.5.1: Reserved Words */ TOKEN : { < BREAK: "break" > : DEFAULT | < CONTINUE: "continue" > : DEFAULT | < DELETE: "delete" > : DEFAULT | < ELSE: "else" > : DEFAULT | < FOR: "for" > : DEFAULT | < FUNCTION: "function" > : DEFAULT | < IF: "if" > : DEFAULT | < IN: "in" > : 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 | < EXPORT: "export" > : DEFAULT | < EXTENDS: "extends" > : DEFAULT | < FINALLY: "finally" > : DEFAULT | < IMPORT: "import" > : DEFAULT | < SUPER: "super" > : DEFAULT | < SWITCH: "switch" > : DEFAULT | < THROW: "throw" > : DEFAULT | < TRY: "try" > : 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 */ 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 | < SEQ: "===" > : DEFAULT /* Strict Equals Operator */ | < SNEQ: "!==" > : DEFAULT /* Strict Does-not-equal Operator */ | < PLUS: "+" > : DEFAULT | < MINUS: "-" > : DEFAULT | < STAR: "*" > : DEFAULT | < REM: "%" > : DEFAULT | < INCR: "++" > : IN_REGEX | < DECR: "--" > : IN_REGEX | < LSHIFT: "<<" > : DEFAULT | < RSHIFT: ">>" > : DEFAULT | < RUNSHIFT: ">>>" > : DEFAULT /* Unsigned Right Shift Operator */ | < BIT_AND: "&" > : DEFAULT | < BIT_OR: "|" > : DEFAULT | < XOR: "^" > : DEFAULT | < BANG: "!" > : DEFAULT | < TILDE: "~" > : IN_REGEX | < SC_AND: "&&" > : DEFAULT | < SC_OR: "||" > : DEFAULT | < HOOK: "?" > : 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 */ TOKEN: { < DECIMAL_LITERAL : "." ()? ()? | "." ()? | ()? > : IN_REGEX | < #NON_ZERO_DIGIT: ["1"-"9"] > | < #EXPONENT_PART: ("e" | "E") (["+","-"])? > } TOKEN: { < DECIMAL_INTEGER_LITERAL: "0" | ()? > : IN_REGEX } TOKEN: { < HEX_INTEGER_LITERAL: "0" ["x","X"] ()+ > : IN_REGEX } TOKEN: { < DECIMAL_DIGITS: ()+ > : IN_REGEX } TOKEN: { < DECIMAL_DIGIT: ["0"-"9"] > } /* Section 7.8: Literals */ /* MORE: { < LITERAL: | | | > } */ /* Section 7.8.1: NULL Literals */ TOKEN: { < NULL_LITERAL: "null" > : IN_REGEX } /* Section 7.8.2: Boolean Literals */ TOKEN: { < BOOLEAN_LITERAL: "true" | "false" > : IN_REGEX } /* Section 7.8.4: String Literals */ TOKEN: { < STRING_LITERAL: "\"" ()? "\"" | "'" ()? "'" > : IN_REGEX | < #DOUBLE_STRING_CHARACTERS: ()* > | < #SINGLE_STRING_CHARACTERS: ()* > | < #DOUBLE_STRING_CHARACTER: (~["\"","\\","\n","\r","\u2028","\u2029"])* | "\\" > | < #SINGLE_STRING_CHARACTER: (~["'","\\","\n","\r","\u2028","\u2029"]) | "\\" > | < #ESCAPE_SEQUENCE: | "0" | | > | < #CHARACTER_ESCAPE_SEQUENCE: | > | < #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"] > } TOKEN: { < HEX_ESCAPE_SEQUENCE: "x" > } /* TOKEN: { < ESCAPE_CHARACTER: ["'" , "\"" , "\\" , "b" , "f" , "n" , "r" , "t" , "v"] | ["0"-"9"] | "x" | "u" > } */ /* Section 7.6: Identifiers */ TOKEN: { < IDENTIFIER_NAME: ()* > : IN_REGEX | < #IDENTIFIER_START: | | | > | < #IDENTIFIER_PART: | | | | > | < #DOLLAR_SIGN: "$" > | < #UNDER_SCORE: "_" > | < #UNICODE_LETTER: ["A"-"Z"] | ["a"-"z"] | ["\u0041"-"\u005A"] | ["\u0061"-"\u007A"] | ["\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) */ MORE: { < UNICODE_COMBINING_MARK: | > } 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"] > } TOKEN: { < UNICODE_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"] | ["\u0F20"-"\u0F29"] | ["\u1040"-"\u1049"] | ["\u1369"-"\u1371"] | ["\u17E0"-"\u17E9"] | ["\u1810"-"\u1819"] | ["\uFF10"-"\uFF19"] > } TOKEN: { < UNICODE_CONNECTOR_PUNCTUATION: ["\u005F"] | ["\u203F"-"\u2040"] | ["\u30FB"] | ["\uFE33"-"\uFE34"] | ["\uFE4D"-"\uFE4F"] | ["\uFF3F"] | ["\uFF65"] > } TOKEN: { < UNICODE_ESCAPE_SEQUENCE: "u" > } TOKEN: { < HEX_DIGIT: ["0"-"9"] | ["a"-"f"] | ["A"-"F"] > } TOKEN : { < SLASHASSIGN: "/=" > : DEFAULT | < SLASH: "/" > : DEFAULT } /* Section 7.8.5: Regular Expression Literals */ TOKEN : { < REGULAR_EXPRESSION_LITERAL: "/" ( (~["\n","\r","\\","/","*"]) | ) ( (~["\n","\r","\\","/"]) | )* "/" ()* > : IN_REGEX | < #BACKSLASH_SEQUENCE: "\\" (~["\n","\r"]) > } /* TOKEN: { < REGULAR_EXPRESSION_LITERAL: "/" "/" > : IN_REGEX | < #REGULAR_EXPRESSION_BODY: > | < #REGULAR_EXPRESSION_CHARS: ()* > | < #REGULAR_EXPRESSION_FIRSTCHAR: // ~["*","\\","/"] | > | < #REGULAR_EXPRESSION_CHAR: //~["\\","/"] | > | < #BACKSLASH_SEQUENCE: "\\" > | < #NON_TERMINATOR_FIRSTCHAR: ~["\n","\r","\u2028","\u2029","*","\\","/"] > | < #NON_TERMINATOR_CHAR: ~["\n","\r","\u2028","\u2029","\\","/"] > | < #NON_TERMINATOR: ~["\n","\r","\u2028","\u2029"] > | < #REGULAR_EXPRESSION_FLAGS: ()* > } */ /***************************************** * NUMERIC STRING GRAMMAR STARTS HERE * *****************************************/ /* Section 9.3: String-to-Number Conversion */ /* MORE: { )? ( ()?)? > } MORE: { < STR_WHITESPACE: ()+ > } MORE: { < STR_WHITESPACE_CHAR: | | | | | | | | | > } MORE: { < STR_NUMERIC_LITERAL: | > } MORE: { ("+" | "-") > } MORE: { < STR_UNSIGNED_DECIMAL_LITERAL: "Infinity" | "." ()* ()* > } */ /* A.6 Universal Resource Identifier Character Classes */ /* TOKEN: { < URIRESERVED : [";" , "/" , "?" , ":" , "@" , "&" , "=" , "+" , "$" , ","] > } TOKEN: { < URI_ALPHA : ["a"-"z","A"-"Z"] > } TOKEN: { < URI_MARK : ["-" , "_" , "." , "!" , "~" , "*" , "'" , "(" , ")"] > } void uri() : {} { (uriCharacters())? } void uriCharacters() : {} { (uriCharacter())+ } void uriCharacter() : {} { | uriUnescaped() | uriEscaped() } void uriUnescaped() : {} { | | } void uriEscaped() : {} { "%" } */ /* A.7 Regular Expressions */ /* MORE : { "/^" : INSIDE_PATTERN } TOKEN: { < PATTERN : > : DEFAULT | < #DISJUNCTION : ()+ > | < #ALTERNATIVE : ()* > | < #TERM : | ()? > | < #ASSERTION : "^" | "$" | "\\" ("b" | "B") > | < #QUANTIFIER : ("?")? > | < #QUANTIFIERPREFIX : "*" | "+" | "?" | ( "{" ("," ()?)? "}" ) > | < #ATOM : | "." | "\\" | //| "(" ("?" (":" | "=" | "!"))? ")" | "(" ("?" (":" | "=" | "!"))? ")" > | < #PATTERN_CHARACTER : ~["^", "$", "\\", ".", "*", "+", "?", "(", ")", "[", "]", "{", "}", "|"] > | < #ATOMESCAPE : | | > | < #CHARACTER_CLASS_ESCAPE : ["d", "D", "s", "S", "w", "W"] > | < #CHARACTERESCAPE : | "c" | | | > | < #CONTROL_ESCAPE : ["f" , "n" , "r" , "t" , "v"] > | < #CONTROL_LETTER : ["a"-"z","A"-"Z"] > | < #IDENTITY_ESCAPE : ~["0"-"9", "A"-"Z", "a"-"z","-"] > | < #DECIMALESCAPE : > | < #CHARACTERCLASS : "[" ("^")? "]" > | < #CLASSRANGES : ()? > | //< #NONEMPTYCLASSRANGES : ( | "-" ) > < #NONEMPTYCLASSRANGES : ( | "-" ) > | //< #NONEMPTYCLASSRANGESNODASH : | ( | "-" ) > < #NONEMPTYCLASSRANGESNODASH : | ( | "-" ) > | < #CLASSATOM : "-" > | < #CLASSATOMNODASH : | "\\" > | < #CLASS_ATOM_NODASH_TOKEN : ~["\\", "]", "-"] > | < #CLASSESCAPE : | "b" | | > } */ /***************************************** * ECMA SYNTACTIC GRAMMARS STARTS HERE * *****************************************/ /* Section 11.1: Primary Expressions */ void PrimaryExpression() #void : {} { LOOKAHEAD("this") "this" #ThisReference | LOOKAHEAD("{") ObjectLiteral() | LOOKAHEAD("(") ( "(" Expression() ")" ) #ParenExpression | LOOKAHEAD(Identifier()) Identifier() | LOOKAHEAD("[") ArrayLiteral() | LOOKAHEAD(2) Literal() } /* Section 7.8: Literals */ void Literal() #Literal : { Token t; Map objLiteral; List arrayLiteral; } { t = { jjtThis.setDecimalValue(t.image); } | t = { jjtThis.setHexValue(t.image); } | t = { jjtThis.setStringValue(t.image); } | t = { jjtThis.setBooleanValue(t.image); } | t = { jjtThis.setNullValue(); } | t = { jjtThis.setRegexValue(t.image); } } void Identifier() #Identifier : { Token t; } { t= { jjtThis.setName(t.image); } } /* Section 11.1.4: Array Initialiser */ void ArrayLiteral() #ArrayLiteral : {} { "[" ( LOOKAHEAD(2) ( Elision() )? "]" | LOOKAHEAD(ElementList() Elision()) ElementList() Elision() "]" | ( ElementList() )? "]" ) } void ElementList() #void : {} { ( Elision() )? AssignmentExpression() ( LOOKAHEAD(Elision() AssignmentExpression()) Elision() AssignmentExpression())* } void Elision() #void : {} { (",")+ } /* Section 11.1.5: Object Initialiser */ void ObjectLiteral() #ObjectLiteral : {} { "{" ( PropertyNameAndValueList() )? "}" } void PropertyNameAndValueList() #void : {} { PropertyNameAndValue() ( LOOKAHEAD( "," PropertyNameAndValue()) "," PropertyNameAndValue() | "," )* } void PropertyNameAndValue() #LiteralField : {} { PropertyName() ":" AssignmentExpression() } void PropertyName() #void : {} { Identifier() | #Literal | #Literal } /* Section 11.2: Left-Hand-Side Expressions */ void MemberExpression() #void : {} { ( ( LOOKAHEAD("function") FunctionExpression() | PrimaryExpression() ) (LOOKAHEAD(2) MemberExpressionPart())* ) #CompositeReference(>1) | AllocationExpression() } void MemberExpressionForIn() #void : {} { ( ( LOOKAHEAD("function") FunctionExpression() | PrimaryExpression() ) (LOOKAHEAD(2) MemberExpressionPart())* ) #CompositeReference(>1) } void AllocationExpression() #AllocationExpression : {} { ( "new" MemberExpression() ( (LOOKAHEAD(Arguments()) Arguments() (LOOKAHEAD(2) MemberExpressionPart())* ) * ) ) #CompositeReference(>1) } void MemberExpressionPart() #void : {} { ( "[" Expression() "]" ) #PropertyValueReference | ( "." Identifier() ) #PropertyIdentifierReference } void CallExpression() #CompositeReference(>1) : {} { MemberExpression() Arguments() ( LOOKAHEAD(2) CallExpressionPart() )* } void CallExpressionForIn() #CompositeReference(>1) : {} { MemberExpressionForIn() Arguments() ( LOOKAHEAD(2) CallExpressionPart() )* } void CallExpressionPart() #void : {} { Arguments() | ( "[" Expression() "]" ) #PropertyValueReference | ( "." Identifier() ) #PropertyIdentifierReference } void Arguments() #FunctionCallParameters : {} { "(" (ArgumentList())? ")" } void ArgumentList() #void : {} { AssignmentExpression() ("," AssignmentExpression())* } void LeftHandSideExpression() #void : {} { LOOKAHEAD(MemberExpression() "(") CallExpression() | MemberExpression() } void LeftHandSideExpressionForIn() #void : {} { LOOKAHEAD(CallExpression()) CallExpressionForIn() | MemberExpressionForIn() } /* Section 11.3 Postfix Expressions */ void PostfixExpression() #PostfixExpression(>1) : {} { LeftHandSideExpression() [ LOOKAHEAD(1) PostfixOperator() ] } void PostfixOperator() #Operator : {} { ( "++" | "--") } /* Section 11.4 Unary Operators */ void UnaryExpression() #UnaryExpression(>1) : {} { PostfixExpression() | ( LOOKAHEAD(1) UnaryOperator() UnaryExpression() )+ } void UnaryOperator() #Operator : {} { ("delete" | "void" | "typeof" | "++" | "--" | "+" | "-" | "~" | "!") } /* Section 11.5: Multiplicative Operators */ void MultiplicativeExpression() #BinaryExpressionSequence(>1) : {} { UnaryExpression() ( MultiplicativeOperator() UnaryExpression() )* } void MultiplicativeOperator() #Operator : {} { ("*" | | "%") } /* Section 11.6: Additive Operators */ void AdditiveExpression() #BinaryExpressionSequence(>1) : {} { MultiplicativeExpression() ( LOOKAHEAD(1) AdditiveOperator() MultiplicativeExpression())* } void AdditiveOperator() #Operator : {} { ("+" | "-") } /* Section 11.7: Bitwise Shift Operators */ void ShiftExpression() #BinaryExpressionSequence(>1) : {} { AdditiveExpression() ( ShiftOperator() AdditiveExpression() )* } void ShiftOperator() #Operator : {} { ("<<" | ">>" | ">>>") } /* Section 11.4: Relational Operators */ void RelationalExpression() #BinaryExpressionSequence(>1) : {} { ShiftExpression() ( RelationalOperator() ShiftExpression() )* } void RelationalOperator() #Operator : {} { ("<" | ">" | "<=" | ">=" | "instanceof" | "in") } void RelationalExpressionNoIn() #BinaryExpressionSequence(>1) : {} { ShiftExpression() ( RelationalNoInOperator() ShiftExpression() )* } void RelationalNoInOperator() #Operator : {} { ("<" | ">" | "<=" | ">=" | "instanceof") } /* Section 11.9: Equality Operators */ void EqualityExpression() #BinaryExpressionSequence(>1) : {} { RelationalExpression() ( EqualityOperator() RelationalExpression() )* } void EqualityExpressionNoIn() #BinaryExpressionSequence(>1) : {} { RelationalExpressionNoIn() ( EqualityOperator() RelationalExpressionNoIn())* } void EqualityOperator() #Operator : {} { ("==" | "!=" | "===" | "!==") } /* Section 11.10: Binary Bitwise Operators */ void BitwiseANDExpression() #BinaryExpressionSequence(>1) : {} { EqualityExpression() ( BitwiseANDOperator() EqualityExpression())* } void BitwiseANDExpressionNoIn() #BinaryExpressionSequence(>1) : {} { EqualityExpressionNoIn() (BitwiseANDOperator() EqualityExpressionNoIn())* } void BitwiseANDOperator() #Operator : {} { "&" } void BitwiseXORExpression() #BinaryExpressionSequence(>1) : {} { BitwiseANDExpression() (BitwiseXOROperator() BitwiseANDExpression())* } void BitwiseXORExpressionNoIn() #BinaryExpressionSequence(>1) : {} { BitwiseANDExpressionNoIn() (BitwiseXOROperator() BitwiseANDExpressionNoIn())* } void BitwiseXOROperator() #Operator : {} { "^" } void BitwiseORExpression() #BinaryExpressionSequence(>1) : {} { BitwiseXORExpression() (BitwiseOROperator() BitwiseXORExpression())* } void BitwiseORExpressionNoIn() #BinaryExpressionSequence(>1) : {} { BitwiseXORExpressionNoIn() (BitwiseOROperator() BitwiseXORExpressionNoIn())* } void BitwiseOROperator() #Operator : {} { "|" } /* Section 11.11: Binary Logical Operators */ void LogicalANDExpression() #AndExpressionSequence(>1) : {} { BitwiseORExpression() (LogicalANDOperator() BitwiseORExpression())* } void LogicalANDExpressionNoIn() #AndExpressionSequence(>1) : {} { BitwiseORExpressionNoIn() (LogicalANDOperator() BitwiseORExpressionNoIn())* } void LogicalANDOperator() #Operator : {} { "&&" } void LogicalORExpression() #OrExpressionSequence(>1) : {} { LogicalANDExpression() (LogicalOROperator() LogicalANDExpression())* } void LogicalORExpressionNoIn() #OrExpressionSequence(>1) : {} { LogicalANDExpressionNoIn() (LogicalOROperator() LogicalANDExpressionNoIn())* } void LogicalOROperator() #Operator : {} { "||" } /* Section 11.12: Conditional Operator */ void ConditionalExpression() #ConditionalExpression(>1) : {} { LogicalORExpression() [ "?" AssignmentExpression() ":" AssignmentExpression() ] } void ConditionalExpressionNoIn() #ConditionalExpression(>1) : {} { LogicalORExpressionNoIn() [ "?" AssignmentExpression() ":" AssignmentExpressionNoIn() ] } /* Section 11.13: Assignment Operators */ void AssignmentExpression() #AssignmentExpression(>1) : {} { LOOKAHEAD(LeftHandSideExpression() AssignmentOperator()) LeftHandSideExpression() AssignmentOperator() AssignmentExpression() | ConditionalExpression() } void AssignmentExpressionNoIn() #AssignmentExpression(>1) : {} { LOOKAHEAD(LeftHandSideExpression() AssignmentOperator()) LeftHandSideExpression() AssignmentOperator() AssignmentExpressionNoIn() | ConditionalExpressionNoIn() } void AssignmentOperator() #Operator : {} { ("=" | "*=" | | "%=" | "+=" | "-=" | "<<=" | ">>=" | ">>>=" | "&=" | "^=" | "|=") } /* Section 11.14: Comma Operator */ void Expression() #ExpressionList(>1) : {} { AssignmentExpression() ( "," AssignmentExpression() )* } void ExpressionNoIn() : {} { AssignmentExpressionNoIn() ( "," AssignmentExpressionNoIn() )* } /* Section 12: STATEMENTS */ void Statement() #void : {} { LOOKAHEAD(Block()) Block() | LOOKAHEAD("var" Identifier() ":") JScriptVarStatement() // JScript .NET declaratrion | LOOKAHEAD("var" Identifier()) VariableStatement() | EmptyStatement() | LOOKAHEAD(Identifier() ":") LabelledStatement() | LOOKAHEAD(ExpressionStatement()) ExpressionStatement() | LOOKAHEAD("if" "(") IfStatement() | IterationStatement() | LOOKAHEAD("continue") ContinueStatement() | LOOKAHEAD("break") BreakStatement() | LOOKAHEAD("import") ImportStatement() | ReturnStatement() | WithStatement() | SwitchStatement() | ThrowStatement() | TryStatement() } /* 12.1 Block Statement */ void Block() #Block : {} { "{" ( StatementList() )? "}" } void StatementList() #StatementList(>1) : {} { ( Statement() )+ } /* Section 12.2: Variable statement */ void VariableStatement() #VariableStatement : {} { "var" VariableDeclarationList() (LOOKAHEAD(2) ";")? } void VariableDeclarationList() #VariableDeclarationList(>1) : {} { VariableDeclaration() ( "," VariableDeclaration() )* } void VariableDeclarationListNoIn() #VariableDeclarationList(>1) : {} { VariableDeclarationNoIn() ( "," VariableDeclarationNoIn() )* } void VariableDeclaration() #VariableDeclaration : {} { Identifier() ( Initialiser() )? } void VariableDeclarationNoIn() : {} { Identifier() ( InitialiserNoIn() )? #EmptyExpression(jjtree.nodeArity()==0) } void Initialiser() #void : {} { "=" AssignmentExpression() } void InitialiserNoIn() #void : {} { "=" AssignmentExpressionNoIn() } /* Section 12.3: Empty Statement */ void EmptyStatement() #EmptyStatement : {} { ";" } /* Section 12.4: Expression Statement */ void ExpressionStatement() #ExpressionStatement : {} { Expression() (LOOKAHEAD(2) ";")? } /* Section 12.5: The if Statement */ void IfStatement() #IfStatement : {} { "if" "(" Expression() ")" Statement() [ LOOKAHEAD(1) "else" Statement() ] } /* Section 12.6: Iteration Statements */ void IterationStatement() #void : {} { ( "do" Statement() "while" "(" Expression() ")" (LOOKAHEAD(2) ";")? ) #DoStatement | ( "while" "(" Expression() ")" Statement() ) #WhileStatement | LOOKAHEAD("for" "(" (ExpressionNoIn())? ";") ( "for" "(" ( ExpressionNoIn() )? #EmptyExpression(jjtree.nodeArity()==0) ";" ( Expression() )? #EmptyExpression(jjtree.nodeArity()==0) ";" ( Expression() )? #EmptyExpression(jjtree.nodeArity()==0) ")" Statement() ) #ForStatement | LOOKAHEAD("for" "(" "var" VariableDeclarationList() ";") ( "for" "(" "var" VariableDeclarationList() ";" ( Expression() )? #EmptyExpression(jjtree.nodeArity()==0) ";" ( Expression() )? #EmptyExpression(jjtree.nodeArity()==0) ")" Statement() ) #ForVarStatement | LOOKAHEAD("for" "(" "var" VariableDeclarationNoIn() "in") ( "for" "(" "var" VariableDeclarationNoIn() "in" Expression() ")" Statement() ) #ForVarInStatement | ( "for" "(" LeftHandSideExpressionForIn() "in" Expression() ")" Statement() ) #ForInStatement } /* Section 12.7: The continue Statement */ void ContinueStatement() #ContinueStatement : {} { "continue" ( LOOKAHEAD(Identifier()) Identifier() )? (LOOKAHEAD(";") ";")? } /* Section 12.8: The break Statement */ void BreakStatement() #BreakStatement : {} { "break" ( LOOKAHEAD(Identifier()) Identifier() )? (LOOKAHEAD(";") ";")? } /* Section 12.9 The return Statement */ void ReturnStatement() #ReturnStatement : {} { "return" ( LOOKAHEAD(Expression()) Expression() )? #EmptyExpression(jjtree.nodeArity()==0) (LOOKAHEAD(";") ";")? } /* Section 12.10: The with Statement */ void WithStatement() #WithStatement : {} { "with" "(" Expression() ")" Statement() } /* 12.11 The switch Statement */ void SwitchStatement() #SwitchStatement : {} { "switch" "(" Expression() ")" CaseBlock() } void CaseBlock() #CaseGroups : {} { "{" ( CaseClauses() )? ( "}" | DefaultClause() ( CaseClauses() )? "}" ) } void CaseClauses() #void : {} { ( CaseClause() )+ } void CaseClause() #CaseGroup : {} { ( ( "case" Expression() ":" ) #CaseGuard ) ( StatementList() )? } void DefaultClause() #CaseGroup : {} { ( ( "default" ":" ) #CaseGuard ) ( StatementList() )? } /* Section 12.12: Labelled Statements */ void LabelledStatement() : {} { Identifier() ":" Statement() } void ThrowStatement() #ThrowStatement : {} { "throw" Expression() (LOOKAHEAD(";") ";")? } void TryStatement() #TryStatement : {} { "try" Block() ( ( Finally() | Catch() [Finally()]) ) } void Catch() #CatchClause : {} { "catch" "(" Identifier() ")" Block() } void Finally() #FinallyClause : {} { "finally" Block() } /* Section 13: Function Definition */ void FunctionDeclaration() #FunctionDeclaration : {} { "function" Identifier() ( "(" ( FormalParameterList() )? ")" ) #FormalParameterList FunctionBody() } void FunctionExpression() #FunctionDeclaration : {} { "function" ( Identifier() )? ( "(" ( FormalParameterList() )? ")" ) #FormalParameterList FunctionBody() } void FormalParameterList() #void : {} { Identifier() ( "," Identifier() )* } void FunctionBody() #Block : {} { "{" (SourceElements())? "}" } /* Section 14: Program */ ASTProgram Program() #Program : {} { (SourceElements())? { return jjtThis; } } void SourceElements() #void : {} { (SourceElement())+ } void SourceElement() #void : {} { LOOKAHEAD(FunctionDeclaration()) FunctionDeclaration() | Statement() } /* * Grammar for parsing JScript .NET contructs: ( import System; var contents : * String = reader.ReadToEnd(); ) Refer: src/hostenv_jsc.js */ void ImportStatement(): {} { "import" Name() [ "." "*" ] ";" } void Name(): {} { ( LOOKAHEAD(2) "." )* } void JScriptVarStatement() #VariableStatement : {} { "var" JScriptVarDeclarationList() (LOOKAHEAD(2) ";")? } void JScriptVarDeclarationList() #VariableDeclarationList(>1) : {} { JScriptVarDeclaration() ( "," JScriptVarDeclaration() )* } /* * void JScriptVarDeclaration() #VariableDeclaration : {} { Identifier() ":" ( * "byte" | "sbyte" | "short" | "ushort" | "uint" | "long" | "ulong" | * "float" | "Number" | "double" | "decimal" | "boolean" | "String" | "char" ) ( * Initialiser() )? } */ void JScriptVarDeclaration() #VariableDeclaration : {} { Identifier() ":" ( Initialiser() )? } JAVACODE void insertSemiColon(){ Token inputToken = getToken(1); if(inputToken.kind == SEMICOLON){ inputToken = getNextToken(); } else if((inputToken.kind != EOF) && (inputToken.kind != RBRACE)){ if(inputToken.specialToken != null){ boolean foundLineSeparator = false; Token specialT = inputToken.specialToken; while((specialT != null) && (! foundLineSeparator)){ if((specialT.kind == LINE_TERMINATOR) || (specialT.kind == SINGLE_LINE_COMMENT)){ foundLineSeparator = true; } specialT = specialT.specialToken; } if(! foundLineSeparator){ throw generateParseException(); } } else { throw generateParseException(); } } }