M(input) =
Vresult = V(input),
// try for V
[tree1, residue1] = Vresult,
residue1 == [] ? Vresult
// use M -> V
: failed(tree1) ? Vresult
// failure
: first(residue1) == '*' ?
( [tree2, residue2] =
M(rest(residue1)),
// try M -> V * M
failed(tree2) ?
Vresult
// use M -> V only
: [mkTree('*', tree1,
tree2), residue2] // use
M -> V + M
)
: Vresult;
// use M -> V