start = p:literal+ { return Machine.eval(p) } literal = operation / assign / define / number / string / quotation / word define = '=' + space { return '=' } assign = '=>' + space { return '=>' } operation = plus / minus / multiple / devide plus = '+' + space { return '+' } minus = '-' + space { return '-' } multiple = '*' + space { return '*' } devide = '/' + space { return '/' } word = w:[^\[\] ]+ space { return { word:w.join('') } } quotation = '[' q:literal+ ']' space { return q } string = '"' s:[^"]* '"' space { return s.join('') } number = float / integer float = s:'-'? n:(digit* '.' digit+) space { return parseFloat(s + n.flatten().join('')) } integer = s:'-'? d:digit+ space { return parseInt(s + d.join('')) } digit = [0123456789] space = ' '* SPACE = ' '+ / !.