Crockfords JSON 解析器如何工作?

发布于 2024-10-31 17:13:41 字数 192 浏览 0 评论 0原文

我盯着在这里找到的代码看了很长时间。它是 Douglas Crockfords JSON 解析函数(称为递归下降解析器)。谁能详细说明这个解析器的机制吗?我真的无法理解它。

I have stared for a long time at the code found here. It's Douglas Crockfords JSON-parsing function (called a recursive descent parser). Can anyone elaborate on the mechanics of this parser? I really can't get my head around it.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

贩梦商人 2024-11-07 17:13:41

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

每个要解析的对象都封装在函数本身中(在上面的示例中是值对象)。其中有几个:数字字符串白色,...)。每个都基本上以相同的方式工作。首先,我们将把 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 对象函数,它们实际上是从源字符串中解析出来的。

Logically you may start with the actual parse functions which starts at line 311 (omitted the receiver part for clarity).

function (source, reviver) {
    var result;

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

    return result;
}

Initializes function global variables text with the source text, position at with position and current character ch with a space. Afterwards it parses a value by calling function value.

Each object to be parsed is encapsulated in a function itself (in above example the value object). There are several of them: number, string, white, ...). Each one does basically work in the same way. First we'll look into white as basic example:

white = function () {

    // Skip whitespace.

    while (ch && ch <= ' ') {
        next();
    }
}

Note that ch constains always the current character. This variable is only updated by next which reads in the next one. This can be seen within white where each whitespace is eaten by a call to next. Thus after calling this function the first non-space character will be in variable ch.

Let's look for a more complex example 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();
    }
};

It first parses whitespaces by calling white. Note that ch now contains the current character to be parsed. If it is a '{' we'll now that a json object is coming next and call the corresponding function object. If instead it is a '[' we expect an json array and so on.

All other functions are build the same way: inspect the current character, decide what has to come next and then parse this object.

The object itself may contain other values and therefore you'll find an indirect recursive call of function value in object again. Thus by recursively calling all the json object functions they are actually parsed from the source string.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文