json_parse Douglas Crockford2

JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス avaScriptをやり始めた人が理解したほうが良いJSONパーサのコード

by s_hiroshi

JavaScript

// JavaScriptをやり始めた人が理解したほうが良いJSONパーサのコード
// http://d.hatena.ne.jp/sifue/20120218/1329588477
// JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス
// 作者: Douglas Crockford,水野貴明
// 出版社/メーカー: オライリージャパン
// json_parse関数
// json_parse関数には即時実行により無名関数であるクロージャーが返る。
// 
json_parse = function() {
    var at, // 現在の文字のインデックス値
    ch, // 現在の文字
    text, // JSONデータ
    escape = {};

    // helperがいくつか
    var number = function() {
        // .... 
        // ....
        // value();
    };
    // var some = function() {
    //     .....
    //     value();
    // }
    //
    // other = function() {
    //     .....
    //     value();
    // };
    
    var value = function() {
        // 
    };
    return function(source) {
        var result;
        // 初期化
        text = source;
        // 
        result = value();
        return result;
    };
}();




var json_parse = function() {
    // JSONをパースして、JavaScriptのデータ構造を生成する関数
    // シンプルな再帰下降パーサで実装されています
    //
    // 実行例:
    // var obj = json_parse("{\"first\": \"Jerome\"}");
    //
    // 実行例(全ての値に操作を行うreviver関数ありの場合):
    // var obj =  json_parse("{\"first\": \"Jerome\"}",
    // function(key, value){if(key==='first') return 'hoge'; return value;});
    //
    // Chromeの方は、ツール > JavaScriptコンソールに、このソースを全て貼り付けて、
    // 実行例を実行して、すぐに動作確認できます。
    // グローバル変数を生成することを避けるため、以下の変数及び関数は、
    // 関数の中で定義されます
    var at, // 現在の文字のインデックス値
    ch, // 現在の文字
    escapee = {
        '"': '"',
        '\\': '\\',
        '/': '/',
        b: 'b',
        f: '\f',
        n: '\n',
        r: '\r',
        t: '\t'
    },

        text,


        error = function(m) {
            // 何か問題が発生した場合に、errorが呼び出す関数
            throw {
                name: 'SyntaxError',
                message: m,
                at: at,
                text: text
            };
        },


        next = function(c) {
            // 一文字次に進める関数
            // もしパラメーターcが指定されていたら、
            // それが現在の文字にマッチするのかを調べ、矛盾がありそうならエラーで終わらせます
            if (c && c !== ch)...