【问题标题】:How does Crockfords JSON Parser work?Crockfords JSON 解析器如何工作?
【发布时间】:2011-08-02 00:26:48
【问题描述】:

我盯着代码found here看了很久。它是 Douglas Crockfords JSON 解析函数(称为递归下降解析器)。谁能详细说明这个解析器的机制?我实在想不通。

【问题讨论】:

    标签: javascript json parsing


    【解决方案1】:

    从逻辑上讲,您可以从第 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解析一个值。

    每个要解析的对象都封装在一个函数本身中(在上面的例子中是值对象)。其中有几个:numberstringwhite,...)。每个都基本上以相同的方式工作。首先,我们将研究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 数组等等。

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

    对象本身可能包含其他值,因此您会再次在object 中找到函数value 的间接递归调用。因此,通过递归调用所有的 json 对象函数,它们实际上是从源字符串中解析出来的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 2015-12-26
      • 2011-03-10
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多