+ while success and index < len(tokens):
+ # "list_expression" is actually the full list item expression if the next parse attempt doesn't succeed
+ # We can't give this a better name without a bunch of checks, however.
+ list_expression = FurListItemExpression(
+ list_expression=list_expression,
+ metadata=metadata,
+ index_expression=index_expression,
+ )
+
+ metadata = tokens[index].metadata
+
+ success, index, index_expression = _bracket_wrapped_parser(_expression_parser)(
+ index,
+ tokens,
+ )
+
+ return True, index, list_expression
+
+def _function_call_expression_parser(index, tokens):
+ failure = (False, index, None)
+
+ # We have to be careful what expressions we add here. Otherwise expressions
+ # like "a + b()" become ambiguous to the parser.
+ success, index, function = _or_parser(
+ _symbol_expression_parser,
+ _parenthesized_expression_parser,
+ )(index, tokens)
+
+ if not success:
+ return failure
+
+ metadata = tokens[index].metadata
+
+ success, index, arguments = _parenthese_wrapped_parser(_comma_separated_expression_list_parser)(
+ index,
+ tokens,
+ )