Да, вам нужен неограниченный просмотр, поскольку в некоторых контекстах (a, b, c, ...)
может быть либо кортежем, либо списком лямбда-параметров, в зависимости от того, какой токен следует.Существует еще одна неоднозначность, поскольку (a.b.c.d...
может быть либо выражением типа в приведении, либо регулярным выражением в скобках.
Вы можете увидеть, как C # решает это в исходном коде синтаксического анализатора: http://source.roslyn.io/#Microsoft.CodeAnalysis.CSharp/Parser/LanguageParser.cs,bab23e84fb31bf9e,references
В основном это сохраняет текущую позицию и пытается проанализировать одно из возможных производств.Если синтаксический анализ не выполняется, он возвращается к сохраненной позиции (или обратно) и затем пытается выполнить следующее возможное производство.Если происходит сбой всех возможных производств, он сообщает о синтаксической ошибке.
Кажется, что потенциальные разборы выполняются за два прохода.На первом проходе он только проверяет, возможен ли анализ, и возвращает логическое значение.Если этот тест завершается успешно, он запускает второй проход, где фактически создает дерево разбора.
Теоретически, неограниченный просмотр снизит производительность синтаксического анализатора, но на практике это, вероятно, не является большой проблемой, поскольку это происходит только в определенных конкретных контекстах, а кортежи и списки параметров лямбды обычно имеют ограниченный размер.
Разработчики языка стремятся избегать синтаксиса, требующего упреждающего просмотра, из-за дополнительной сложности, которую он налагает на анализатор, и влияющих на производительность.Но дизайнеры C #, вероятно, решили, что стоимость добавления синтаксиса кортежей того стоила.