stringtranslate.com

Стропинг (синтаксис)

В разработке компьютерных языков стропинг — это метод явной маркировки последовательностей букв как имеющих особое свойство, например, являющихся ключевым словом или определенным типом переменной или местом хранения, и, таким образом, занимающих другое пространство имен, нежели обычные имена («идентификаторы»), чтобы избежать конфликтов. Стропинг не используется в большинстве современных языков — вместо этого ключевые слова являются зарезервированными словами и не могут использоваться в качестве идентификаторов. Стропинг позволяет использовать одну и ту же последовательность букв и как ключевое слово, и как идентификатор , и упрощает синтаксический анализ в этом случае — например, позволяя переменной называться ifбез конфликта с ключевым словом if .

Stropping в первую очередь ассоциируется с ALGOL и родственными языками в 1960-х годах. Хотя он находит некоторое современное применение, его легко спутать с другими похожими методами, которые внешне похожи.

История

Метод правки и термин «правка» возникли при разработке АЛГОЛа в 1960-х годах, где он использовался для представления типографских различий (жирный шрифт и подчеркивание), обнаруженных в языке публикации, которые не могли быть напрямую представлены в аппаратном языке — пишущая машинка могла иметь жирные символы, но при кодировании на перфокартах жирных символов не было. Термин «правка» возник в АЛГОЛ 60 , от « апострофа », поскольку некоторые реализации АЛГОЛ 60 использовали апострофы вокруг текста для обозначения жирного шрифта, [1] например, 'if'для представления ключевого слова if . Правка также важна в АЛГОЛ 68 , где используются несколько методов правки, известных как «режимы правки»; Оригинальные парные апострофы из АЛГОЛа 60 не использовались широко, более распространенными были начальная точка или заглавная буква [2] , как в .IFили , IFи термин «правление» применялся ко всем этим случаям.

Синтаксис

Для регулировки использовались различные синтаксисы:

На самом деле часто случалось так, что в одном языке могли использоваться несколько соглашений о строповке. Например, в ALGOL 68 выбор соглашения о строповке может быть указан директивой компилятора ( в терминологии ALGOL, " pragmat "), а именно POINT, UPPER, QUOTE или RES:

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

Другие примеры:

Примеры различных стилей ALGOL 68

Обратите внимание на ведущую директиву pr (сокращение от pragmat ) , которая сама по себе заключена в стиль POINT или кавычек, а также на комментарий for (от " ") — подробности см. в ALGOL 68: pr & co: Pragmats и комментарии .¢

Другие языки

По разным причинам в Fortran 77 есть следующие «логические» значения и операторы: .TRUE., .FALSE., .EQ., .NE., .LT., .LE., .GT., .GE., .EQV., .NEQV., .OR., .AND., .NOT.[5]

.AND., .OR.а .XOR.также используются в комбинированных тестах IFи IFF​​операторах в пакетных файлах, запускаемых под управлением процессоров командной строки JP Software , таких как 4DOS , [6] 4OS2 и 4NT / Take Command .


Современное использование

Для указания идентификаторов

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

Например, использование многих языков в .NET Common Language Infrastructure (CLI) Microsoft требует способа использования переменных на другом языке, которые могут быть ключевыми словами в вызывающем языке. Иногда это делается с помощью префиксов, как @в C#, или заключения идентификатора в скобки, как в Visual Basic.NET .

Второй важный пример — во многих реализациях языка структурированных запросов . В этих языках зарезервированные слова могут использоваться в качестве имен столбцов, таблиц или переменных путем лексического разграничения. Стандарт предписывает заключать зарезервированные слова в двойные кавычки, но на практике точный механизм зависит от реализации; MySQL , например, позволяет использовать зарезервированные слова в других контекстах, заключая их в обратные кавычки, а Microsoft SQL Server использует квадратные скобки.

В нескольких языках, включая Nim , R [7] и Scala [8], зарезервированное слово или небуквенно-цифровое имя можно использовать в качестве идентификатора, заключив его в обратные кавычки .

Есть и другие, более мелкие примеры. Например, Web IDL использует начальное подчеркивание _для стропы идентификаторов, которые в противном случае конфликтуют с зарезервированными словами: значение идентификатора удаляет это начальное подчеркивание, делая это стропой, а не соглашением об именовании. [9]

Другие цели

В Haskell заключение имени функции в обратные кавычки приводит к тому, что оно обрабатывается как инфиксный оператор .

Расстегивание компилятором

В компиляторе front-end , unstropping изначально происходил во время начальной фазы реконструкции строки , которая также устраняла пробелы. Затем последовал разбор без сканера (без токенизации); это было стандартом в 1960-х годах, особенно для ALGOL. В современном использовании unstropping обычно выполняется как часть лексического анализа . Это ясно, если разделить лексер на две фазы сканера и оценщика: сканер категоризирует стропированную последовательность в правильную категорию, а затем оценщик делает unstrop при вычислении значения. Например, в языке, где начальное подчеркивание используется для стропирования идентификаторов, чтобы избежать коллизий с зарезервированными словами, последовательность _ifбудет категоризирована как идентификатор (а не как зарезервированное слово if) сканером, а затем оценщик присвоит ей значение if, выдавая (Identifier, if)как тип токена и значение.

Похожие методы

Существует ряд подобных методов, обычно с использованием префикса или суффикса идентификатора для указания на различную обработку, но семантика различается. Строго говоря, стропинг состоит из различных представлений одного и того же имени (значения) в разных пространствах имен и происходит на этапе токенизации. Например, в ALGOL 60 с стропингом с соответствующими апострофами 'if'токенизируется как (Keyword, if), тогда как ifтокенизируется как (Identifier, if) – одно и то же значение в разных классах токенов.

Использование заглавных букв для ключевых слов по-прежнему используется в качестве соглашения при написании грамматик для лексического анализа и синтаксического анализа — токенизации зарезервированного слова ifв качестве класса токенов IF, а затем представления предложения if-then-else фразой IF Expression THEN Statement ELSE Statement, где заглавные буквы являются ключевыми словами, а заглавные буквы являются нетерминальными символами в правиле производства ( терминальные символы обозначаются строчными буквами, например identifierили integerдля целочисленного литерала ).

Соглашения об именовании

В наиболее свободном случае можно использовать соглашения об именовании , чтобы избежать конфликтов, обычно добавляя префикс или суффикс с подчеркиванием, как в if_или _then. Начальное подчеркивание часто используется для обозначения закрытых членов в объектно-ориентированном программировании.

Эти имена могут интерпретироваться компилятором и иметь некоторый эффект, хотя это обычно делается на этапе семантического анализа, а не на этапе токенизации. Например, в Python одиночное начальное подчеркивание является слабым частным индикатором и влияет на то, какие идентификаторы импортируются при импорте модуля, в то время как двойное начальное подчеркивание (и не более одного конечного подчеркивания) в атрибуте класса вызывает искажение имени . [10]

Зарезервированные слова

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

Это наиболее заметно в C, где идентификаторы, начинающиеся с подчеркивания, зарезервированы, хотя точные детали того, какие идентификаторы зарезервированы в какой области действия, и начальные двойные подчеркивания зарезервированы для любого использования; [11] аналогично в C++ любой идентификатор, содержащий двойное подчеркивание, зарезервирован для любого использования, в то время как идентификатор, начинающийся с подчеркивания, зарезервирован в глобальном пространстве. [nb 1] Таким образом, можно добавить новое ключевое слово , fooиспользуя зарезервированное слово __foo. Хотя это внешне похоже на стропинг, семантика отличается. Как зарезервированное слово, строка __fooпредставляет идентификатор __fooв общем пространстве имен идентификаторов. В стропинге (путем добавления префикса к ключевым словам __) строка __fooпредставляет ключевое слово fooв отдельном пространстве имен ключевых слов. Таким образом, используя зарезервированные слова, токены для __fooи fooявляются (идентификатор, __foo) и (идентификатор, foo) – разными значениями в одной и той же категории – в то время как при стропинге токены для __fooи fooявляются (ключевое слово, foo) и (идентификатор, foo) – одинаковыми значениями в разных категориях. Они решают ту же проблему конфликтов пространств имен способом, который является одинаковым для программиста, но который отличается с точки зрения формальной грамматики и реализации.

Искажение имени

Искажение имен также решает конфликты имен путем переименования идентификаторов, но делает это гораздо позже при компиляции, во время семантического анализа, а не во время токенизации. Это заключается в создании имен, которые включают информацию о области действия и типе, в первую очередь для использования компоновщиками, как для избежания конфликтов, так и для включения необходимой семантической информации в само имя. В этих случаях исходные идентификаторы могут быть идентичны, но контекст отличается, как в функциях foo(int x)против foo(char x), в обоих случаях имеющих один и тот же идентификатор foo, но разную сигнатуру. Эти имена могут быть искажены до foo_iи foo_c, например, для включения информации о типе.

Сигилы

Синтаксически похожим, но семантически отличным явлением являются сигилы , которые вместо этого указывают свойства переменных. Они распространены в BASIC , Perl , Ruby и различных других языках для идентификации характеристик переменных/констант: BASIC и Perl для обозначения типа переменной, Ruby как для различения переменных от констант, так и для указания области действия. Обратите внимание, что это влияет на семантику переменной , а не на синтаксис того, является ли она идентификатором или ключевым словом.

Параллели в человеческом языке

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

Смотрите также

Примечания

  1. ^ Существуют и другие ограничения, например, идентификатор, начинающийся с подчеркивания, за которым следует заглавная буква.

Ссылки

  1. ^ Кинг, Питер Р., ред. (1974-06-18). "(неизвестно)". Труды международной конференции по внедрению ALGOL 68. Кафедра компьютерных наук, Университет Манитобы, Виннипег: Университет Манитобы, Кафедра компьютерных наук: 148. ISBN 9780919628113. Более серьезные проблемы возникают из-за "stropping", техники, используемой для различения жирного текста от латинского. Некоторые реализации требуют апострофов вокруг жирного шрифта (отсюда и название stropping); другие требуют возврата и подчеркивания; [...] {{cite journal}}: Цитата использует общее название ( помощь )
  2. ^ Аб ван Вейнгаарден, Адриан ; Майу, Барри Джеймс ; Пек, Джон Эдвард Ланселот ; Костер, Корнелис Герман Антоний ; Синцов, Мишель [на французском языке] ; Линдси, Чарльз Ходжсон ; Меертенс, Ламбер Гийом Луи Теодор ; Фискер, Ричард Г., ред. (1976). «Раздел 9.3 Заверения» (PDF) . Пересмотренный отчет об алгоритмическом языке АЛГОЛ 68 . Спрингер-Верлаг . стр. 94, 123. ISBN. 978-0-387-07592-1. OCLC  1991170. Архивировано (PDF) из оригинала 2019-04-19 . Получено 2019-05-11 .
  3. ^ http://www.fh-jena.de/~kleine/history/languages/Algol68-RR-HardwareRepresentation.pdf [ мертвая ссылка ]
  4. ^ Линдси, Чарльз Ходжсон ; ван дер Мейлен, Ситце Г. (1977). Неофициальное введение в АЛГОЛ 68 . Северная Голландия. стр. 348–349. ISBN 978-0-7204-0726-6. OCLC  230034877.
  5. ^ «Логические структуры».
  6. ^ Братья, Хардин; Роусон, Том ; Конн, Рекс К .; Пол, Маттиас Р.; Дай, Чарльз Э.; Георгиев, Лучезар И. (27.02.2002). Онлайн-справка по 4DOS 8.00 .
  7. ^ Основная команда R, Цитаты: Цитаты, R Foundation for Statistical Computing.
  8. ^ Одерски, Мартин (24.05.2011), Спецификация языка Scala версии 2.9
  9. ^ Web IDL , "3.1. Имена". [...] Для всех этих конструкций идентификатор представляет собой значение токена идентификатора с удаленным одним начальным символом U+005F LOW LINE ("_") (подчеркивание). [...] Примечание [...] Начальный "_" используется для того, чтобы идентификатор не выглядел как зарезервированное слово, например, чтобы можно было определить интерфейс с именем "interface". Начальный "_" опускается, чтобы не экранировать идентификатор. [...]
  10. ^ PEP 008: Описательный: стили именования
  11. ^ Стандарт C99 , 7.1.3 Зарезервированные идентификаторы
  12. ^ Твайман, Майкл. «Смелая идея: использование жирных шрифтов в девятнадцатом веке». Журнал Исторического общества печати . ​​22 (107–143).
  13. ^ Трасс, Линн (2004), Ест, стреляет и уходит: подход нулевой терпимости к пунктуации , Нью-Йорк: Gotham Books, стр. 146, ISBN 978-1-59240-087-4
  14. ^ "Стили почерка". Rigsarkivet . Датский национальный архив . Получено 26.03.2017 .
  15. ^ «Как писать научные названия организмов» (PDF) , Competition Science Vision , получено 20 июня 2011 г.
  16. ^ Выборка юридических максим, классифицированная и проиллюстрированная в Google Books
  17. ^ Двойной 大辞林
    「平」とは平凡な、やさしいという意で、当時普通に使用する文字体系であったことを意味する。 平仮名Перевод
    : 平 [ часть «хира» от «хирагана»] означает «обычный» или «простой». поскольку в то время [время, когда было дано название] это была система письма для повседневного использования. В то время как кандзи была официальной системой, используемой для написания писем и важных текстов, хирагана была для личного использования людьми, которые имели ограниченные знания кандзи .
  18. ^ "Японская каллиграфия". Encyclopedia Britannica . Получено 22.06.2017 .
  19. ^ "Хирагана, катакана и кандзи". Японские иероглифы. 2010-09-08 . Получено 2011-10-15 .

Дальнейшее чтение