main -> rules eol materials {% (d) => { return { rules: d[0], materials: d[2], } } %} rules -> (rule eol:?):+ {% d=> { return d[0].map(x=> x[0]) } %} rule -> rulename _ "{" _ conditions _ "," _ rulename _ "}" {% d=>{ return { name: d[0], rules: d[4], always: d[8], } } %} conditions -> (condition ","):* condition {% d=>{ return d[0].map(x=> x[0]).concat([d[1]]) }%} condition -> cond _ ":" _ rulename {% d=>{ return { condition: d[0], dest:d[4] } } %} cond -> quality _ condSymbol _ int {% d=> { return { quality: d[0], cond: d[2][0], value: d[4] } } %} condSymbol -> ">" | "<" {% d => d[0]%} quality -> [xmas] {% d=> d[0]%} rulename -> [a-zA-Z]:+ {% d=> { return d[0].join(""); }%} materials -> (material eol:?):+ {% d => d[0].map(x=> x[0]) %} material -> "{" _ statement (_ "," _ statement):+ _ ",":? _ "}" {% d=>{ const ret = {}; const state = d[2]; ret[state.quality] = state.value; d[3].map(x=> x[3]).forEach(s=>{ ret[s.quality] = s.value; }); return ret; } %} statement -> quality _ "=" _ int {% d=>{ return { quality: d[0], value:d[4], } } %} _ -> wschar:* {% d=> null %} __ -> wschar:+ {% d=> null %} wschar -> [ \t] {% id %} eol -> "\n" | "\r\n" {% d=> null %} int -> [0-9]:+ {% d=> parseInt(d[0].join("")) %}