Логически вы можете начать с фактических функций разбора, которые начинаются со строки 311 (для ясности опущена часть приемника).
function (source, reviver) {
var result;
text = source;
at = 0;
ch = ' ';
result = value();
white();
if (ch) {
error("Syntax error");
}
return result;
}
Инициализирует глобальные переменные функции text
с исходным текстом, позицию at
с позицией и текущий символ ch
с пробелом. После этого он анализирует значение, вызывая функцию value
.
Каждый анализируемый объект инкапсулируется в самой функции (в приведенном выше примере объект значения). Их несколько: number
, string
, white
, ...). Каждый из них работает в основном одинаково. Сначала мы рассмотрим white
в качестве основного примера:
white = function () {
// Skip whitespace.
while (ch && ch <= ' ') {
next();
}
}
Обратите внимание, что ch
всегда содержит текущий символ. Эта переменная обновляется только на next
, который читается в следующем. Это можно увидеть в white
, где каждый пробел съедается вызовом next
. Таким образом, после вызова этой функции первый непробельный символ будет находиться в переменной ch
.
Давайте рассмотрим более сложный пример value
:
value = function () {
// Parse a JSON value. It could be an object, an array, a string, a number,
// or a word.
white();
switch (ch) {
case '{':
return object();
case '[':
return array();
case '"':
return string();
case '-':
return number();
default:
return ch >= '0' && ch <= '9' ? number() : word();
}
};
Сначала он анализирует пробелы, вызывая white
. Обратите внимание, что ch
теперь содержит текущий символ для анализа. Если это '{'
, мы теперь, когда объект json будет следующим, и вызовем соответствующую функцию object
. Если вместо этого это '['
, мы ожидаем массив json и т. Д.
Все остальные функции создаются аналогичным образом: проверяют текущий символ, решают, что будет дальше, а затем анализируют этот объект.
Сам объект может содержать другие значения, и поэтому вы снова найдете косвенный рекурсивный вызов функции value
в object
. Таким образом, рекурсивно вызывая все объектные функции json, они фактически анализируются из исходной строки.