Как работает Crockfords JSON Parser? - PullRequest
3 голосов
/ 09 апреля 2011

Я долго смотрел на код , найденный здесь . Это функция JSON-анализа Дугласа Крокфорда (называемая анализатором рекурсивного спуска ). Кто-нибудь может уточнить механику этого парсера? Я действительно не могу обдумать это.

1 Ответ

9 голосов
/ 09 апреля 2011

Логически вы можете начать с фактических функций разбора, которые начинаются со строки 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, они фактически анализируются из исходной строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...