Может ли быть разработан язык, который не требует экранирования кавычек в строковых литералах? - PullRequest
2 голосов
/ 23 марта 2011

В C ++ (и, после перевода, в большинстве языков), синтаксическая ошибка, конечно, следующая:

std::string str = "Hello "Jesus""; // oopsquotes

Может ли быть создан C ++-подобный язык, которому не нужны эти кавычки? Может ли компилятор увидеть строку, подобную приведенной выше, и разумно определить, что я не хочу, чтобы строка заканчивалась после Hello, в общем случае ?

Языки и компиляторы любят требовать, чтобы мы писали точный синтаксис, чтобы избежать двусмысленности, но я не могу придумать не придуманный пример, подобный приведенному выше, где значение может быть чем угодно, кроме ", пожалуйста, введите Hello "Jesus" в строка". В C ++ «Иисус» должен был бы быть макросом препроцессора, который расширился до некоторого строкового литерала "x", чтобы вышеприведенное могло означать что-то еще. Очень важно поддерживать этот потенциальный случай в коде, где такого расширения не существует?

Итак, можно ли создать язык, в котором нам не нужно экранировать кавычки в строковом литерале? Можете ли вы вспомнить какие-нибудь не надуманные контрпримеры? Должен ли существовать такой язык? Возможно, один уже делает ...?

Обсудить.

Ответы [ 3 ]

2 голосов
/ 24 марта 2011

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

0 голосов
/ 13 апреля 2011

В некоторых языках используются разные типы кавычек, что позволяет иметь кавычки разных типов в строковых литералах. Например, Python имеет это с двойными кавычками, одинарными кавычками и тремя двойными кавычками.

Bash имеет некоторую форму "настраиваемого пользователем" механизма цитирования:

cat <<EOF
Hello "World"
EOF

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

0 голосов
/ 23 марта 2011

в Python вы можете сделать str = 'Hello "Jesus"' без проблем или str = """Hello "Jesus"."""

...