图片 1

yaml概述

yaml简单被机器解析,且人类可读。

那是一个谎言呢!

接纳冒号分隔键和值,用中写道表示数组。那就是有着的平整。

青年人都喜欢simple,那是句名言。可以去官网查阅详情,和别的解析库。

yaml示例

yaml:data 
seq: 
- 
  1:yi 
  2:er 
- 
  1:one
  2 :two

js的满贯代码

/**
 * yaml 解析简单实现
 */
var pos = 0;
/**
 * token
 * @returns
 */
function getNextToken() {
    if (pos == len) {
        return {
            type : "EOF"
        }
    }
    skipSpace();
    var c = yaml[pos];
    if (isString(c)) {
        return getString();
    }

    pos++;
    return {
        val : c,
        type : c
    };
}
/**
 * next but do not changed
 * @param n
 * @returns
 */
function peek(n) {
    skipSpace();
    return yaml[pos]
}
function skipSpace() {
    var c = yaml[pos];
    while (isSpace(c) && pos < len) {
        pos++;
        c = yaml[pos];
    }

}
function isSpace(c) {
    return c == ' ' || c == '\t' || c == '\n'

}
function getString() {
    var c = yaml[pos];
    var str = "";
        //没有考虑转义字符
    while (isString(c) && pos < len) {
        str += yaml[pos];
        pos++;
        c = yaml[pos];
    }

    return {
        val : str,
        type : "str"
    };
}
function isString(c) {
    return !isSpace(c) && !isSpecial(c);
}
function isSpecial(c) {
    return c == ':' || c == '-'
}


//can be simple type kv array
function getYaml() {
    var currentToken = getNextToken();

    while (currentToken.type != "EOF") {

        if (peek() == ':') {
            return getkv(currentToken)
        }
        if (currentToken.type == '-') {
            return getArray();
        }
                //string
        return currentToken.val;
    }

}
//键值对  其后不能是序列符号 
function getkv(currentToken) {
    var yaml = {};

    getNextToken();
    yaml[currentToken.val] = getYaml();
    while (peek() != "-"&&currentToken.type != "EOF") {

        currentToken = getNextToken();

        getNextToken();//check : or thorw error
        yaml[currentToken.val] = getYaml();

    }

    return yaml;
}
function getArray() {
    var a = [];
    a.push(getYaml());
    while (peek() == "-") {
        getNextToken();//check -
        a.push(getYaml());
    }
    return a;
}

var yaml = "yaml:data " + "seq: " + "- 1:yi 2:er " + " - 1:one 2 :two";

var len = yaml.length;
console.log(JSON.stringify(getYaml()))
//{"yaml":"data","seq":[{"1":"yi","2":"er"},{"1":"one","2":"two"}]}

一向不错误处理,也没有很好的包装,不过有详实的注明,简单改写和透亮。

json结果查看

{"yaml":"data",
 "seq":
      [  {"1":"yi",
           "2":"er"
         },
        {"1":"one",
         "2":"two"
        }
      ]
}

相比一下,小编个人感觉对于yaml,机器确实简单解析,而可读性并不算太好,可写性很好。不知情干什么近年来就火了。

尽量不写简单的示范了,或许方法不对,太无聊,得做点有意义的作业了[加了多少个刻钟班,却从不工应战果]。不领悟怎么从大体上上把屋项目,今后只得看看代码里面的底细,大约看不到思想层面的事物。

实质上我目前的概念就是不当的,没有设想空格分隔的状态,这里的空格是有语法意义的(多个空格的滑坡),类似python的语法。

对于给出的以身作则正好可以运作。复杂的数量会把前面的目标加在前边的靶子上,类似于if
if
else中的第一个else会被吞掉,其实好的做法是利用大括号({}),就是先后块中一句也丰富括号。

诈骗大家了,解析的结果其实是漏洞百出的。
那就是说以后哪些修改昵?首先设定七个空格的缩进,再依照缩进的构造举办读取。isSpace和peek需求改写。getYaml的时候语言增多参数记录当前的职责。说实话,我后来尝试改写代码,也远非正确分析,对本人来说不佳解析…。在网上看了瞬间,Python的解析,用了一下hack,才能正确。

理所当然那几个时候其实和人眼处理那样的事物是一律的,需求纪念功用前边空格数量。在尚未工具支持,当编辑和读书十分短的公文时,基本属于瞎猜,和读几十层的js闭包一样令人倾家荡产。

yaml的结尾一个优点,就是能够用流的格局分析,就是yaml文件的轻重大致可以没有限制,利用buf在尚未传递完全的时候也能够处理,对网络传递和文件读取越发有意义。那是因为从没从头符和得了符的原由,当然那一个的文件要有必然的格式必要,就是缩进不只怕太深。把json只怕xml的第二个伊始符和最终的完成符去掉,作者想大家也可以社团出那样的结构。看新闻讲Googlemap为了节省流量,用的就是团结规划的一种格式来传递数据,然后本人分析。当然任何人都可以依照作业来设计本人最合适的数目格式,可是大规模情况下如此的利益比缺点还多,仍然利用通用的可比妥当。

新近涌现出很多新东西,新技巧的快速入门的事物并无法令人深感尽兴,又不不难找到好的读书材料。
欢迎阅读本人的其他文章

相关文章

网站地图xml地图