On Wed, Jun 17, 2020 at 10:52 PM Brian Zhao <
bzsp...@gmail.com> wrote:
>
> Out of curiosity, would it be possible to have a workaround for the infinite lookahead problem?
>
> I happened to see a similar issue mentioned when implementing Swift Generics:
https://github.com/apple/swift/blob/5bdc5ccd61cd43217e4f4e3515e32eb45e728df0/docs/Generics.rst#parsing-issues, and the proposed workaround was:
>
>> We're going to try a variant of #1, using a variation of the disambiguation rule used in C#. Essentially, when we see:
>> identifier <
>> we look ahead, trying to parse a type parameter list, until parsing the type parameter list fails or we find a closing '>'. We then look ahead an additional token to see if the closing '>' is followed by a '(', '.', or closing bracketing token (since types are most commonly followed by a constructor call or static member access). If parsing the type parameter list succeeds, and the closing angle bracket is followed by a '(', '.', or closing bracket token, then the '<...>' sequence is parsed as a generic parameter list; otherwise, the '<' is parsed as an operator.
>
>
> Would something similar work in go's parser? I'm personally in favor of the <> syntax, since it's very similar to other languages (C++, Swift, Rust, Java, C#).
It may be possible to do something like that in a Go parser. But as
you can see it's complicated and hard to specify. And let's not
forget about the >> issue when you write List<List<int>>, the issue
being that >> is the right shift operator. For many years C++
programmers had to write List<List<int> >, and the fix for that syntax
tweak was really complex. (But I don't know how Swift does it.)
Let's be clear: we may well change the syntax to stop using
parentheses for type lists. But we aren't going to simply switch to
angle brackets. That has too many complications.
Ian