Parse an expression.
The grammar rule for expressions is left-recursive, so we need to do left recursion elimination. The left-recursive rule is equivalent to
expression = assignment-expression *( "," assignment-expression )
so we can parse it by first parsing an assignment expression and then parsing the rest, which is a sequence of zero or more instances of a comma followed by an assignment expression. The function to parse this sequence is parse-expression-rest. In the original grammar, as in our abstract syntax, the comma operator is left-associative. So we pass the first expression (and its span) to parse-expression-rest, where the final expression is constructed: see the documentation of that function for details.