В разработке компьютерных языков стропинг — это метод явной маркировки последовательностей букв как имеющих особое свойство, например, являющихся ключевым словом или определенным типом переменной или местом хранения, и, таким образом, занимающих другое пространство имен, нежели обычные имена («идентификаторы»), чтобы избежать конфликтов. Стропинг не используется в большинстве современных языков — вместо этого ключевые слова являются зарезервированными словами и не могут использоваться в качестве идентификаторов. Стропинг позволяет использовать одну и ту же последовательность букв и как ключевое слово, и как идентификатор , и упрощает синтаксический анализ в этом случае — например, позволяя переменной называться if
без конфликта с ключевым словом if .
Stropping в первую очередь ассоциируется с ALGOL и родственными языками в 1960-х годах. Хотя он находит некоторое современное применение, его легко спутать с другими похожими методами, которые внешне похожи.
Метод правки и термин «правка» возникли при разработке АЛГОЛа в 1960-х годах, где он использовался для представления типографских различий (жирный шрифт и подчеркивание), обнаруженных в языке публикации, которые не могли быть напрямую представлены в аппаратном языке — пишущая машинка могла иметь жирные символы, но при кодировании на перфокартах жирных символов не было. Термин «правка» возник в АЛГОЛ 60 , от « апострофа », поскольку некоторые реализации АЛГОЛ 60 использовали апострофы вокруг текста для обозначения жирного шрифта, [1] например, 'if'
для представления ключевого слова if . Правка также важна в АЛГОЛ 68 , где используются несколько методов правки, известных как «режимы правки»; Оригинальные парные апострофы из АЛГОЛа 60 не использовались широко, более распространенными были начальная точка или заглавная буква [2] , как в .IF
или , IF
и термин «правление» применялся ко всем этим случаям.
Для регулировки использовались различные синтаксисы:
'BEGIN'
).'BEGIN
) [4]На самом деле часто случалось так, что в одном языке могли использоваться несколько соглашений о строповке. Например, в ALGOL 68 выбор соглашения о строповке может быть указан директивой компилятора ( в терминологии ALGOL, " pragmat "), а именно POINT, UPPER, QUOTE или RES:
.FOR
– похожее соглашение используется в FORTRAN 77, где ключевые слова LOGICAL ограничиваются как .EQ.
и т. д. (см. ниже)FOR
– со строчными буквами, используемыми для обычных идентификаторов'for'
for
зарезервированы и недоступны для обычных идентификаторов.Различные режимы правил представляют собой лексическую спецификацию для стропированных символов, хотя в некоторых случаях они имеют простую интерпретацию: в режимах одиночного апострофа и точки первый символ функционирует как экранирующий символ , тогда как в режиме совпадающих апострофов апострофы функционируют как разделители , как в строковых литералах .
Другие примеры:
underlined
вводить с помощью клавиш backspace и overstring на клавиатуре Flexowriter , их можно было вводить с помощью %percent %symbol
, или их можно было вводить UPPER CASE
без разделительных символов (режим «uppercasedelimiters», в этом случае все переменные должны были быть в нижнем регистре).%percent %symbol
, но не другие его параметры правки.Обратите внимание на ведущую директиву pr (сокращение от pragmat ) , которая сама по себе заключена в стиль POINT или кавычек, а также на комментарий for (от " ") — подробности см. в ALGOL 68: pr & co: Pragmats и комментарии .¢
2¢
По разным причинам в 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 веке. Однако, подобные методы также широко использовались для облегчения понимания прочитанного людьми. Вот несколько примеров:
Более серьезные проблемы возникают из-за "stropping", техники, используемой для различения жирного текста от латинского. Некоторые реализации требуют апострофов вокруг жирного шрифта (отсюда и название stropping); другие требуют возврата и подчеркивания; [...]
{{cite journal}}
: Цитата использует общее название ( помощь )