// parse function
for auxiliary A, rules A -> V | V + A
A(input) =
Vresult = V(input),
// try for V
[tree1, residue1] =
Vresult,
residue1 == [] ?
Vresult
// use A -> V
: failed(tree1) ? Vresult
// failure
: first(residue1) == '+' ?
( [tree2,
residue2] = A(rest(residue1)),
// try A -> V + A
failed(tree2) ?
Vresult
// use A -> V only
:
[mkTree('+', tree1, tree2), residue2] // use
A -> V + A
)
: Vresult;
// use A -> V