rex parsing for +, * (A)
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