That's what I originally thought about, but the thing is `]` in and of itself is not an operator while `>` is, so
foo<bar, qux>corge>
"is" valid syntax while
foo[bar, qux]corge]
is not. The former requires some sort of disambiguation, while the latter is not. Put an other way, in terms of syntax `[]` always parses the same way (with `[` is infix and `]` terminates it), there can be ambiguity between indexing and generics but it doesn't really matter for the original parsing.
For `<>` however, the parsing itself can be ambiguous as `>` could either be the terminator of an earlier `<` or it could be the infix `>` operator. That is where the issue lies, you can't know how to build the AST without either explicit disambiguation, or infinite lookaheads.
The reason > needs braces is that without them, if you're parsing and so far you've seen these characters:
You don't know if that final > is ending the argument list, or is a greater-than operator, with the rest of an expression coming after it.But if it was square brackets, then a closing square bracket on its own can only ever be the end of the list:
Because if it was closing an array access, there would have to have been an opening square bracket: