react / react-0.13.3 / examples / basic-commonjs / node_modules / browserify / node_modules / umd / node_modules / ruglify / node_modules / uglify-js / lib / parse.js
80760 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 /^[a-z_$][a-z0-9_$]*$/i.test(name) && !RESERVED_WORDS(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 parse_js_number(num) {170if (RE_HEX_NUMBER.test(num)) {171return parseInt(num.substr(2), 16);172} else if (RE_OCT_NUMBER.test(num)) {173return parseInt(num.substr(1), 8);174} else if (RE_DEC_NUMBER.test(num)) {175return parseFloat(num);176}177};178179function JS_Parse_Error(message, line, col, pos) {180this.message = message;181this.line = line;182this.col = col;183this.pos = pos;184this.stack = new Error().stack;185};186187JS_Parse_Error.prototype.toString = function() {188return this.message + " (line: " + this.line + ", col: " + this.col + ", pos: " + this.pos + ")" + "\n\n" + this.stack;189};190191function js_error(message, filename, line, col, pos) {192AST_Node.warn("ERROR: {message} [{file}:{line},{col}]", {193message: message,194file: filename,195line: line,196col: col197});198throw new JS_Parse_Error(message, line, col, pos);199};200201function is_token(token, type, val) {202return token.type == type && (val == null || token.value == val);203};204205var EX_EOF = {};206207function tokenizer($TEXT, filename) {208209var S = {210text : $TEXT.replace(/\r\n?|[\n\u2028\u2029]/g, "\n").replace(/\uFEFF/g, ''),211filename : filename,212pos : 0,213tokpos : 0,214line : 1,215tokline : 0,216col : 0,217tokcol : 0,218newline_before : false,219regex_allowed : false,220comments_before : []221};222223function peek() { return S.text.charAt(S.pos); };224225function next(signal_eof, in_string) {226var ch = S.text.charAt(S.pos++);227if (signal_eof && !ch)228throw EX_EOF;229if (ch == "\n") {230S.newline_before = S.newline_before || !in_string;231++S.line;232S.col = 0;233} else {234++S.col;235}236return ch;237};238239function find(what, signal_eof) {240var pos = S.text.indexOf(what, S.pos);241if (signal_eof && pos == -1) throw EX_EOF;242return pos;243};244245function start_token() {246S.tokline = S.line;247S.tokcol = S.col;248S.tokpos = S.pos;249};250251function token(type, value, is_comment) {252S.regex_allowed = ((type == "operator" && !UNARY_POSTFIX[value]) ||253(type == "keyword" && KEYWORDS_BEFORE_EXPRESSION(value)) ||254(type == "punc" && PUNC_BEFORE_EXPRESSION(value)));255var ret = {256type : type,257value : value,258line : S.tokline,259col : S.tokcol,260pos : S.tokpos,261endpos : S.pos,262nlb : S.newline_before,263file : filename264};265if (!is_comment) {266ret.comments_before = S.comments_before;267S.comments_before = [];268// make note of any newlines in the comments that came before269for (var i = 0, len = ret.comments_before.length; i < len; i++) {270ret.nlb = ret.nlb || ret.comments_before[i].nlb;271}272}273S.newline_before = false;274return new AST_Token(ret);275};276277function skip_whitespace() {278while (WHITESPACE_CHARS(peek()))279next();280};281282function read_while(pred) {283var ret = "", ch, i = 0;284while ((ch = peek()) && pred(ch, i++))285ret += next();286return ret;287};288289function parse_error(err) {290js_error(err, filename, S.tokline, S.tokcol, S.tokpos);291};292293function read_num(prefix) {294var has_e = false, after_e = false, has_x = false, has_dot = prefix == ".";295var num = read_while(function(ch, i){296var code = ch.charCodeAt(0);297switch (code) {298case 120: case 88: // xX299return has_x ? false : (has_x = true);300case 101: case 69: // eE301return has_x ? true : has_e ? false : (has_e = after_e = true);302case 45: // -303return after_e || (i == 0 && !prefix);304case 43: // +305return after_e;306case (after_e = false, 46): // .307return (!has_dot && !has_x && !has_e) ? (has_dot = true) : false;308}309return is_alphanumeric_char(code);310});311if (prefix) num = prefix + num;312var valid = parse_js_number(num);313if (!isNaN(valid)) {314return token("num", valid);315} else {316parse_error("Invalid syntax: " + num);317}318};319320function read_escaped_char(in_string) {321var ch = next(true, in_string);322switch (ch.charCodeAt(0)) {323case 110 : return "\n";324case 114 : return "\r";325case 116 : return "\t";326case 98 : return "\b";327case 118 : return "\u000b"; // \v328case 102 : return "\f";329case 48 : return "\0";330case 120 : return String.fromCharCode(hex_bytes(2)); // \x331case 117 : return String.fromCharCode(hex_bytes(4)); // \u332case 10 : return ""; // newline333default : return ch;334}335};336337function hex_bytes(n) {338var num = 0;339for (; n > 0; --n) {340var digit = parseInt(next(true), 16);341if (isNaN(digit))342parse_error("Invalid hex-character pattern in string");343num = (num << 4) | digit;344}345return num;346};347348var read_string = with_eof_error("Unterminated string constant", function(){349var quote = next(), ret = "";350for (;;) {351var ch = next(true);352if (ch == "\\") {353// read OctalEscapeSequence (XXX: deprecated if "strict mode")354// https://github.com/mishoo/UglifyJS/issues/178355var octal_len = 0, first = null;356ch = read_while(function(ch){357if (ch >= "0" && ch <= "7") {358if (!first) {359first = ch;360return ++octal_len;361}362else if (first <= "3" && octal_len <= 2) return ++octal_len;363else if (first >= "4" && octal_len <= 1) return ++octal_len;364}365return false;366});367if (octal_len > 0) ch = String.fromCharCode(parseInt(ch, 8));368else ch = read_escaped_char(true);369}370else if (ch == quote) break;371ret += ch;372}373return token("string", ret);374});375376function read_line_comment() {377next();378var i = find("\n"), ret;379if (i == -1) {380ret = S.text.substr(S.pos);381S.pos = S.text.length;382} else {383ret = S.text.substring(S.pos, i);384S.pos = i;385}386return token("comment1", ret, true);387};388389var read_multiline_comment = with_eof_error("Unterminated multiline comment", function(){390next();391var i = find("*/", true);392var text = S.text.substring(S.pos, i);393var a = text.split("\n"), n = a.length;394// update stream position395S.pos = i + 2;396S.line += n - 1;397if (n > 1) S.col = a[n - 1].length;398else S.col += a[n - 1].length;399S.col += 2;400S.newline_before = S.newline_before || text.indexOf("\n") >= 0;401return token("comment2", text, true);402});403404function read_name() {405var backslash = false, name = "", ch, escaped = false, hex;406while ((ch = peek()) != null) {407if (!backslash) {408if (ch == "\\") escaped = backslash = true, next();409else if (is_identifier_char(ch)) name += next();410else break;411}412else {413if (ch != "u") parse_error("Expecting UnicodeEscapeSequence -- uXXXX");414ch = read_escaped_char();415if (!is_identifier_char(ch)) parse_error("Unicode char: " + ch.charCodeAt(0) + " is not valid in identifier");416name += ch;417backslash = false;418}419}420if (KEYWORDS(name) && escaped) {421hex = name.charCodeAt(0).toString(16).toUpperCase();422name = "\\u" + "0000".substr(hex.length) + hex + name.slice(1);423}424return name;425};426427var read_regexp = with_eof_error("Unterminated regular expression", function(regexp){428var prev_backslash = false, ch, in_class = false;429while ((ch = next(true))) if (prev_backslash) {430regexp += "\\" + ch;431prev_backslash = false;432} else if (ch == "[") {433in_class = true;434regexp += ch;435} else if (ch == "]" && in_class) {436in_class = false;437regexp += ch;438} else if (ch == "/" && !in_class) {439break;440} else if (ch == "\\") {441prev_backslash = true;442} else {443regexp += ch;444}445var mods = read_name();446return token("regexp", new RegExp(regexp, mods));447});448449function read_operator(prefix) {450function grow(op) {451if (!peek()) return op;452var bigger = op + peek();453if (OPERATORS(bigger)) {454next();455return grow(bigger);456} else {457return op;458}459};460return token("operator", grow(prefix || next()));461};462463function handle_slash() {464next();465var regex_allowed = S.regex_allowed;466switch (peek()) {467case "/":468S.comments_before.push(read_line_comment());469S.regex_allowed = regex_allowed;470return next_token();471case "*":472S.comments_before.push(read_multiline_comment());473S.regex_allowed = regex_allowed;474return next_token();475}476return S.regex_allowed ? read_regexp("") : read_operator("/");477};478479function handle_dot() {480next();481return is_digit(peek().charCodeAt(0))482? read_num(".")483: token("punc", ".");484};485486function read_word() {487var word = read_name();488return KEYWORDS_ATOM(word) ? token("atom", word)489: !KEYWORDS(word) ? token("name", word)490: OPERATORS(word) ? token("operator", word)491: token("keyword", word);492};493494function with_eof_error(eof_error, cont) {495return function(x) {496try {497return cont(x);498} catch(ex) {499if (ex === EX_EOF) parse_error(eof_error);500else throw ex;501}502};503};504505function next_token(force_regexp) {506if (force_regexp != null)507return read_regexp(force_regexp);508skip_whitespace();509start_token();510var ch = peek();511if (!ch) return token("eof");512var code = ch.charCodeAt(0);513switch (code) {514case 34: case 39: return read_string();515case 46: return handle_dot();516case 47: return handle_slash();517}518if (is_digit(code)) return read_num();519if (PUNC_CHARS(ch)) return token("punc", next());520if (OPERATOR_CHARS(ch)) return read_operator();521if (code == 92 || is_identifier_start(code)) return read_word();522parse_error("Unexpected character '" + ch + "'");523};524525next_token.context = function(nc) {526if (nc) S = nc;527return S;528};529530return next_token;531532};533534/* -----[ Parser (constants) ]----- */535536var UNARY_PREFIX = makePredicate([537"typeof",538"void",539"delete",540"--",541"++",542"!",543"~",544"-",545"+"546]);547548var UNARY_POSTFIX = makePredicate([ "--", "++" ]);549550var ASSIGNMENT = makePredicate([ "=", "+=", "-=", "/=", "*=", "%=", ">>=", "<<=", ">>>=", "|=", "^=", "&=" ]);551552var PRECEDENCE = (function(a, ret){553for (var i = 0, n = 1; i < a.length; ++i, ++n) {554var b = a[i];555for (var j = 0; j < b.length; ++j) {556ret[b[j]] = n;557}558}559return ret;560})(561[562["||"],563["&&"],564["|"],565["^"],566["&"],567["==", "===", "!=", "!=="],568["<", ">", "<=", ">=", "in", "instanceof"],569[">>", "<<", ">>>"],570["+", "-"],571["*", "/", "%"]572],573{}574);575576var STATEMENTS_WITH_LABELS = array_to_hash([ "for", "do", "while", "switch" ]);577578var ATOMIC_START_TOKEN = array_to_hash([ "atom", "num", "string", "regexp", "name" ]);579580/* -----[ Parser ]----- */581582function parse($TEXT, options) {583584options = defaults(options, {585strict : false,586filename : null,587toplevel : null588});589590var S = {591input : typeof $TEXT == "string" ? tokenizer($TEXT, options.filename) : $TEXT,592token : null,593prev : null,594peeked : null,595in_function : 0,596in_directives : true,597in_loop : 0,598labels : []599};600601S.token = next();602603function is(type, value) {604return is_token(S.token, type, value);605};606607function peek() { return S.peeked || (S.peeked = S.input()); };608609function next() {610S.prev = S.token;611if (S.peeked) {612S.token = S.peeked;613S.peeked = null;614} else {615S.token = S.input();616}617S.in_directives = S.in_directives && (618S.token.type == "string" || is("punc", ";")619);620return S.token;621};622623function prev() {624return S.prev;625};626627function croak(msg, line, col, pos) {628var ctx = S.input.context();629js_error(msg,630ctx.filename,631line != null ? line : ctx.tokline,632col != null ? col : ctx.tokcol,633pos != null ? pos : ctx.tokpos);634};635636function token_error(token, msg) {637croak(msg, token.line, token.col);638};639640function unexpected(token) {641if (token == null)642token = S.token;643token_error(token, "Unexpected token: " + token.type + " (" + token.value + ")");644};645646function expect_token(type, val) {647if (is(type, val)) {648return next();649}650token_error(S.token, "Unexpected token " + S.token.type + " «" + S.token.value + "»" + ", expected " + type + " «" + val + "»");651};652653function expect(punc) { return expect_token("punc", punc); };654655function can_insert_semicolon() {656return !options.strict && (657S.token.nlb || is("eof") || is("punc", "}")658);659};660661function semicolon() {662if (is("punc", ";")) next();663else if (!can_insert_semicolon()) unexpected();664};665666function parenthesised() {667expect("(");668var exp = expression(true);669expect(")");670return exp;671};672673function embed_tokens(parser) {674return function() {675var start = S.token;676var expr = parser();677var end = prev();678expr.start = start;679expr.end = end;680return expr;681};682};683684var statement = embed_tokens(function() {685var tmp;686if (is("operator", "/") || is("operator", "/=")) {687S.peeked = null;688S.token = S.input(S.token.value.substr(1)); // force regexp689}690switch (S.token.type) {691case "string":692var dir = S.in_directives, stat = simple_statement();693// XXXv2: decide how to fix directives694if (dir && stat.body instanceof AST_String && !is("punc", ","))695return new AST_Directive({ value: stat.body.value });696return stat;697case "num":698case "regexp":699case "operator":700case "atom":701return simple_statement();702703case "name":704return is_token(peek(), "punc", ":")705? labeled_statement()706: simple_statement();707708case "punc":709switch (S.token.value) {710case "{":711return new AST_BlockStatement({712start : S.token,713body : block_(),714end : prev()715});716case "[":717case "(":718return simple_statement();719case ";":720next();721return new AST_EmptyStatement();722default:723unexpected();724}725726case "keyword":727switch (tmp = S.token.value, next(), tmp) {728case "break":729return break_cont(AST_Break);730731case "continue":732return break_cont(AST_Continue);733734case "debugger":735semicolon();736return new AST_Debugger();737738case "do":739return new AST_Do({740body : in_loop(statement),741condition : (expect_token("keyword", "while"), tmp = parenthesised(), semicolon(), tmp)742});743744case "while":745return new AST_While({746condition : parenthesised(),747body : in_loop(statement)748});749750case "for":751return for_();752753case "function":754return function_(true);755756case "if":757return if_();758759case "return":760if (S.in_function == 0)761croak("'return' outside of function");762return new AST_Return({763value: ( is("punc", ";")764? (next(), null)765: can_insert_semicolon()766? null767: (tmp = expression(true), semicolon(), tmp) )768});769770case "switch":771return new AST_Switch({772expression : parenthesised(),773body : in_loop(switch_body_)774});775776case "throw":777if (S.token.nlb)778croak("Illegal newline after 'throw'");779return new AST_Throw({780value: (tmp = expression(true), semicolon(), tmp)781});782783case "try":784return try_();785786case "var":787return tmp = var_(), semicolon(), tmp;788789case "const":790return tmp = const_(), semicolon(), tmp;791792case "with":793return new AST_With({794expression : parenthesised(),795body : statement()796});797798default:799unexpected();800}801}802});803804function labeled_statement() {805var label = as_symbol(AST_Label);806if (find_if(function(l){ return l.name == label.name }, S.labels)) {807// ECMA-262, 12.12: An ECMAScript program is considered808// syntactically incorrect if it contains a809// LabelledStatement that is enclosed by a810// LabelledStatement with the same Identifier as label.811croak("Label " + label.name + " defined twice");812}813expect(":");814S.labels.push(label);815var stat = statement();816S.labels.pop();817return new AST_LabeledStatement({ body: stat, label: label });818};819820function simple_statement(tmp) {821return new AST_SimpleStatement({ body: (tmp = expression(true), semicolon(), tmp) });822};823824function break_cont(type) {825var label = null;826if (!can_insert_semicolon()) {827label = as_symbol(AST_LabelRef, true);828}829if (label != null) {830if (!find_if(function(l){ return l.name == label.name }, S.labels))831croak("Undefined label " + label.name);832}833else if (S.in_loop == 0)834croak(type.TYPE + " not inside a loop or switch");835semicolon();836return new type({ label: label });837};838839function for_() {840expect("(");841var init = null;842if (!is("punc", ";")) {843init = is("keyword", "var")844? (next(), var_(true))845: expression(true, true);846if (is("operator", "in")) {847if (init instanceof AST_Var && init.definitions.length > 1)848croak("Only one variable declaration allowed in for..in loop");849next();850return for_in(init);851}852}853return regular_for(init);854};855856function regular_for(init) {857expect(";");858var test = is("punc", ";") ? null : expression(true);859expect(";");860var step = is("punc", ")") ? null : expression(true);861expect(")");862return new AST_For({863init : init,864condition : test,865step : step,866body : in_loop(statement)867});868};869870function for_in(init) {871var lhs = init instanceof AST_Var ? init.definitions[0].name : null;872var obj = expression(true);873expect(")");874return new AST_ForIn({875init : init,876name : lhs,877object : obj,878body : in_loop(statement)879});880};881882var function_ = function(in_statement, ctor) {883var is_accessor = ctor === AST_Accessor;884var name = (is("name") ? as_symbol(in_statement885? AST_SymbolDefun886: is_accessor887? AST_SymbolAccessor888: AST_SymbolLambda)889: is_accessor && (is("string") || is("num")) ? as_atom_node()890: null);891if (in_statement && !name)892unexpected();893expect("(");894if (!ctor) ctor = in_statement ? AST_Defun : AST_Function;895return new ctor({896name: name,897argnames: (function(first, a){898while (!is("punc", ")")) {899if (first) first = false; else expect(",");900a.push(as_symbol(AST_SymbolFunarg));901}902next();903return a;904})(true, []),905body: (function(loop, labels){906++S.in_function;907S.in_directives = true;908S.in_loop = 0;909S.labels = [];910var a = block_();911--S.in_function;912S.in_loop = loop;913S.labels = labels;914return a;915})(S.in_loop, S.labels)916});917};918919function if_() {920var cond = parenthesised(), body = statement(), belse = null;921if (is("keyword", "else")) {922next();923belse = statement();924}925return new AST_If({926condition : cond,927body : body,928alternative : belse929});930};931932function block_() {933expect("{");934var a = [];935while (!is("punc", "}")) {936if (is("eof")) unexpected();937a.push(statement());938}939next();940return a;941};942943function switch_body_() {944expect("{");945var a = [], cur = null, branch = null, tmp;946while (!is("punc", "}")) {947if (is("eof")) unexpected();948if (is("keyword", "case")) {949if (branch) branch.end = prev();950cur = [];951branch = new AST_Case({952start : (tmp = S.token, next(), tmp),953expression : expression(true),954body : cur955});956a.push(branch);957expect(":");958}959else if (is("keyword", "default")) {960if (branch) branch.end = prev();961cur = [];962branch = new AST_Default({963start : (tmp = S.token, next(), expect(":"), tmp),964body : cur965});966a.push(branch);967}968else {969if (!cur) unexpected();970cur.push(statement());971}972}973if (branch) branch.end = prev();974next();975return a;976};977978function try_() {979var body = block_(), bcatch = null, bfinally = null;980if (is("keyword", "catch")) {981var start = S.token;982next();983expect("(");984var name = as_symbol(AST_SymbolCatch);985expect(")");986bcatch = new AST_Catch({987start : start,988argname : name,989body : block_(),990end : prev()991});992}993if (is("keyword", "finally")) {994var start = S.token;995next();996bfinally = new AST_Finally({997start : start,998body : block_(),999end : prev()1000});1001}1002if (!bcatch && !bfinally)1003croak("Missing catch/finally blocks");1004return new AST_Try({1005body : body,1006bcatch : bcatch,1007bfinally : bfinally1008});1009};10101011function vardefs(no_in, in_const) {1012var a = [];1013for (;;) {1014a.push(new AST_VarDef({1015start : S.token,1016name : as_symbol(in_const ? AST_SymbolConst : AST_SymbolVar),1017value : is("operator", "=") ? (next(), expression(false, no_in)) : null,1018end : prev()1019}));1020if (!is("punc", ","))1021break;1022next();1023}1024return a;1025};10261027var var_ = function(no_in) {1028return new AST_Var({1029start : prev(),1030definitions : vardefs(no_in, false),1031end : prev()1032});1033};10341035var const_ = function() {1036return new AST_Const({1037start : prev(),1038definitions : vardefs(false, true),1039end : prev()1040});1041};10421043var new_ = function() {1044var start = S.token;1045expect_token("operator", "new");1046var newexp = expr_atom(false), args;1047if (is("punc", "(")) {1048next();1049args = expr_list(")");1050} else {1051args = [];1052}1053return subscripts(new AST_New({1054start : start,1055expression : newexp,1056args : args,1057end : prev()1058}), true);1059};10601061function as_atom_node() {1062var tok = S.token, ret;1063switch (tok.type) {1064case "name":1065return as_symbol(AST_SymbolRef);1066case "num":1067ret = new AST_Number({ start: tok, end: tok, value: tok.value });1068break;1069case "string":1070ret = new AST_String({ start: tok, end: tok, value: tok.value });1071break;1072case "regexp":1073ret = new AST_RegExp({ start: tok, end: tok, value: tok.value });1074break;1075case "atom":1076switch (tok.value) {1077case "false":1078ret = new AST_False({ start: tok, end: tok });1079break;1080case "true":1081ret = new AST_True({ start: tok, end: tok });1082break;1083case "null":1084ret = new AST_Null({ start: tok, end: tok });1085break;1086}1087break;1088}1089next();1090return ret;1091};10921093var expr_atom = function(allow_calls) {1094if (is("operator", "new")) {1095return new_();1096}1097var start = S.token;1098if (is("punc")) {1099switch (start.value) {1100case "(":1101next();1102var ex = expression(true);1103ex.start = start;1104ex.end = S.token;1105expect(")");1106return subscripts(ex, allow_calls);1107case "[":1108return subscripts(array_(), allow_calls);1109case "{":1110return subscripts(object_(), allow_calls);1111}1112unexpected();1113}1114if (is("keyword", "function")) {1115next();1116var func = function_(false);1117func.start = start;1118func.end = prev();1119return subscripts(func, allow_calls);1120}1121if (ATOMIC_START_TOKEN[S.token.type]) {1122return subscripts(as_atom_node(), allow_calls);1123}1124unexpected();1125};11261127function expr_list(closing, allow_trailing_comma, allow_empty) {1128var first = true, a = [];1129while (!is("punc", closing)) {1130if (first) first = false; else expect(",");1131if (allow_trailing_comma && is("punc", closing)) break;1132if (is("punc", ",") && allow_empty) {1133a.push(new AST_Hole({ start: S.token, end: S.token }));1134} else {1135a.push(expression(false));1136}1137}1138next();1139return a;1140};11411142var array_ = embed_tokens(function() {1143expect("[");1144return new AST_Array({1145elements: expr_list("]", !options.strict, true)1146});1147});11481149var object_ = embed_tokens(function() {1150expect("{");1151var first = true, a = [];1152while (!is("punc", "}")) {1153if (first) first = false; else expect(",");1154if (!options.strict && is("punc", "}"))1155// allow trailing comma1156break;1157var start = S.token;1158var type = start.type;1159var name = as_property_name();1160if (type == "name" && !is("punc", ":")) {1161if (name == "get") {1162a.push(new AST_ObjectGetter({1163start : start,1164key : name,1165value : function_(false, AST_Accessor),1166end : prev()1167}));1168continue;1169}1170if (name == "set") {1171a.push(new AST_ObjectSetter({1172start : start,1173key : name,1174value : function_(false, AST_Accessor),1175end : prev()1176}));1177continue;1178}1179}1180expect(":");1181a.push(new AST_ObjectKeyVal({1182start : start,1183key : name,1184value : expression(false),1185end : prev()1186}));1187}1188next();1189return new AST_Object({ properties: a });1190});11911192function as_property_name() {1193var tmp = S.token;1194next();1195switch (tmp.type) {1196case "num":1197case "string":1198case "name":1199case "operator":1200case "keyword":1201case "atom":1202return tmp.value;1203default:1204unexpected();1205}1206};12071208function as_name() {1209var tmp = S.token;1210next();1211switch (tmp.type) {1212case "name":1213case "operator":1214case "keyword":1215case "atom":1216return tmp.value;1217default:1218unexpected();1219}1220};12211222function as_symbol(type, noerror) {1223if (!is("name")) {1224if (!noerror) croak("Name expected");1225return null;1226}1227var name = S.token.value;1228var sym = new (name == "this" ? AST_This : type)({1229name : String(S.token.value),1230start : S.token,1231end : S.token1232});1233next();1234return sym;1235};12361237var subscripts = function(expr, allow_calls) {1238var start = expr.start;1239if (is("punc", ".")) {1240next();1241return subscripts(new AST_Dot({1242start : start,1243expression : expr,1244property : as_name(),1245end : prev()1246}), allow_calls);1247}1248if (is("punc", "[")) {1249next();1250var prop = expression(true);1251expect("]");1252return subscripts(new AST_Sub({1253start : start,1254expression : expr,1255property : prop,1256end : prev()1257}), allow_calls);1258}1259if (allow_calls && is("punc", "(")) {1260next();1261return subscripts(new AST_Call({1262start : start,1263expression : expr,1264args : expr_list(")"),1265end : prev()1266}), true);1267}1268return expr;1269};12701271var maybe_unary = function(allow_calls) {1272var start = S.token;1273if (is("operator") && UNARY_PREFIX(start.value)) {1274next();1275var ex = make_unary(AST_UnaryPrefix, start.value, maybe_unary(allow_calls));1276ex.start = start;1277ex.end = prev();1278return ex;1279}1280var val = expr_atom(allow_calls);1281while (is("operator") && UNARY_POSTFIX(S.token.value) && !S.token.nlb) {1282val = make_unary(AST_UnaryPostfix, S.token.value, val);1283val.start = start;1284val.end = S.token;1285next();1286}1287return val;1288};12891290function make_unary(ctor, op, expr) {1291if ((op == "++" || op == "--") && !is_assignable(expr))1292croak("Invalid use of " + op + " operator");1293return new ctor({ operator: op, expression: expr });1294};12951296var expr_op = function(left, min_prec, no_in) {1297var op = is("operator") ? S.token.value : null;1298if (op == "in" && no_in) op = null;1299var prec = op != null ? PRECEDENCE[op] : null;1300if (prec != null && prec > min_prec) {1301next();1302var right = expr_op(maybe_unary(true), prec, no_in);1303return expr_op(new AST_Binary({1304start : left.start,1305left : left,1306operator : op,1307right : right,1308end : right.end1309}), min_prec, no_in);1310}1311return left;1312};13131314function expr_ops(no_in) {1315return expr_op(maybe_unary(true), 0, no_in);1316};13171318var maybe_conditional = function(no_in) {1319var start = S.token;1320var expr = expr_ops(no_in);1321if (is("operator", "?")) {1322next();1323var yes = expression(false);1324expect(":");1325return new AST_Conditional({1326start : start,1327condition : expr,1328consequent : yes,1329alternative : expression(false, no_in),1330end : peek()1331});1332}1333return expr;1334};13351336function is_assignable(expr) {1337if (!options.strict) return true;1338switch (expr[0]+"") {1339case "dot":1340case "sub":1341case "new":1342case "call":1343return true;1344case "name":1345return expr[1] != "this";1346}1347};13481349var maybe_assign = function(no_in) {1350var start = S.token;1351var left = maybe_conditional(no_in), val = S.token.value;1352if (is("operator") && ASSIGNMENT(val)) {1353if (is_assignable(left)) {1354next();1355return new AST_Assign({1356start : start,1357left : left,1358operator : val,1359right : maybe_assign(no_in),1360end : prev()1361});1362}1363croak("Invalid assignment");1364}1365return left;1366};13671368var expression = function(commas, no_in) {1369var start = S.token;1370var expr = maybe_assign(no_in);1371if (commas && is("punc", ",")) {1372next();1373return new AST_Seq({1374start : start,1375car : expr,1376cdr : expression(true, no_in),1377end : peek()1378});1379}1380return expr;1381};13821383function in_loop(cont) {1384++S.in_loop;1385var ret = cont();1386--S.in_loop;1387return ret;1388};13891390return (function(){1391var start = S.token;1392var body = [];1393while (!is("eof"))1394body.push(statement());1395var end = prev();1396var toplevel = options.toplevel;1397if (toplevel) {1398toplevel.body = toplevel.body.concat(body);1399toplevel.end = end;1400} else {1401toplevel = new AST_Toplevel({ start: start, body: body, end: end });1402}1403return toplevel;1404})();14051406};140714081409