ucg 0.2.0

A configuration generation grammar.
Documentation
// Simple Comparisons
let one = 1;
let two = 2;
let foo = "foo";
let bar = "bar";
let tpl1 = {
    foo = "bar",
    one = 1
};
let tpl2 = tpl1{};
let tpl3 = {
    bar = "foo",
    two = 1
};
let list = [1, 2, 3];
let list2 = list;
let list3 = [1, 2];

assert |one == one|;
assert |one == one|;
assert |one >= one|;
assert |two > one|;
assert |two >= two|;
assert |tpl1 == tpl2|;
assert |tpl1 != tpl3|;
assert |list == list2|;
assert |list != list3|;

// Deep Comparisons
let tpl4 = {
    foo = "bar",
    lst = [1, 2, 3],
    inner = {
        fld = "value",
    }
};
let copy = tpl4;
let extra = tpl4{one = 1};
let less = {
    foo = "bar"
};

assert |tpl4.inner == copy.inner|;
assert |tpl4.inner.fld == copy.inner.fld|;
assert |tpl4.lst == copy.lst|;
assert |tpl4.foo == copy.foo|;
assert |tpl4 == copy|;
assert |tpl4 != extra|;
assert |tpl4 != less|;

// Expression comparisons
assert |2 == 1+1|;
assert |(1+1) == 2|;
assert |(1+1) == (1+1)|;
let want = "foo";
assert |select want, 1, { foo=2, } == 2|;