> The usual way to disambiguate in these cases is to check whether b is plausibly a type and treat it as a generic
Most compilers don't even go that far: using type information parsing is a huge no no for almost all languages that aren't C++. So for example, Typescript will flag:
a<b>(c)
as an error if a, b, and c are untyped, meaning it automatically resolved the generic application in the parser before type information was processed, while this is fine: a<b>=(c)
Since the equal sign means > is part of a >= token. The parser is automatically determining if generic application was meant or not, before any type info is considered.