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