Crockfords JSON Parser如何工作?

Koo*_*Inc 3 javascript parsing json

我已经盯着这里找到的代码了很长时间.这是Douglas Crockfords JSON解析函数(称为递归下降解析器).任何人都可以详细说明这个解析器的机制吗?我真的无法理解它.

How*_*ard 9

从逻辑上讲,您可以从第311行开始的实际解析函数开始(为清楚起见,省略了接收器部分).

function (source, reviver) {
    var result;

    text = source;
    at = 0;
    ch = ' ';
    result = value();
    white();
    if (ch) {
        error("Syntax error");
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

使用text源文本初始化函数全局变量,at使用位置初始化位置,ch使用空格初始化当前字符.之后它通过调用函数来解析一个值value.

要解析的每个对象都封装在一个函数本身中(在上面的例子中是值对象).有几种人:number,string,white,...).每个人基本上都以相同的方式工作.首先,我们将white看作基本的例子:

white = function () {

    // Skip whitespace.

    while (ch && ch <= ' ') {
        next();
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,chconstains始终是当前字符.此变量仅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();
    }
};
Run Code Online (Sandbox Code Playgroud)

它首先通过调用来解析空格white.请注意,ch现在包含要解析的当前字符.如果它是'{'我们现在将接下来的json对象并调用相应的函数object.相反,它是'['我们期望的json数组等等.

所有其他函数都以相同的方式构建:检查当前字符,确定接下来要做什么,然后解析此对象.

对象本身可以包含其他值,因此你会发现功能的间接递归调用valueobject一次.因此,通过递归调用所有json对象函数,它们实际上是从源字符串中解析的.