1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
14 * The Original Code is the Narcissus JavaScript engine.
16 * The Initial Developer of the Original Code is
17 * Brendan Eich <brendan@mozilla.org>.
18 * Portions created by the Initial Developer are Copyright (C) 2004
19 * the Initial Developer. All Rights Reserved.
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
35 * ***** END LICENSE BLOCK ***** */
38 * Narcissus - JS implemented in JS.
40 * Well-known constants and lookup tables. Many consts are generated from the
41 * tokens table via eval to minimize redundancy, so consumers must be compiled
42 * separately to take advantage of the simple switch-case constant propagation
43 * done by SpiderMonkey.
51 // Operators and punctuators. Some pair-wise order matters, e.g. (+, -)
52 // and (UNARY_PLUS, UNARY_MINUS).
56 "?", ":", "CONDITIONAL",
62 "==", "!=", "===", "!==",
67 "!", "~", "UNARY_PLUS", "UNARY_MINUS",
74 // Nonterminal tree node type codes.
75 "SCRIPT", "BLOCK", "LABEL", "FOR_IN", "CALL", "NEW_WITH_ARGS", "INDEX",
76 "ARRAY_INIT", "OBJECT_INIT", "PROPERTY_INIT", "GETTER", "SETTER",
80 "IDENTIFIER", "NUMBER", "STRING", "REGEXP",
84 "case", "catch", "const", "continue",
85 "debugger", "default", "delete", "do",
87 "false", "finally", "for", "function",
88 "if", "in", "instanceof",
92 "this", "throw", "true", "try", "typeof",
97 // Operator and punctuator mapping from token to tree node type name.
98 // NB: superstring tokens (e.g., ++) must come before their substring token
99 // counterparts (+ in the example), so that the opRegExp regular expression
100 // synthesized from this list makes the longest possible match.
135 ']': "RIGHT_BRACKET",
142 // Hash of keyword identifier to tokens index. NB: we must null __proto__ to
143 // avoid toString, etc. namespace pollution.
144 var keywords
= {__proto__
: null};
146 // Define const END, etc., based on the token names. Also map name to index.
147 var consts
= "const ";
148 for (var i
= 0, j
= tokens
.length
; i
< j
; i
++) {
152 if (/^[a-z]/.test(t
)) {
153 consts
+= t
.toUpperCase();
156 consts
+= (/^\W/.test(t
) ? opTypeNames
[t
] : t
);
163 // Map assignment operators to their indexes in the tokens array.
164 var assignOps
= ['|', '^', '&', '<<', '>>', '>>>', '+', '-', '*', '/', '%'];
166 for (i
= 0, j
= assignOps
.length
; i
< j
; i
++) {
168 assignOps
[t
] = tokens
[t
];