def ops: ['+','-','*','/']; data binaryExpression <{left: , op: ]>)>, right: }> data node composer parseArithmetic (?) (?) rule addition: {left: (?) op:<'[+-]'> (?) right:} rule multiplication: {left: (?) op:<'[*/]'> (?) right:} rule term: rule parentheses: (<'\('> ?) (? <'\)'>) end parseArithmetic templates evaluateArithmetic <´node´ {op: <='+'>}> ($.left -> evaluateArithmetic) + ($.right -> evaluateArithmetic) ! <´node´ {op: <='-'>}> ($.left -> evaluateArithmetic) - ($.right -> evaluateArithmetic) ! <´node´ {op: <='*'>}> ($.left -> evaluateArithmetic) * ($.right -> evaluateArithmetic) ! <´node´ {op: <='/'>}> ($.left -> evaluateArithmetic) ~/ ($.right -> evaluateArithmetic) ! otherwise $ ! end evaluateArithmetic def ast: '(100 - 5 * (2+3*4) + 2) / 2' -> parseArithmetic; '$ast; ' -> !OUT::write '$ast -> evaluateArithmetic; ' -> !OUT::write