Как в C # разбираются скобки, лямбда и выражения кортежей - PullRequest
0 голосов
/ 24 июня 2019

Я пишу на своем собственном языке программирования и пришел к анализу кортежей / лямбда-выражений после того, как получил большинство других вещей.Синтаксис очень похож на C # с некоторыми небольшими отличиями.Мне было интересно, делает ли C # упреждающий просмотр, чтобы определить, производить ли простое выражение в скобках, кортеж или лямбду, кажется маловероятным, потому что упреждающий просмотр (k) неопределен.

Сейчас ясвоего рода хакерское решение, подсматривая некоторые индикаторы, которые должны дать парсеру подсказку о том, что он пытается проанализировать.т. е. проверьте идентификатор @ 1, затем проверьте '=', ',' или ':' (двоеточие используется для аннотирования идентификаторов информацией о типе) в @ 2.

Мой синтаксис лямбда-выражения немного большегибкий, чем то, что доступно в C #, так что угадайте, что вы можете просто проанализировать список идентификаторов до тех пор, пока не останется больше запятых, и проверить следующие 2 токена на «)» и «=>».

Isмне не хватает какой-то хитрости?

1 Ответ

1 голос
/ 25 июня 2019

Да, вам нужен неограниченный просмотр, поскольку в некоторых контекстах (a, b, c, ...) может быть либо кортежем, либо списком лямбда-параметров, в зависимости от того, какой токен следует.Существует еще одна неоднозначность, поскольку (a.b.c.d... может быть либо выражением типа в приведении, либо регулярным выражением в скобках.

Вы можете увидеть, как C # решает это в исходном коде синтаксического анализатора: http://source.roslyn.io/#Microsoft.CodeAnalysis.CSharp/Parser/LanguageParser.cs,bab23e84fb31bf9e,references

В основном это сохраняет текущую позицию и пытается проанализировать одно из возможных производств.Если синтаксический анализ не выполняется, он возвращается к сохраненной позиции (или обратно) и затем пытается выполнить следующее возможное производство.Если происходит сбой всех возможных производств, он сообщает о синтаксической ошибке.

Кажется, что потенциальные разборы выполняются за два прохода.На первом проходе он только проверяет, возможен ли анализ, и возвращает логическое значение.Если этот тест завершается успешно, он запускает второй проход, где фактически создает дерево разбора.

Теоретически, неограниченный просмотр снизит производительность синтаксического анализатора, но на практике это, вероятно, не является большой проблемой, поскольку это происходит только в определенных конкретных контекстах, а кортежи и списки параметров лямбды обычно имеют ограниченный размер.

Разработчики языка стремятся избегать синтаксиса, требующего упреждающего просмотра, из-за дополнительной сложности, которую он налагает на анализатор, и влияющих на производительность.Но дизайнеры C #, вероятно, решили, что стоимость добавления синтаксиса кортежей того стоила.

...