code: function POSTFIX(operatorsParser, nextParser) {
    // Because we can't use recursion like stated above, we just match a flat list
    // of as many occurrences of the postfix operator as possible, then use
    // `.reduce` to manually nest the list.
    //
    // Example:
    //
    // INPUT  :: "4!!!"
    // PARSE  :: [4, "factorial", "factorial", "factorial"]
    // REDUCE :: ["factorial", ["factorial", ["factorial", 4]]]
    return P.seqMap(nextParser, operatorsParser.many(), (x, suffixes) =>
      suffixes.reduce((acc, x) => [x, acc], x)
    );
  }
docs: Ideally this function would be just like `PREFIX` but reordered like `P.seq(parser, operatorsParser).or(nextParser)`, but that doesn't work. The reason for that is that Parsimmon will get stuck in infinite recursion, since the very first rule. Inside `parser` is to match parser again. Alternatively, you might think to try `nextParser.or(P.seq(parser, operatorsParser))`, but that won't work either because in a call to `.or` (aka `P.alt`), Parsimmon takes the first possible match, even if subsequent matches are longer, so the parser will never actually look far enough ahead to see the postfix operators.