[Pkg-javascript-commits] [json-js] 04/18: "
Jonas Smedegaard
dr at jones.dk
Wed Aug 31 09:48:45 UTC 2016
This is an automated email from the git hooks/post-receive script.
js pushed a commit to branch master
in repository json-js.
commit 107fc93c94aa3a9c7b48548631593ecf3aac60d2
Author: Douglas Crockford <douglas at crockford.com>
Date: Tue May 10 13:20:28 2016 -0700
"
---
json2.js | 190 ++++++++++++-------------
json_parse.js | 188 ++++++++++++-------------
json_parse_state.js | 398 ++++++++++++++++++++++++++--------------------------
3 files changed, 389 insertions(+), 387 deletions(-)
diff --git a/json2.js b/json2.js
index bb18573..d4720c0 100644
--- a/json2.js
+++ b/json2.js
@@ -23,7 +23,7 @@
// of nested structures. If it is omitted, the text will
// be packed without extra whitespace. If it is a number,
// it will specify the number of spaces to indent at each
-// level. If it is a string (such as '\t' or ' '),
+// level. If it is a string (such as "\t" or " "),
// it contains the characters used to indent at each level.
// This method produces a JSON text from a JavaScript value.
// When an object value is found, if the object contains a toJSON
@@ -39,16 +39,16 @@
// Date.prototype.toJSON = function (key) {
// function f(n) {
// // Format integers to have at least two digits.
-// return n < 10
-// ? '0' + n
+// return (n < 10)
+// ? "0" + n
// : n;
// }
-// return this.getUTCFullYear() + '-' +
-// f(this.getUTCMonth() + 1) + '-' +
-// f(this.getUTCDate()) + 'T' +
-// f(this.getUTCHours()) + ':' +
-// f(this.getUTCMinutes()) + ':' +
-// f(this.getUTCSeconds()) + 'Z';
+// return this.getUTCFullYear() + "-" +
+// f(this.getUTCMonth() + 1) + "-" +
+// f(this.getUTCDate()) + "T" +
+// f(this.getUTCHours()) + ":" +
+// f(this.getUTCMinutes()) + ":" +
+// f(this.getUTCSeconds()) + "Z";
// };
// You can provide an optional replacer method. It will be passed the
@@ -79,15 +79,15 @@
// Example:
-// text = JSON.stringify(['e', {pluribus: 'unum'}]);
+// text = JSON.stringify(["e", {pluribus: "unum"}]);
// // text is '["e",{"pluribus":"unum"}]'
-// text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
+// text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
// // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
// text = JSON.stringify([new Date()], function (key, value) {
// return this[key] instanceof Date
-// ? 'Date(' + this[key] + ')'
+// ? "Date(" + this[key] + ")"
// : value;
// });
// // text is '["Date(---current time---)"]'
@@ -109,7 +109,7 @@
// myData = JSON.parse(text, function (key, value) {
// var a;
-// if (typeof value === 'string') {
+// if (typeof value === "string") {
// a =
// /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
// if (a) {
@@ -122,9 +122,9 @@
// myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
// var d;
-// if (typeof value === 'string' &&
-// value.slice(0, 5) === 'Date(' &&
-// value.slice(-1) === ')') {
+// if (typeof value === "string" &&
+// value.slice(0, 5) === "Date(" &&
+// value.slice(-1) === ")") {
// d = new Date(value.slice(5, -1));
// if (d) {
// return d;
@@ -151,12 +151,12 @@
// Create a JSON object only if one does not already exist. We create the
// methods in a closure to avoid creating global variables.
-if (typeof JSON !== 'object') {
+if (typeof JSON !== "object") {
JSON = {};
}
(function () {
- 'use strict';
+ "use strict";
var rx_one = /^[\],:{}\s]*$/;
var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
@@ -168,7 +168,7 @@ if (typeof JSON !== 'object') {
function f(n) {
// Format integers to have at least two digits.
return n < 10
- ? '0' + n
+ ? "0" + n
: n;
}
@@ -176,17 +176,17 @@ if (typeof JSON !== 'object') {
return this.valueOf();
}
- if (typeof Date.prototype.toJSON !== 'function') {
+ if (typeof Date.prototype.toJSON !== "function") {
Date.prototype.toJSON = function () {
return isFinite(this.valueOf())
- ? this.getUTCFullYear() + '-' +
- f(this.getUTCMonth() + 1) + '-' +
- f(this.getUTCDate()) + 'T' +
- f(this.getUTCHours()) + ':' +
- f(this.getUTCMinutes()) + ':' +
- f(this.getUTCSeconds()) + 'Z'
+ ? this.getUTCFullYear() + "-" +
+ f(this.getUTCMonth() + 1) + "-" +
+ f(this.getUTCDate()) + "T" +
+ f(this.getUTCHours()) + ":" +
+ f(this.getUTCMinutes()) + ":" +
+ f(this.getUTCSeconds()) + "Z"
: null;
};
@@ -210,13 +210,13 @@ if (typeof JSON !== 'object') {
rx_escapable.lastIndex = 0;
return rx_escapable.test(string)
- ? '"' + string.replace(rx_escapable, function (a) {
+ ? "\"" + string.replace(rx_escapable, function (a) {
var c = meta[a];
- return typeof c === 'string'
+ return typeof c === "string"
? c
- : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
- }) + '"'
- : '"' + string + '"';
+ : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
+ }) + "\""
+ : "\"" + string + "\"";
}
@@ -234,51 +234,51 @@ if (typeof JSON !== 'object') {
// If the value has a toJSON method, call it to obtain a replacement value.
- if (value && typeof value === 'object' &&
- typeof value.toJSON === 'function') {
+ if (value && typeof value === "object" &&
+ typeof value.toJSON === "function") {
value = value.toJSON(key);
}
// If we were called with a replacer function, then call the replacer to
// obtain a replacement value.
- if (typeof rep === 'function') {
+ if (typeof rep === "function") {
value = rep.call(holder, key, value);
}
// What happens next depends on the value's type.
switch (typeof value) {
- case 'string':
+ case "string":
return quote(value);
- case 'number':
+ case "number":
// JSON numbers must be finite. Encode non-finite numbers as null.
return isFinite(value)
? String(value)
- : 'null';
+ : "null";
- case 'boolean':
- case 'null':
+ case "boolean":
+ case "null":
// If the value is a boolean or null, convert it to a string. Note:
-// typeof null does not produce 'null'. The case is included here in
+// typeof null does not produce "null". The case is included here in
// the remote chance that this gets fixed someday.
return String(value);
-// If the type is 'object', we might be dealing with an object or an array or
+// If the type is "object", we might be dealing with an object or an array or
// null.
- case 'object':
+ case "object":
-// Due to a specification blunder in ECMAScript, typeof null is 'object',
+// Due to a specification blunder in ECMAScript, typeof null is "object",
// so watch out for that case.
if (!value) {
- return 'null';
+ return "null";
}
// Make an array to hold the partial results of stringifying this object value.
@@ -288,41 +288,41 @@ if (typeof JSON !== 'object') {
// Is the value an array?
- if (Object.prototype.toString.apply(value) === '[object Array]') {
+ if (Object.prototype.toString.apply(value) === "[object Array]") {
// The value is an array. Stringify every element. Use null as a placeholder
// for non-JSON values.
length = value.length;
for (i = 0; i < length; i += 1) {
- partial[i] = str(i, value) || 'null';
+ partial[i] = str(i, value) || "null";
}
// Join all of the elements together, separated with commas, and wrap them in
// brackets.
v = partial.length === 0
- ? '[]'
+ ? "[]"
: gap
- ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']'
- : '[' + partial.join(',') + ']';
+ ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]"
+ : "[" + partial.join(",") + "]";
gap = mind;
return v;
}
// If the replacer is an array, use it to select the members to be stringified.
- if (rep && typeof rep === 'object') {
+ if (rep && typeof rep === "object") {
length = rep.length;
for (i = 0; i < length; i += 1) {
- if (typeof rep[i] === 'string') {
+ if (typeof rep[i] === "string") {
k = rep[i];
v = str(k, value);
if (v) {
partial.push(quote(k) + (
gap
- ? ': '
- : ':'
+ ? ": "
+ : ":"
) + v);
}
}
@@ -337,8 +337,8 @@ if (typeof JSON !== 'object') {
if (v) {
partial.push(quote(k) + (
gap
- ? ': '
- : ':'
+ ? ": "
+ : ":"
) + v);
}
}
@@ -349,10 +349,10 @@ if (typeof JSON !== 'object') {
// and wrap them in braces.
v = partial.length === 0
- ? '{}'
+ ? "{}"
: gap
- ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}'
- : '{' + partial.join(',') + '}';
+ ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
+ : "{" + partial.join(",") + "}";
gap = mind;
return v;
}
@@ -360,15 +360,15 @@ if (typeof JSON !== 'object') {
// If the JSON object does not yet have a stringify method, give it one.
- if (typeof JSON.stringify !== 'function') {
+ if (typeof JSON.stringify !== "function") {
meta = { // table of character substitutions
- '\b': '\\b',
- '\t': '\\t',
- '\n': '\\n',
- '\f': '\\f',
- '\r': '\\r',
- '"': '\\"',
- '\\': '\\\\'
+ "\b": "\\b",
+ "\t": "\\t",
+ "\n": "\\n",
+ "\f": "\\f",
+ "\r": "\\r",
+ "\"": "\\\"",
+ "\\": "\\\\"
};
JSON.stringify = function (value, replacer, space) {
@@ -379,20 +379,20 @@ if (typeof JSON !== 'object') {
// produce text that is more easily readable.
var i;
- gap = '';
- indent = '';
+ gap = "";
+ indent = "";
// If the space parameter is a number, make an indent string containing that
// many spaces.
- if (typeof space === 'number') {
+ if (typeof space === "number") {
for (i = 0; i < space; i += 1) {
- indent += ' ';
+ indent += " ";
}
// If the space parameter is a string, it will be used as the indent string.
- } else if (typeof space === 'string') {
+ } else if (typeof space === "string") {
indent = space;
}
@@ -400,23 +400,23 @@ if (typeof JSON !== 'object') {
// Otherwise, throw an error.
rep = replacer;
- if (replacer && typeof replacer !== 'function' &&
- (typeof replacer !== 'object' ||
- typeof replacer.length !== 'number')) {
- throw new Error('JSON.stringify');
+ if (replacer && typeof replacer !== "function" &&
+ (typeof replacer !== "object" ||
+ typeof replacer.length !== "number")) {
+ throw new Error("JSON.stringify");
}
-// Make a fake root object containing our value under the key of ''.
+// Make a fake root object containing our value under the key of "".
// Return the result of stringifying the value.
- return str('', {'': value});
+ return str("", {"": value});
};
}
// If the JSON object does not yet have a parse method, give it one.
- if (typeof JSON.parse !== 'function') {
+ if (typeof JSON.parse !== "function") {
JSON.parse = function (text, reviver) {
// The parse method takes a text and an optional reviver function, and returns
@@ -432,7 +432,7 @@ if (typeof JSON !== 'object') {
var k;
var v;
var value = holder[key];
- if (value && typeof value === 'object') {
+ if (value && typeof value === "object") {
for (k in value) {
if (Object.prototype.hasOwnProperty.call(value, k)) {
v = walk(value, k);
@@ -456,51 +456,51 @@ if (typeof JSON !== 'object') {
rx_dangerous.lastIndex = 0;
if (rx_dangerous.test(text)) {
text = text.replace(rx_dangerous, function (a) {
- return '\\u' +
- ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
+ return "\\u" +
+ ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
});
}
// In the second stage, we run the text against regular expressions that look
-// for non-JSON patterns. We are especially concerned with '()' and 'new'
-// because they can cause invocation, and '=' because it can cause mutation.
+// for non-JSON patterns. We are especially concerned with "()" and "new"
+// because they can cause invocation, and "=" because it can cause mutation.
// But just to be safe, we want to reject all unexpected forms.
// We split the second stage into 4 regexp operations in order to work around
// crippling inefficiencies in IE's and Safari's regexp engines. First we
-// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
-// replace all simple value tokens with ']' characters. Third, we delete all
+// replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
+// replace all simple value tokens with "]" characters. Third, we delete all
// open brackets that follow a colon or comma or that begin the text. Finally,
-// we look to see that the remaining characters are only whitespace or ']' or
-// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
+// we look to see that the remaining characters are only whitespace or "]" or
+// "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
if (
rx_one.test(
text
- .replace(rx_two, '@')
- .replace(rx_three, ']')
- .replace(rx_four, '')
+ .replace(rx_two, "@")
+ .replace(rx_three, "]")
+ .replace(rx_four, "")
)
) {
// In the third stage we use the eval function to compile the text into a
-// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
+// JavaScript structure. The "{" operator is subject to a syntactic ambiguity
// in JavaScript: it can begin a block or an object literal. We wrap the text
// in parens to eliminate the ambiguity.
- j = eval('(' + text + ')');
+ j = eval("(" + text + ")");
// In the optional fourth stage, we recursively walk the new structure, passing
// each name/value pair to a reviver function for possible transformation.
- return typeof reviver === 'function'
- ? walk({'': j}, '')
+ return (typeof reviver === "function")
+ ? walk({"": j}, "")
: j;
}
// If the text is not JSON parseable, then a SyntaxError is thrown.
- throw new SyntaxError('JSON.parse');
+ throw new SyntaxError("JSON.parse");
};
}
}());
diff --git a/json_parse.js b/json_parse.js
index 359015a..6fcb796 100644
--- a/json_parse.js
+++ b/json_parse.js
@@ -1,6 +1,6 @@
/*
json_parse.js
- 2015-05-02
+ 2016-05-02
Public Domain.
@@ -25,7 +25,7 @@
myData = json_parse(text, function (key, value) {
var a;
- if (typeof value === 'string') {
+ if (typeof value === "string") {
a =
/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
if (a) {
@@ -67,14 +67,14 @@ var json_parse = (function () {
var at; // The index of the current character
var ch; // The current character
var escapee = {
- '"': '"',
- '\\': '\\',
- '/': '/',
- b: '\b',
- f: '\f',
- n: '\n',
- r: '\r',
- t: '\t'
+ "\"": "\"",
+ "\\": "\\",
+ "/": "/",
+ b: "\b",
+ f: "\f",
+ n: "\n",
+ r: "\r",
+ t: "\t"
};
var text;
@@ -83,7 +83,7 @@ var json_parse = (function () {
// Call error when something is wrong.
throw {
- name: 'SyntaxError',
+ name: "SyntaxError",
message: m,
at: at,
text: text
@@ -110,40 +110,40 @@ var json_parse = (function () {
// Parse a number value.
- var number;
- var string = '';
+ var value;
+ var string = "";
- if (ch === '-') {
- string = '-';
- next('-');
+ if (ch === "-") {
+ string = "-";
+ next("-");
}
- while (ch >= '0' && ch <= '9') {
+ while (ch >= "0" && ch <= "9") {
string += ch;
next();
}
- if (ch === '.') {
- string += '.';
- while (next() && ch >= '0' && ch <= '9') {
+ if (ch === ".") {
+ string += ".";
+ while (next() && ch >= "0" && ch <= "9") {
string += ch;
}
}
- if (ch === 'e' || ch === 'E') {
+ if (ch === "e" || ch === "E") {
string += ch;
next();
- if (ch === '-' || ch === '+') {
+ if (ch === "-" || ch === "+") {
string += ch;
next();
}
- while (ch >= '0' && ch <= '9') {
+ while (ch >= "0" && ch <= "9") {
string += ch;
next();
}
}
- number = +string;
- if (!isFinite(number)) {
+ value = +string;
+ if (!isFinite(value)) {
error("Bad number");
} else {
- return number;
+ return value;
}
};
@@ -153,20 +153,20 @@ var json_parse = (function () {
var hex;
var i;
- var string = '';
+ var value = "";
var uffff;
// When parsing for string values, we must look for " and \ characters.
- if (ch === '"') {
+ if (ch === "\"") {
while (next()) {
- if (ch === '"') {
+ if (ch === "\"") {
next();
- return string;
+ return value;
}
- if (ch === '\\') {
+ if (ch === "\\") {
next();
- if (ch === 'u') {
+ if (ch === "u") {
uffff = 0;
for (i = 0; i < 4; i += 1) {
hex = parseInt(next(), 16);
@@ -175,14 +175,14 @@ var json_parse = (function () {
}
uffff = uffff * 16 + hex;
}
- string += String.fromCharCode(uffff);
- } else if (typeof escapee[ch] === 'string') {
- string += escapee[ch];
+ value += String.fromCharCode(uffff);
+ } else if (typeof escapee[ch] === "string") {
+ value += escapee[ch];
} else {
break;
}
} else {
- string += ch;
+ value += ch;
}
}
}
@@ -193,7 +193,7 @@ var json_parse = (function () {
// Skip whitespace.
- while (ch && ch <= ' ') {
+ while (ch && ch <= " ") {
next();
}
};
@@ -203,24 +203,24 @@ var json_parse = (function () {
// true, false, or null.
switch (ch) {
- case 't':
- next('t');
- next('r');
- next('u');
- next('e');
+ case "t":
+ next("t");
+ next("r");
+ next("u");
+ next("e");
return true;
- case 'f':
- next('f');
- next('a');
- next('l');
- next('s');
- next('e');
+ case "f":
+ next("f");
+ next("a");
+ next("l");
+ next("s");
+ next("e");
return false;
- case 'n':
- next('n');
- next('u');
- next('l');
- next('l');
+ case "n":
+ next("n");
+ next("u");
+ next("l");
+ next("l");
return null;
}
error("Unexpected '" + ch + "'");
@@ -232,23 +232,23 @@ var json_parse = (function () {
// Parse an array value.
- var array = [];
+ var arr = [];
- if (ch === '[') {
- next('[');
+ if (ch === "[") {
+ next("[");
white();
- if (ch === ']') {
- next(']');
- return array; // empty array
+ if (ch === "]") {
+ next("]");
+ return arr; // empty array
}
while (ch) {
- array.push(value());
+ arr.push(value());
white();
- if (ch === ']') {
- next(']');
- return array;
+ if (ch === "]") {
+ next("]");
+ return arr;
}
- next(',');
+ next(",");
white();
}
}
@@ -260,29 +260,29 @@ var json_parse = (function () {
// Parse an object value.
var key;
- var object = {};
+ var obj = {};
- if (ch === '{') {
- next('{');
+ if (ch === "{") {
+ next("{");
white();
- if (ch === '}') {
- next('}');
- return object; // empty object
+ if (ch === "}") {
+ next("}");
+ return obj; // empty object
}
while (ch) {
key = string();
white();
- next(':');
- if (Object.hasOwnProperty.call(object, key)) {
- error('Duplicate key "' + key + '"');
+ next(":");
+ if (Object.hasOwnProperty.call(obj, key)) {
+ error("Duplicate key '" + key + "'");
}
- object[key] = value();
+ obj[key] = value();
white();
- if (ch === '}') {
- next('}');
- return object;
+ if (ch === "}") {
+ next("}");
+ return obj;
}
- next(',');
+ next(",");
white();
}
}
@@ -296,16 +296,16 @@ var json_parse = (function () {
white();
switch (ch) {
- case '{':
+ case "{":
return object();
- case '[':
+ case "[":
return array();
- case '"':
+ case "\"":
return string();
- case '-':
+ case "-":
return number();
default:
- return (ch >= '0' && ch <= '9')
+ return (ch >= "0" && ch <= "9")
? number()
: word();
}
@@ -319,7 +319,7 @@ var json_parse = (function () {
text = source;
at = 0;
- ch = ' ';
+ ch = " ";
result = value();
white();
if (ch) {
@@ -332,25 +332,25 @@ var json_parse = (function () {
// in an empty key. If there is not a reviver function, we simply return the
// result.
- return (typeof reviver === 'function')
+ return (typeof reviver === "function")
? (function walk(holder, key) {
var k;
var v;
- var value = holder[key];
- if (value && typeof value === 'object') {
- for (k in value) {
- if (Object.prototype.hasOwnProperty.call(value, k)) {
- v = walk(value, k);
+ var val = holder[key];
+ if (val && typeof val === "object") {
+ for (k in val) {
+ if (Object.prototype.hasOwnProperty.call(val, k)) {
+ v = walk(val, k);
if (v !== undefined) {
- value[k] = v;
+ val[k] = v;
} else {
- delete value[k];
+ delete val[k];
}
}
}
}
- return reviver.call(holder, key, value);
- }({'': result}, ''))
+ return reviver.call(holder, key, val);
+ }({"": result}, ""))
: result;
};
}());
diff --git a/json_parse_state.js b/json_parse_state.js
index beb0f97..5241e45 100644
--- a/json_parse_state.js
+++ b/json_parse_state.js
@@ -1,6 +1,6 @@
/*
json_parse_state.js
- 2015-05-02
+ 2016-05-02
Public Domain.
@@ -25,7 +25,7 @@
myData = json_parse(text, function (key, value) {
var a;
- if (typeof value === 'string') {
+ if (typeof value === "string") {
a =
/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
if (a) {
@@ -61,7 +61,7 @@ var json_parse = (function () {
// This function creates a JSON parse function that uses a state machine rather
// than the dangerous eval function to parse a JSON text.
- var state, // The state of the parser, one of
+ var state; // The state of the parser, one of
// 'go' The starting state
// 'ok' The final, accepting state
// 'firstokey' Ready for the first key of the object or
@@ -74,214 +74,214 @@ var json_parse = (function () {
// an empty array
// 'avalue' Ready for the next value of an array
// 'acomma' Ready for a comma or closing ]
- stack, // The stack, for controlling nesting.
- container, // The current container object or array
- key, // The current key
- value, // The current value
- escapes = { // Escapement translation table
- '\\': '\\',
- '"': '"',
- '/': '/',
- 't': '\t',
- 'n': '\n',
- 'r': '\r',
- 'f': '\f',
- 'b': '\b'
+ var stack; // The stack, for controlling nesting.
+ var container; // The current container object or array
+ var key; // The current key
+ var value; // The current value
+ var escapes = { // Escapement translation table
+ "\\": "\\",
+ "\"": "\"",
+ "/": "/",
+ "t": "\t",
+ "n": "\n",
+ "r": "\r",
+ "f": "\f",
+ "b": "\b"
+ };
+ var string = { // The actions for string tokens
+ go: function () {
+ state = "ok";
+ },
+ firstokey: function () {
+ key = value;
+ state = "colon";
+ },
+ okey: function () {
+ key = value;
+ state = "colon";
+ },
+ ovalue: function () {
+ state = "ocomma";
+ },
+ firstavalue: function () {
+ state = "acomma";
+ },
+ avalue: function () {
+ state = "acomma";
+ }
+ };
+ var number = { // The actions for number tokens
+ go: function () {
+ state = "ok";
+ },
+ ovalue: function () {
+ state = "ocomma";
},
- string = { // The actions for string tokens
+ firstavalue: function () {
+ state = "acomma";
+ },
+ avalue: function () {
+ state = "acomma";
+ }
+ };
+ var action = {
+
+// The action table describes the behavior of the machine. It contains an
+// object for each token. Each object contains a method that is called when
+// a token is matched in a state. An object will lack a method for illegal
+// states.
+
+ "{": {
go: function () {
- state = 'ok';
- },
- firstokey: function () {
- key = value;
- state = 'colon';
- },
- okey: function () {
- key = value;
- state = 'colon';
+ stack.push({state: "ok"});
+ container = {};
+ state = "firstokey";
},
ovalue: function () {
- state = 'ocomma';
+ stack.push({container: container, state: "ocomma", key: key});
+ container = {};
+ state = "firstokey";
},
firstavalue: function () {
- state = 'acomma';
+ stack.push({container: container, state: "acomma"});
+ container = {};
+ state = "firstokey";
},
avalue: function () {
- state = 'acomma';
+ stack.push({container: container, state: "acomma"});
+ container = {};
+ state = "firstokey";
}
},
- number = { // The actions for number tokens
+ "}": {
+ firstokey: function () {
+ var pop = stack.pop();
+ value = container;
+ container = pop.container;
+ key = pop.key;
+ state = pop.state;
+ },
+ ocomma: function () {
+ var pop = stack.pop();
+ container[key] = value;
+ value = container;
+ container = pop.container;
+ key = pop.key;
+ state = pop.state;
+ }
+ },
+ "[": {
go: function () {
- state = 'ok';
+ stack.push({state: "ok"});
+ container = [];
+ state = "firstavalue";
},
ovalue: function () {
- state = 'ocomma';
+ stack.push({container: container, state: "ocomma", key: key});
+ container = [];
+ state = "firstavalue";
},
firstavalue: function () {
- state = 'acomma';
+ stack.push({container: container, state: "acomma"});
+ container = [];
+ state = "firstavalue";
},
avalue: function () {
- state = 'acomma';
+ stack.push({container: container, state: "acomma"});
+ container = [];
+ state = "firstavalue";
}
},
- action = {
-
-// The action table describes the behavior of the machine. It contains an
-// object for each token. Each object contains a method that is called when
-// a token is matched in a state. An object will lack a method for illegal
-// states.
-
- '{': {
- go: function () {
- stack.push({state: 'ok'});
- container = {};
- state = 'firstokey';
- },
- ovalue: function () {
- stack.push({container: container, state: 'ocomma', key: key});
- container = {};
- state = 'firstokey';
- },
- firstavalue: function () {
- stack.push({container: container, state: 'acomma'});
- container = {};
- state = 'firstokey';
- },
- avalue: function () {
- stack.push({container: container, state: 'acomma'});
- container = {};
- state = 'firstokey';
- }
+ "]": {
+ firstavalue: function () {
+ var pop = stack.pop();
+ value = container;
+ container = pop.container;
+ key = pop.key;
+ state = pop.state;
},
- '}': {
- firstokey: function () {
- var pop = stack.pop();
- value = container;
- container = pop.container;
- key = pop.key;
- state = pop.state;
- },
- ocomma: function () {
- var pop = stack.pop();
- container[key] = value;
- value = container;
- container = pop.container;
- key = pop.key;
- state = pop.state;
+ acomma: function () {
+ var pop = stack.pop();
+ container.push(value);
+ value = container;
+ container = pop.container;
+ key = pop.key;
+ state = pop.state;
+ }
+ },
+ ":": {
+ colon: function () {
+ if (Object.hasOwnProperty.call(container, key)) {
+ throw new SyntaxError("Duplicate key '" + key + "\"");
}
+ state = "ovalue";
+ }
+ },
+ ",": {
+ ocomma: function () {
+ container[key] = value;
+ state = "okey";
},
- '[': {
- go: function () {
- stack.push({state: 'ok'});
- container = [];
- state = 'firstavalue';
- },
- ovalue: function () {
- stack.push({container: container, state: 'ocomma', key: key});
- container = [];
- state = 'firstavalue';
- },
- firstavalue: function () {
- stack.push({container: container, state: 'acomma'});
- container = [];
- state = 'firstavalue';
- },
- avalue: function () {
- stack.push({container: container, state: 'acomma'});
- container = [];
- state = 'firstavalue';
- }
+ acomma: function () {
+ container.push(value);
+ state = "avalue";
+ }
+ },
+ "true": {
+ go: function () {
+ value = true;
+ state = "ok";
},
- ']': {
- firstavalue: function () {
- var pop = stack.pop();
- value = container;
- container = pop.container;
- key = pop.key;
- state = pop.state;
- },
- acomma: function () {
- var pop = stack.pop();
- container.push(value);
- value = container;
- container = pop.container;
- key = pop.key;
- state = pop.state;
- }
+ ovalue: function () {
+ value = true;
+ state = "ocomma";
},
- ':': {
- colon: function () {
- if (Object.hasOwnProperty.call(container, key)) {
- throw new SyntaxError('Duplicate key "' + key + '"');
- }
- state = 'ovalue';
- }
+ firstavalue: function () {
+ value = true;
+ state = "acomma";
},
- ',': {
- ocomma: function () {
- container[key] = value;
- state = 'okey';
- },
- acomma: function () {
- container.push(value);
- state = 'avalue';
- }
+ avalue: function () {
+ value = true;
+ state = "acomma";
+ }
+ },
+ "false": {
+ go: function () {
+ value = false;
+ state = "ok";
},
- 'true': {
- go: function () {
- value = true;
- state = 'ok';
- },
- ovalue: function () {
- value = true;
- state = 'ocomma';
- },
- firstavalue: function () {
- value = true;
- state = 'acomma';
- },
- avalue: function () {
- value = true;
- state = 'acomma';
- }
+ ovalue: function () {
+ value = false;
+ state = "ocomma";
},
- 'false': {
- go: function () {
- value = false;
- state = 'ok';
- },
- ovalue: function () {
- value = false;
- state = 'ocomma';
- },
- firstavalue: function () {
- value = false;
- state = 'acomma';
- },
- avalue: function () {
- value = false;
- state = 'acomma';
- }
+ firstavalue: function () {
+ value = false;
+ state = "acomma";
},
- 'null': {
- go: function () {
- value = null;
- state = 'ok';
- },
- ovalue: function () {
- value = null;
- state = 'ocomma';
- },
- firstavalue: function () {
- value = null;
- state = 'acomma';
- },
- avalue: function () {
- value = null;
- state = 'acomma';
- }
+ avalue: function () {
+ value = false;
+ state = "acomma";
}
- };
+ },
+ "null": {
+ go: function () {
+ value = null;
+ state = "ok";
+ },
+ ovalue: function () {
+ value = null;
+ state = "ocomma";
+ },
+ firstavalue: function () {
+ value = null;
+ state = "acomma";
+ },
+ avalue: function () {
+ value = null;
+ state = "acomma";
+ }
+ }
+ };
function debackslashify(text) {
@@ -299,12 +299,12 @@ var json_parse = (function () {
// A regular expression is used to extract tokens from the JSON text.
// The extraction process is cautious.
- var result,
- tx = /^[\u0020\t\n\r]*(?:([,:\[\]{}]|true|false|null)|(-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)|"((?:[^\r\n\t\\\"]|\\(?:["\\\/trnfb]|u[0-9a-fA-F]{4}))*)")/;
+ var result;
+ var tx = /^[\u0020\t\n\r]*(?:([,:\[\]{}]|true|false|null)|(-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)|"((?:[^\r\n\t\\\"]|\\(?:["\\\/trnfb]|u[0-9a-fA-F]{4}))*)")/;
// Set the starting state.
- state = 'go';
+ state = "go";
// The stack records the container, key, and state for each object or array
// that contains another object or array while processing nested structures.
@@ -365,14 +365,14 @@ var json_parse = (function () {
state = e;
}
-// The parsing is finished. If we are not in the final 'ok' state, or if the
+// The parsing is finished. If we are not in the final "ok" state, or if the
// remaining source contains anything except whitespace, then we did not have
//a well-formed JSON text.
- if (state !== 'ok' || (/[^\u0020\t\n\r]/.test(source))) {
- throw state instanceof SyntaxError
+ if (state !== "ok" || (/[^\u0020\t\n\r]/.test(source))) {
+ throw (state instanceof SyntaxError)
? state
- : new SyntaxError('JSON');
+ : new SyntaxError("JSON");
}
// If there is a reviver function, we recursively walk the new structure,
@@ -381,23 +381,25 @@ var json_parse = (function () {
// value in an empty key. If there is not a reviver function, we simply return
// that value.
- return typeof reviver === 'function'
+ return (typeof reviver === "function")
? (function walk(holder, key) {
- var k, v, value = holder[key];
- if (value && typeof value === 'object') {
+ var k;
+ var v;
+ var val = holder[key];
+ if (val && typeof val === "object") {
for (k in value) {
- if (Object.prototype.hasOwnProperty.call(value, k)) {
- v = walk(value, k);
+ if (Object.prototype.hasOwnProperty.call(val, k)) {
+ v = walk(val, k);
if (v !== undefined) {
- value[k] = v;
+ val[k] = v;
} else {
- delete value[k];
+ delete val[k];
}
}
}
}
- return reviver.call(holder, key, value);
- }({'': value}, ''))
+ return reviver.call(holder, key, val);
+ }({"": value}, ""))
: value;
};
}());
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/json-js.git
More information about the Pkg-javascript-commits
mailing list