react / wstein / node_modules / jest-cli / node_modules / istanbul / node_modules / handlebars / node_modules / uglify-js / lib / parse.js
80713 views/***********************************************************************12A JavaScript tokenizer / parser / beautifier / compressor.3https://github.com/mishoo/UglifyJS245-------------------------------- (C) ---------------------------------67Author: Mihai Bazon8<[email protected]>9http://mihai.bazon.net/blog1011Distributed under the BSD license:1213Copyright 2012 (c) Mihai Bazon <[email protected]>14Parser based on parse-js (http://marijn.haverbeke.nl/parse-js/).1516Redistribution and use in source and binary forms, with or without17modification, are permitted provided that the following conditions18are met:1920* Redistributions of source code must retain the above21copyright notice, this list of conditions and the following22disclaimer.2324* Redistributions in binary form must reproduce the above25copyright notice, this list of conditions and the following26disclaimer in the documentation and/or other materials27provided with the distribution.2829THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY30EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE31IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR32PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE33LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,34OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,35PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR36PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY37THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR38TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF39THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF40SUCH DAMAGE.4142***********************************************************************/4344"use strict";4546var KEYWORDS = 'break case catch const continue debugger default delete do else finally for function if in instanceof new return switch throw try typeof var void while with';47var KEYWORDS_ATOM = 'false null true';48var RESERVED_WORDS = 'abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized this throws transient volatile'49+ " " + KEYWORDS_ATOM + " " + KEYWORDS;50var KEYWORDS_BEFORE_EXPRESSION = 'return new delete throw else case';5152KEYWORDS = makePredicate(KEYWORDS);53RESERVED_WORDS = makePredicate(RESERVED_WORDS);54KEYWORDS_BEFORE_EXPRESSION = makePredicate(KEYWORDS_BEFORE_EXPRESSION);55KEYWORDS_ATOM = makePredicate(KEYWORDS_ATOM);5657var OPERATOR_CHARS = makePredicate(characters("+-*&%=<>!?|~^"));5859var RE_HEX_NUMBER = /^0x[0-9a-f]+$/i;60var RE_OCT_NUMBER = /^0[0-7]+$/;61var RE_DEC_NUMBER = /^\d*\.?\d*(?:e[+-]?\d*(?:\d\.?|\.?\d)\d*)?$/i;6263var OPERATORS = makePredicate([64"in",65"instanceof",66"typeof",67"new",68"void",69"delete",70"++",71"--",72"+",73"-",74"!",75"~",76"&",77"|",78"^",79"*",80"/",81"%",82">>",83"<<",84">>>",85"<",86">",87"<=",88">=",89"==",90"===",91"!=",92"!==",93"?",94"=",95"+=",96"-=",97"/=",98"*=",99"%=",100">>=",101"<<=",102">>>=",103"|=",104"^=",105"&=",106"&&",107"||"108]);109110var WHITESPACE_CHARS = makePredicate(characters(" \u00a0\n\r\t\f\u000b\u200b\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000"));111112var PUNC_BEFORE_EXPRESSION = makePredicate(characters("[{(,.;:"));113114var PUNC_CHARS = makePredicate(characters("[]{}(),;:"));115116var REGEXP_MODIFIERS = makePredicate(characters("gmsiy"));117118/* -----[ Tokenizer ]----- */119120// regexps adapted from http://xregexp.com/plugins/#unicode121var UNICODE = {122letter: new RegExp("[\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u0523\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0621-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971\\u0972\\u097B-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\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-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D28\\u0D2A-\\u0D39\\u0D3D\\u0D60\\u0D61\\u0D7A-\\u0D7F\\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\\u0EC0-\\u0EC4\\u0EC6\\u0EDC\\u0EDD\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8B\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10D0-\\u10FA\\u10FC\\u1100-\\u1159\\u115F-\\u11A2\\u11A8-\\u11F9\\u1200-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u1676\\u1681-\\u169A\\u16A0-\\u16EA\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19A9\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\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\\u2071\\u207F\\u2090-\\u2094\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2C6F\\u2C71-\\u2C7D\\u2C80-\\u2CE4\\u2D00-\\u2D25\\u2D30-\\u2D65\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31B7\\u31F0-\\u31FF\\u3400\\u4DB5\\u4E00\\u9FC3\\uA000-\\uA48C\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA65F\\uA662-\\uA66E\\uA67F-\\uA697\\uA717-\\uA71F\\uA722-\\uA788\\uA78B\\uA78C\\uA7FB-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA90A-\\uA925\\uA930-\\uA946\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAC00\\uD7A3\\uF900-\\uFA2D\\uFA30-\\uFA6A\\uFA70-\\uFAD9\\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-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]"),123non_spacing_mark: new RegExp("[\\u0300-\\u036F\\u0483-\\u0487\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065E\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0900-\\u0902\\u093C\\u0941-\\u0948\\u094D\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09BC\\u09C1-\\u09C4\\u09CD\\u09E2\\u09E3\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1-\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0B01\\u0B3C\\u0B3F\\u0B41-\\u0B44\\u0B4D\\u0B56\\u0B62\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C3E-\\u0C40\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0CBC\\u0CBF\\u0CC6\\u0CCC\\u0CCD\\u0CE2\\u0CE3\\u0D41-\\u0D44\\u0D4D\\u0D62\\u0D63\\u0DCA\\u0DD2-\\u0DD4\\u0DD6\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71-\\u0F7E\\u0F80-\\u0F84\\u0F86\\u0F87\\u0F90-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102D-\\u1030\\u1032-\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108D\\u109D\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B7-\\u17BD\\u17C6\\u17C9-\\u17D3\\u17DD\\u180B-\\u180D\\u18A9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193B\\u1A17\\u1A18\\u1A56\\u1A58-\\u1A5E\\u1A60\\u1A62\\u1A65-\\u1A6C\\u1A73-\\u1A7C\\u1A7F\\u1B00-\\u1B03\\u1B34\\u1B36-\\u1B3A\\u1B3C\\u1B42\\u1B6B-\\u1B73\\u1B80\\u1B81\\u1BA2-\\u1BA5\\u1BA8\\u1BA9\\u1C2C-\\u1C33\\u1C36\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1DC0-\\u1DE6\\u1DFD-\\u1DFF\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2CEF-\\u2CF1\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F\\uA67C\\uA67D\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA8C4\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA951\\uA980-\\uA982\\uA9B3\\uA9B6-\\uA9B9\\uA9BC\\uAA29-\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uABE5\\uABE8\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE26]"),124space_combining_mark: new RegExp("[\\u0903\\u093E-\\u0940\\u0949-\\u094C\\u094E\\u0982\\u0983\\u09BE-\\u09C0\\u09C7\\u09C8\\u09CB\\u09CC\\u09D7\\u0A03\\u0A3E-\\u0A40\\u0A83\\u0ABE-\\u0AC0\\u0AC9\\u0ACB\\u0ACC\\u0B02\\u0B03\\u0B3E\\u0B40\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B57\\u0BBE\\u0BBF\\u0BC1\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD7\\u0C01-\\u0C03\\u0C41-\\u0C44\\u0C82\\u0C83\\u0CBE\\u0CC0-\\u0CC4\\u0CC7\\u0CC8\\u0CCA\\u0CCB\\u0CD5\\u0CD6\\u0D02\\u0D03\\u0D3E-\\u0D40\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D57\\u0D82\\u0D83\\u0DCF-\\u0DD1\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0F3E\\u0F3F\\u0F7F\\u102B\\u102C\\u1031\\u1038\\u103B\\u103C\\u1056\\u1057\\u1062-\\u1064\\u1067-\\u106D\\u1083\\u1084\\u1087-\\u108C\\u108F\\u109A-\\u109C\\u17B6\\u17BE-\\u17C5\\u17C7\\u17C8\\u1923-\\u1926\\u1929-\\u192B\\u1930\\u1931\\u1933-\\u1938\\u19B0-\\u19C0\\u19C8\\u19C9\\u1A19-\\u1A1B\\u1A55\\u1A57\\u1A61\\u1A63\\u1A64\\u1A6D-\\u1A72\\u1B04\\u1B35\\u1B3B\\u1B3D-\\u1B41\\u1B43\\u1B44\\u1B82\\u1BA1\\u1BA6\\u1BA7\\u1BAA\\u1C24-\\u1C2B\\u1C34\\u1C35\\u1CE1\\u1CF2\\uA823\\uA824\\uA827\\uA880\\uA881\\uA8B4-\\uA8C3\\uA952\\uA953\\uA983\\uA9B4\\uA9B5\\uA9BA\\uA9BB\\uA9BD-\\uA9C0\\uAA2F\\uAA30\\uAA33\\uAA34\\uAA4D\\uAA7B\\uABE3\\uABE4\\uABE6\\uABE7\\uABE9\\uABEA\\uABEC]"),125connector_punctuation: new RegExp("[\\u005F\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF3F]")126};127128function is_letter(code) {129return (code >= 97 && code <= 122)130|| (code >= 65 && code <= 90)131|| (code >= 0xaa && UNICODE.letter.test(String.fromCharCode(code)));132};133134function is_digit(code) {135return code >= 48 && code <= 57; //XXX: find out if "UnicodeDigit" means something else than 0..9136};137138function is_alphanumeric_char(code) {139return is_digit(code) || is_letter(code);140};141142function is_unicode_combining_mark(ch) {143return UNICODE.non_spacing_mark.test(ch) || UNICODE.space_combining_mark.test(ch);144};145146function is_unicode_connector_punctuation(ch) {147return UNICODE.connector_punctuation.test(ch);148};149150function is_identifier(name) {151return !RESERVED_WORDS(name) && /^[a-z_$][a-z0-9_$]*$/i.test(name);152};153154function is_identifier_start(code) {155return code == 36 || code == 95 || is_letter(code);156};157158function is_identifier_char(ch) {159var code = ch.charCodeAt(0);160return is_identifier_start(code)161|| is_digit(code)162|| code == 8204 // \u200c: zero-width non-joiner <ZWNJ>163|| code == 8205 // \u200d: zero-width joiner <ZWJ> (in my ECMA-262 PDF, this is also 200c)164|| is_unicode_combining_mark(ch)165|| is_unicode_connector_punctuation(ch)166;167};168169function is_identifier_string(str){170var i = str.length;171if (i == 0) return false;172if (is_digit(str.charCodeAt(0))) return false;173while (--i >= 0) {174if (!is_identifier_char(str.charAt(i)))175return false;176}177return true;178};179180function parse_js_number(num) {181if (RE_HEX_NUMBER.test(num)) {182return parseInt(num.substr(2), 16);183} else if (RE_OCT_NUMBER.test(num)) {184return parseInt(num.substr(1), 8);185} else if (RE_DEC_NUMBER.test(num)) {186return parseFloat(num);187}188};189190function JS_Parse_Error(message, line, col, pos) {191this.message = message;192this.line = line;193this.col = col;194this.pos = pos;195this.stack = new Error().stack;196};197198JS_Parse_Error.prototype.toString = function() {199return this.message + " (line: " + this.line + ", col: " + this.col + ", pos: " + this.pos + ")" + "\n\n" + this.stack;200};201202function js_error(message, filename, line, col, pos) {203throw new JS_Parse_Error(message, line, col, pos);204};205206function is_token(token, type, val) {207return token.type == type && (val == null || token.value == val);208};209210var EX_EOF = {};211212function tokenizer($TEXT, filename) {213214var S = {215text : $TEXT.replace(/\r\n?|[\n\u2028\u2029]/g, "\n").replace(/\uFEFF/g, ''),216filename : filename,217pos : 0,218tokpos : 0,219line : 1,220tokline : 0,221col : 0,222tokcol : 0,223newline_before : false,224regex_allowed : false,225comments_before : []226};227228function peek() { return S.text.charAt(S.pos); };229230function next(signal_eof, in_string) {231var ch = S.text.charAt(S.pos++);232if (signal_eof && !ch)233throw EX_EOF;234if (ch == "\n") {235S.newline_before = S.newline_before || !in_string;236++S.line;237S.col = 0;238} else {239++S.col;240}241return ch;242};243244function find(what, signal_eof) {245var pos = S.text.indexOf(what, S.pos);246if (signal_eof && pos == -1) throw EX_EOF;247return pos;248};249250function start_token() {251S.tokline = S.line;252S.tokcol = S.col;253S.tokpos = S.pos;254};255256function token(type, value, is_comment) {257S.regex_allowed = ((type == "operator" && !UNARY_POSTFIX[value]) ||258(type == "keyword" && KEYWORDS_BEFORE_EXPRESSION(value)) ||259(type == "punc" && PUNC_BEFORE_EXPRESSION(value)));260var ret = {261type : type,262value : value,263line : S.tokline,264col : S.tokcol,265pos : S.tokpos,266endpos : S.pos,267nlb : S.newline_before,268file : filename269};270if (!is_comment) {271ret.comments_before = S.comments_before;272S.comments_before = [];273// make note of any newlines in the comments that came before274for (var i = 0, len = ret.comments_before.length; i < len; i++) {275ret.nlb = ret.nlb || ret.comments_before[i].nlb;276}277}278S.newline_before = false;279return new AST_Token(ret);280};281282function skip_whitespace() {283while (WHITESPACE_CHARS(peek()))284next();285};286287function read_while(pred) {288var ret = "", ch, i = 0;289while ((ch = peek()) && pred(ch, i++))290ret += next();291return ret;292};293294function parse_error(err) {295js_error(err, filename, S.tokline, S.tokcol, S.tokpos);296};297298function read_num(prefix) {299var has_e = false, after_e = false, has_x = false, has_dot = prefix == ".";300var num = read_while(function(ch, i){301var code = ch.charCodeAt(0);302switch (code) {303case 120: case 88: // xX304return has_x ? false : (has_x = true);305case 101: case 69: // eE306return has_x ? true : has_e ? false : (has_e = after_e = true);307case 45: // -308return after_e || (i == 0 && !prefix);309case 43: // +310return after_e;311case (after_e = false, 46): // .312return (!has_dot && !has_x && !has_e) ? (has_dot = true) : false;313}314return is_alphanumeric_char(code);315});316if (prefix) num = prefix + num;317var valid = parse_js_number(num);318if (!isNaN(valid)) {319return token("num", valid);320} else {321parse_error("Invalid syntax: " + num);322}323};324325function read_escaped_char(in_string) {326var ch = next(true, in_string);327switch (ch.charCodeAt(0)) {328case 110 : return "\n";329case 114 : return "\r";330case 116 : return "\t";331case 98 : return "\b";332case 118 : return "\u000b"; // \v333case 102 : return "\f";334case 48 : return "\0";335case 120 : return String.fromCharCode(hex_bytes(2)); // \x336case 117 : return String.fromCharCode(hex_bytes(4)); // \u337case 10 : return ""; // newline338default : return ch;339}340};341342function hex_bytes(n) {343var num = 0;344for (; n > 0; --n) {345var digit = parseInt(next(true), 16);346if (isNaN(digit))347parse_error("Invalid hex-character pattern in string");348num = (num << 4) | digit;349}350return num;351};352353var read_string = with_eof_error("Unterminated string constant", function(){354var quote = next(), ret = "";355for (;;) {356var ch = next(true);357if (ch == "\\") {358// read OctalEscapeSequence (XXX: deprecated if "strict mode")359// https://github.com/mishoo/UglifyJS/issues/178360var octal_len = 0, first = null;361ch = read_while(function(ch){362if (ch >= "0" && ch <= "7") {363if (!first) {364first = ch;365return ++octal_len;366}367else if (first <= "3" && octal_len <= 2) return ++octal_len;368else if (first >= "4" && octal_len <= 1) return ++octal_len;369}370return false;371});372if (octal_len > 0) ch = String.fromCharCode(parseInt(ch, 8));373else ch = read_escaped_char(true);374}375else if (ch == quote) break;376ret += ch;377}378return token("string", ret);379});380381function read_line_comment() {382next();383var i = find("\n"), ret;384if (i == -1) {385ret = S.text.substr(S.pos);386S.pos = S.text.length;387} else {388ret = S.text.substring(S.pos, i);389S.pos = i;390}391return token("comment1", ret, true);392};393394var read_multiline_comment = with_eof_error("Unterminated multiline comment", function(){395next();396var i = find("*/", true);397var text = S.text.substring(S.pos, i);398var a = text.split("\n"), n = a.length;399// update stream position400S.pos = i + 2;401S.line += n - 1;402if (n > 1) S.col = a[n - 1].length;403else S.col += a[n - 1].length;404S.col += 2;405S.newline_before = S.newline_before || text.indexOf("\n") >= 0;406return token("comment2", text, true);407});408409function read_name() {410var backslash = false, name = "", ch, escaped = false, hex;411while ((ch = peek()) != null) {412if (!backslash) {413if (ch == "\\") escaped = backslash = true, next();414else if (is_identifier_char(ch)) name += next();415else break;416}417else {418if (ch != "u") parse_error("Expecting UnicodeEscapeSequence -- uXXXX");419ch = read_escaped_char();420if (!is_identifier_char(ch)) parse_error("Unicode char: " + ch.charCodeAt(0) + " is not valid in identifier");421name += ch;422backslash = false;423}424}425if (KEYWORDS(name) && escaped) {426hex = name.charCodeAt(0).toString(16).toUpperCase();427name = "\\u" + "0000".substr(hex.length) + hex + name.slice(1);428}429return name;430};431432var read_regexp = with_eof_error("Unterminated regular expression", function(regexp){433var prev_backslash = false, ch, in_class = false;434while ((ch = next(true))) if (prev_backslash) {435regexp += "\\" + ch;436prev_backslash = false;437} else if (ch == "[") {438in_class = true;439regexp += ch;440} else if (ch == "]" && in_class) {441in_class = false;442regexp += ch;443} else if (ch == "/" && !in_class) {444break;445} else if (ch == "\\") {446prev_backslash = true;447} else {448regexp += ch;449}450var mods = read_name();451return token("regexp", new RegExp(regexp, mods));452});453454function read_operator(prefix) {455function grow(op) {456if (!peek()) return op;457var bigger = op + peek();458if (OPERATORS(bigger)) {459next();460return grow(bigger);461} else {462return op;463}464};465return token("operator", grow(prefix || next()));466};467468function handle_slash() {469next();470var regex_allowed = S.regex_allowed;471switch (peek()) {472case "/":473S.comments_before.push(read_line_comment());474S.regex_allowed = regex_allowed;475return next_token();476case "*":477S.comments_before.push(read_multiline_comment());478S.regex_allowed = regex_allowed;479return next_token();480}481return S.regex_allowed ? read_regexp("") : read_operator("/");482};483484function handle_dot() {485next();486return is_digit(peek().charCodeAt(0))487? read_num(".")488: token("punc", ".");489};490491function read_word() {492var word = read_name();493return KEYWORDS_ATOM(word) ? token("atom", word)494: !KEYWORDS(word) ? token("name", word)495: OPERATORS(word) ? token("operator", word)496: token("keyword", word);497};498499function with_eof_error(eof_error, cont) {500return function(x) {501try {502return cont(x);503} catch(ex) {504if (ex === EX_EOF) parse_error(eof_error);505else throw ex;506}507};508};509510function next_token(force_regexp) {511if (force_regexp != null)512return read_regexp(force_regexp);513skip_whitespace();514start_token();515var ch = peek();516if (!ch) return token("eof");517var code = ch.charCodeAt(0);518switch (code) {519case 34: case 39: return read_string();520case 46: return handle_dot();521case 47: return handle_slash();522}523if (is_digit(code)) return read_num();524if (PUNC_CHARS(ch)) return token("punc", next());525if (OPERATOR_CHARS(ch)) return read_operator();526if (code == 92 || is_identifier_start(code)) return read_word();527parse_error("Unexpected character '" + ch + "'");528};529530next_token.context = function(nc) {531if (nc) S = nc;532return S;533};534535return next_token;536537};538539/* -----[ Parser (constants) ]----- */540541var UNARY_PREFIX = makePredicate([542"typeof",543"void",544"delete",545"--",546"++",547"!",548"~",549"-",550"+"551]);552553var UNARY_POSTFIX = makePredicate([ "--", "++" ]);554555var ASSIGNMENT = makePredicate([ "=", "+=", "-=", "/=", "*=", "%=", ">>=", "<<=", ">>>=", "|=", "^=", "&=" ]);556557var PRECEDENCE = (function(a, ret){558for (var i = 0, n = 1; i < a.length; ++i, ++n) {559var b = a[i];560for (var j = 0; j < b.length; ++j) {561ret[b[j]] = n;562}563}564return ret;565})(566[567["||"],568["&&"],569["|"],570["^"],571["&"],572["==", "===", "!=", "!=="],573["<", ">", "<=", ">=", "in", "instanceof"],574[">>", "<<", ">>>"],575["+", "-"],576["*", "/", "%"]577],578{}579);580581var STATEMENTS_WITH_LABELS = array_to_hash([ "for", "do", "while", "switch" ]);582583var ATOMIC_START_TOKEN = array_to_hash([ "atom", "num", "string", "regexp", "name" ]);584585/* -----[ Parser ]----- */586587function parse($TEXT, options) {588589options = defaults(options, {590strict : false,591filename : null,592toplevel : null,593expression : false594});595596var S = {597input : typeof $TEXT == "string" ? tokenizer($TEXT, options.filename) : $TEXT,598token : null,599prev : null,600peeked : null,601in_function : 0,602in_directives : true,603in_loop : 0,604labels : []605};606607S.token = next();608609function is(type, value) {610return is_token(S.token, type, value);611};612613function peek() { return S.peeked || (S.peeked = S.input()); };614615function next() {616S.prev = S.token;617if (S.peeked) {618S.token = S.peeked;619S.peeked = null;620} else {621S.token = S.input();622}623S.in_directives = S.in_directives && (624S.token.type == "string" || is("punc", ";")625);626return S.token;627};628629function prev() {630return S.prev;631};632633function croak(msg, line, col, pos) {634var ctx = S.input.context();635js_error(msg,636ctx.filename,637line != null ? line : ctx.tokline,638col != null ? col : ctx.tokcol,639pos != null ? pos : ctx.tokpos);640};641642function token_error(token, msg) {643croak(msg, token.line, token.col);644};645646function unexpected(token) {647if (token == null)648token = S.token;649token_error(token, "Unexpected token: " + token.type + " (" + token.value + ")");650};651652function expect_token(type, val) {653if (is(type, val)) {654return next();655}656token_error(S.token, "Unexpected token " + S.token.type + " «" + S.token.value + "»" + ", expected " + type + " «" + val + "»");657};658659function expect(punc) { return expect_token("punc", punc); };660661function can_insert_semicolon() {662return !options.strict && (663S.token.nlb || is("eof") || is("punc", "}")664);665};666667function semicolon() {668if (is("punc", ";")) next();669else if (!can_insert_semicolon()) unexpected();670};671672function parenthesised() {673expect("(");674var exp = expression(true);675expect(")");676return exp;677};678679function embed_tokens(parser) {680return function() {681var start = S.token;682var expr = parser();683var end = prev();684expr.start = start;685expr.end = end;686return expr;687};688};689690var statement = embed_tokens(function() {691var tmp;692if (is("operator", "/") || is("operator", "/=")) {693S.peeked = null;694S.token = S.input(S.token.value.substr(1)); // force regexp695}696switch (S.token.type) {697case "string":698var dir = S.in_directives, stat = simple_statement();699// XXXv2: decide how to fix directives700if (dir && stat.body instanceof AST_String && !is("punc", ","))701return new AST_Directive({ value: stat.body.value });702return stat;703case "num":704case "regexp":705case "operator":706case "atom":707return simple_statement();708709case "name":710return is_token(peek(), "punc", ":")711? labeled_statement()712: simple_statement();713714case "punc":715switch (S.token.value) {716case "{":717return new AST_BlockStatement({718start : S.token,719body : block_(),720end : prev()721});722case "[":723case "(":724return simple_statement();725case ";":726next();727return new AST_EmptyStatement();728default:729unexpected();730}731732case "keyword":733switch (tmp = S.token.value, next(), tmp) {734case "break":735return break_cont(AST_Break);736737case "continue":738return break_cont(AST_Continue);739740case "debugger":741semicolon();742return new AST_Debugger();743744case "do":745return new AST_Do({746body : in_loop(statement),747condition : (expect_token("keyword", "while"), tmp = parenthesised(), semicolon(), tmp)748});749750case "while":751return new AST_While({752condition : parenthesised(),753body : in_loop(statement)754});755756case "for":757return for_();758759case "function":760return function_(true);761762case "if":763return if_();764765case "return":766if (S.in_function == 0)767croak("'return' outside of function");768return new AST_Return({769value: ( is("punc", ";")770? (next(), null)771: can_insert_semicolon()772? null773: (tmp = expression(true), semicolon(), tmp) )774});775776case "switch":777return new AST_Switch({778expression : parenthesised(),779body : in_loop(switch_body_)780});781782case "throw":783if (S.token.nlb)784croak("Illegal newline after 'throw'");785return new AST_Throw({786value: (tmp = expression(true), semicolon(), tmp)787});788789case "try":790return try_();791792case "var":793return tmp = var_(), semicolon(), tmp;794795case "const":796return tmp = const_(), semicolon(), tmp;797798case "with":799return new AST_With({800expression : parenthesised(),801body : statement()802});803804default:805unexpected();806}807}808});809810function labeled_statement() {811var label = as_symbol(AST_Label);812if (find_if(function(l){ return l.name == label.name }, S.labels)) {813// ECMA-262, 12.12: An ECMAScript program is considered814// syntactically incorrect if it contains a815// LabelledStatement that is enclosed by a816// LabelledStatement with the same Identifier as label.817croak("Label " + label.name + " defined twice");818}819expect(":");820S.labels.push(label);821var stat = statement();822S.labels.pop();823return new AST_LabeledStatement({ body: stat, label: label });824};825826function simple_statement(tmp) {827return new AST_SimpleStatement({ body: (tmp = expression(true), semicolon(), tmp) });828};829830function break_cont(type) {831var label = null;832if (!can_insert_semicolon()) {833label = as_symbol(AST_LabelRef, true);834}835if (label != null) {836if (!find_if(function(l){ return l.name == label.name }, S.labels))837croak("Undefined label " + label.name);838}839else if (S.in_loop == 0)840croak(type.TYPE + " not inside a loop or switch");841semicolon();842return new type({ label: label });843};844845function for_() {846expect("(");847var init = null;848if (!is("punc", ";")) {849init = is("keyword", "var")850? (next(), var_(true))851: expression(true, true);852if (is("operator", "in")) {853if (init instanceof AST_Var && init.definitions.length > 1)854croak("Only one variable declaration allowed in for..in loop");855next();856return for_in(init);857}858}859return regular_for(init);860};861862function regular_for(init) {863expect(";");864var test = is("punc", ";") ? null : expression(true);865expect(";");866var step = is("punc", ")") ? null : expression(true);867expect(")");868return new AST_For({869init : init,870condition : test,871step : step,872body : in_loop(statement)873});874};875876function for_in(init) {877var lhs = init instanceof AST_Var ? init.definitions[0].name : null;878var obj = expression(true);879expect(")");880return new AST_ForIn({881init : init,882name : lhs,883object : obj,884body : in_loop(statement)885});886};887888var function_ = function(in_statement, ctor) {889var is_accessor = ctor === AST_Accessor;890var name = (is("name") ? as_symbol(in_statement891? AST_SymbolDefun892: is_accessor893? AST_SymbolAccessor894: AST_SymbolLambda)895: is_accessor && (is("string") || is("num")) ? as_atom_node()896: null);897if (in_statement && !name)898unexpected();899expect("(");900if (!ctor) ctor = in_statement ? AST_Defun : AST_Function;901return new ctor({902name: name,903argnames: (function(first, a){904while (!is("punc", ")")) {905if (first) first = false; else expect(",");906a.push(as_symbol(AST_SymbolFunarg));907}908next();909return a;910})(true, []),911body: (function(loop, labels){912++S.in_function;913S.in_directives = true;914S.in_loop = 0;915S.labels = [];916var a = block_();917--S.in_function;918S.in_loop = loop;919S.labels = labels;920return a;921})(S.in_loop, S.labels)922});923};924925function if_() {926var cond = parenthesised(), body = statement(), belse = null;927if (is("keyword", "else")) {928next();929belse = statement();930}931return new AST_If({932condition : cond,933body : body,934alternative : belse935});936};937938function block_() {939expect("{");940var a = [];941while (!is("punc", "}")) {942if (is("eof")) unexpected();943a.push(statement());944}945next();946return a;947};948949function switch_body_() {950expect("{");951var a = [], cur = null, branch = null, tmp;952while (!is("punc", "}")) {953if (is("eof")) unexpected();954if (is("keyword", "case")) {955if (branch) branch.end = prev();956cur = [];957branch = new AST_Case({958start : (tmp = S.token, next(), tmp),959expression : expression(true),960body : cur961});962a.push(branch);963expect(":");964}965else if (is("keyword", "default")) {966if (branch) branch.end = prev();967cur = [];968branch = new AST_Default({969start : (tmp = S.token, next(), expect(":"), tmp),970body : cur971});972a.push(branch);973}974else {975if (!cur) unexpected();976cur.push(statement());977}978}979if (branch) branch.end = prev();980next();981return a;982};983984function try_() {985var body = block_(), bcatch = null, bfinally = null;986if (is("keyword", "catch")) {987var start = S.token;988next();989expect("(");990var name = as_symbol(AST_SymbolCatch);991expect(")");992bcatch = new AST_Catch({993start : start,994argname : name,995body : block_(),996end : prev()997});998}999if (is("keyword", "finally")) {1000var start = S.token;1001next();1002bfinally = new AST_Finally({1003start : start,1004body : block_(),1005end : prev()1006});1007}1008if (!bcatch && !bfinally)1009croak("Missing catch/finally blocks");1010return new AST_Try({1011body : body,1012bcatch : bcatch,1013bfinally : bfinally1014});1015};10161017function vardefs(no_in, in_const) {1018var a = [];1019for (;;) {1020a.push(new AST_VarDef({1021start : S.token,1022name : as_symbol(in_const ? AST_SymbolConst : AST_SymbolVar),1023value : is("operator", "=") ? (next(), expression(false, no_in)) : null,1024end : prev()1025}));1026if (!is("punc", ","))1027break;1028next();1029}1030return a;1031};10321033var var_ = function(no_in) {1034return new AST_Var({1035start : prev(),1036definitions : vardefs(no_in, false),1037end : prev()1038});1039};10401041var const_ = function() {1042return new AST_Const({1043start : prev(),1044definitions : vardefs(false, true),1045end : prev()1046});1047};10481049var new_ = function() {1050var start = S.token;1051expect_token("operator", "new");1052var newexp = expr_atom(false), args;1053if (is("punc", "(")) {1054next();1055args = expr_list(")");1056} else {1057args = [];1058}1059return subscripts(new AST_New({1060start : start,1061expression : newexp,1062args : args,1063end : prev()1064}), true);1065};10661067function as_atom_node() {1068var tok = S.token, ret;1069switch (tok.type) {1070case "name":1071return as_symbol(AST_SymbolRef);1072case "num":1073ret = new AST_Number({ start: tok, end: tok, value: tok.value });1074break;1075case "string":1076ret = new AST_String({ start: tok, end: tok, value: tok.value });1077break;1078case "regexp":1079ret = new AST_RegExp({ start: tok, end: tok, value: tok.value });1080break;1081case "atom":1082switch (tok.value) {1083case "false":1084ret = new AST_False({ start: tok, end: tok });1085break;1086case "true":1087ret = new AST_True({ start: tok, end: tok });1088break;1089case "null":1090ret = new AST_Null({ start: tok, end: tok });1091break;1092}1093break;1094}1095next();1096return ret;1097};10981099var expr_atom = function(allow_calls) {1100if (is("operator", "new")) {1101return new_();1102}1103var start = S.token;1104if (is("punc")) {1105switch (start.value) {1106case "(":1107next();1108var ex = expression(true);1109ex.start = start;1110ex.end = S.token;1111expect(")");1112return subscripts(ex, allow_calls);1113case "[":1114return subscripts(array_(), allow_calls);1115case "{":1116return subscripts(object_(), allow_calls);1117}1118unexpected();1119}1120if (is("keyword", "function")) {1121next();1122var func = function_(false);1123func.start = start;1124func.end = prev();1125return subscripts(func, allow_calls);1126}1127if (ATOMIC_START_TOKEN[S.token.type]) {1128return subscripts(as_atom_node(), allow_calls);1129}1130unexpected();1131};11321133function expr_list(closing, allow_trailing_comma, allow_empty) {1134var first = true, a = [];1135while (!is("punc", closing)) {1136if (first) first = false; else expect(",");1137if (allow_trailing_comma && is("punc", closing)) break;1138if (is("punc", ",") && allow_empty) {1139a.push(new AST_Hole({ start: S.token, end: S.token }));1140} else {1141a.push(expression(false));1142}1143}1144next();1145return a;1146};11471148var array_ = embed_tokens(function() {1149expect("[");1150return new AST_Array({1151elements: expr_list("]", !options.strict, true)1152});1153});11541155var object_ = embed_tokens(function() {1156expect("{");1157var first = true, a = [];1158while (!is("punc", "}")) {1159if (first) first = false; else expect(",");1160if (!options.strict && is("punc", "}"))1161// allow trailing comma1162break;1163var start = S.token;1164var type = start.type;1165var name = as_property_name();1166if (type == "name" && !is("punc", ":")) {1167if (name == "get") {1168a.push(new AST_ObjectGetter({1169start : start,1170key : name,1171value : function_(false, AST_Accessor),1172end : prev()1173}));1174continue;1175}1176if (name == "set") {1177a.push(new AST_ObjectSetter({1178start : start,1179key : name,1180value : function_(false, AST_Accessor),1181end : prev()1182}));1183continue;1184}1185}1186expect(":");1187a.push(new AST_ObjectKeyVal({1188start : start,1189key : name,1190value : expression(false),1191end : prev()1192}));1193}1194next();1195return new AST_Object({ properties: a });1196});11971198function as_property_name() {1199var tmp = S.token;1200next();1201switch (tmp.type) {1202case "num":1203case "string":1204case "name":1205case "operator":1206case "keyword":1207case "atom":1208return tmp.value;1209default:1210unexpected();1211}1212};12131214function as_name() {1215var tmp = S.token;1216next();1217switch (tmp.type) {1218case "name":1219case "operator":1220case "keyword":1221case "atom":1222return tmp.value;1223default:1224unexpected();1225}1226};12271228function as_symbol(type, noerror) {1229if (!is("name")) {1230if (!noerror) croak("Name expected");1231return null;1232}1233var name = S.token.value;1234var sym = new (name == "this" ? AST_This : type)({1235name : String(S.token.value),1236start : S.token,1237end : S.token1238});1239next();1240return sym;1241};12421243var subscripts = function(expr, allow_calls) {1244var start = expr.start;1245if (is("punc", ".")) {1246next();1247return subscripts(new AST_Dot({1248start : start,1249expression : expr,1250property : as_name(),1251end : prev()1252}), allow_calls);1253}1254if (is("punc", "[")) {1255next();1256var prop = expression(true);1257expect("]");1258return subscripts(new AST_Sub({1259start : start,1260expression : expr,1261property : prop,1262end : prev()1263}), allow_calls);1264}1265if (allow_calls && is("punc", "(")) {1266next();1267return subscripts(new AST_Call({1268start : start,1269expression : expr,1270args : expr_list(")"),1271end : prev()1272}), true);1273}1274return expr;1275};12761277var maybe_unary = function(allow_calls) {1278var start = S.token;1279if (is("operator") && UNARY_PREFIX(start.value)) {1280next();1281var ex = make_unary(AST_UnaryPrefix, start.value, maybe_unary(allow_calls));1282ex.start = start;1283ex.end = prev();1284return ex;1285}1286var val = expr_atom(allow_calls);1287while (is("operator") && UNARY_POSTFIX(S.token.value) && !S.token.nlb) {1288val = make_unary(AST_UnaryPostfix, S.token.value, val);1289val.start = start;1290val.end = S.token;1291next();1292}1293return val;1294};12951296function make_unary(ctor, op, expr) {1297if ((op == "++" || op == "--") && !is_assignable(expr))1298croak("Invalid use of " + op + " operator");1299return new ctor({ operator: op, expression: expr });1300};13011302var expr_op = function(left, min_prec, no_in) {1303var op = is("operator") ? S.token.value : null;1304if (op == "in" && no_in) op = null;1305var prec = op != null ? PRECEDENCE[op] : null;1306if (prec != null && prec > min_prec) {1307next();1308var right = expr_op(maybe_unary(true), prec, no_in);1309return expr_op(new AST_Binary({1310start : left.start,1311left : left,1312operator : op,1313right : right,1314end : right.end1315}), min_prec, no_in);1316}1317return left;1318};13191320function expr_ops(no_in) {1321return expr_op(maybe_unary(true), 0, no_in);1322};13231324var maybe_conditional = function(no_in) {1325var start = S.token;1326var expr = expr_ops(no_in);1327if (is("operator", "?")) {1328next();1329var yes = expression(false);1330expect(":");1331return new AST_Conditional({1332start : start,1333condition : expr,1334consequent : yes,1335alternative : expression(false, no_in),1336end : peek()1337});1338}1339return expr;1340};13411342function is_assignable(expr) {1343if (!options.strict) return true;1344if (expr instanceof AST_This) return false;1345return (expr instanceof AST_PropAccess || expr instanceof AST_Symbol);1346};13471348var maybe_assign = function(no_in) {1349var start = S.token;1350var left = maybe_conditional(no_in), val = S.token.value;1351if (is("operator") && ASSIGNMENT(val)) {1352if (is_assignable(left)) {1353next();1354return new AST_Assign({1355start : start,1356left : left,1357operator : val,1358right : maybe_assign(no_in),1359end : prev()1360});1361}1362croak("Invalid assignment");1363}1364return left;1365};13661367var expression = function(commas, no_in) {1368var start = S.token;1369var expr = maybe_assign(no_in);1370if (commas && is("punc", ",")) {1371next();1372return new AST_Seq({1373start : start,1374car : expr,1375cdr : expression(true, no_in),1376end : peek()1377});1378}1379return expr;1380};13811382function in_loop(cont) {1383++S.in_loop;1384var ret = cont();1385--S.in_loop;1386return ret;1387};13881389if (options.expression) {1390return expression(true);1391}13921393return (function(){1394var start = S.token;1395var body = [];1396while (!is("eof"))1397body.push(statement());1398var end = prev();1399var toplevel = options.toplevel;1400if (toplevel) {1401toplevel.body = toplevel.body.concat(body);1402toplevel.end = end;1403} else {1404toplevel = new AST_Toplevel({ start: start, body: body, end: end });1405}1406return toplevel;1407})();14081409};141014111412