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

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

Строппинг в первую очередь связан с АЛГОЛ и родственные языки в 1960-х. Хотя он находит некоторые современное использование, его легко спутать с другими аналогичные методы которые внешне похожи.

История

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

Синтаксис

Был использован ряд различных синтаксисов для строппинга:

  • Алгол 60 обычно используются только одинарные кавычки вокруг слова, как правило, в виде апострофов, откуда и происходит название «штриховка» (например, 'НАЧИНАТЬ').
  • Алгол 68[3][2] в некоторых реализациях трактуют последовательности букв с префиксом одинарной кавычки ', как ключевые слова (например, 'НАЧИНАТЬ)[4]

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

  • ТОЧКА для 6-битного (недостаточно символов для нижнего регистра), как в .ЗА - аналогичное соглашение используется в FORTRAN 77, где ключевые слова LOGICAL обозначены как .EQ. и т. д. (см. ниже)
  • UPPER для 7-битного, как в ЗА - строчные буквы используются для обычных идентификаторов
  • QUOTE как в АЛГОЛЕ 60, как в 'за'
  • Зарезервированные слова RES, используемые в современных языках - за зарезервировано и недоступно для обычных идентификаторов

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

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

  • Атлас Автокод имел выбор из трех: ключевые слова могут быть подчеркнутый используя backspace и overstrike на Flexowriter клавиатуры, они могут быть представлены % процент% символ, или их можно было ввести ВЕРХНИЙ РЕГИСТР без символа-разделителя (режим «ограничители верхнего регистра», в этом случае все переменные должны быть в нижнем регистре).
  • АЛГОЛ 68RS программам разрешено использовать несколько вариантов строчки, даже в пределах одного языкового процессора.
  • Эдинбург IMP унаследовал Автокод Атласа % процент% символ соглашение о префиксе, но не другие его параметры обрезки

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

Обратите внимание на ведущую пр (сокращение от прагматик) директива, который сам выделен в стиле ТОЧКА или кавычки, а ¢ для комментария (от "") - видеть АЛГОЛ 68: pr & co: прагматики и комментарии для подробностей.

Algol68 "строгий"
как обычно публикуется
Цитата
(подобно wikitext )
Для 7-битный персонаж
компилятор кода
Для 6-битный персонаж
компилятор кода
Algol68 с использованием коррекции изображения
(зарезервированное слово)
¢ подчеркнутый или жирный шрифт ¢ Режим xint = int; xint сумма sq: = 0; за я пока   сумма кв ≠ 70 × 70 делать   сумма sq +: = i ↑ 2 od
'pr' quote 'pr''mode' 'xint' = 'int'; 'xint' sum sq: = 0; 'for' i 'while' sum sq ≠ 70 × 70'do 'sum sq +: = i ↑ 2 'od'
.PR UPPER .PRMODE XINT = INT; XINT сумма sq: = 0; FOR i WHILE sum sq / = 70 * 70DO sum sq +: = i ** 2OD
.PR POINT .PR.MODE .XINT = .INT; .XINT SUM SQ: = 0; .FOR I .WHILE SUM SQ .NE 70 * 70.DO SUM SQ .PLUSAB I .UP 2.OD
.PR RES .PRmode .xint = int; .xint sum sq: = 0; for i while sum sq ≠ 70 × 70do sum sq +: = i ↑ 2od

Другие языки

По разным причинам Фортран 77 имеет следующие «логические» значения и операторы: .ИСТИННЫЙ., .ЛОЖНЫЙ., .EQ., .NE., .LT., .LE., .GT., .GE., .EQV., .NEQV., .ИЛИ ЖЕ., .И., .НЕТ.[5]

.И., .ИЛИ ЖЕ. и .XOR. также используются в комбинированных тестах в ЕСЛИ и МКФ заявления в пакетные файлы работать под Программное обеспечение JP процессоры командной строки, такие как 4ДОС,[6] 4OS2, и 4NT / Принять командование.

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

Большинство современных компьютерных языков не используют строчку, за двумя заметными исключениями:

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

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

Строппинг также можно использовать в Язык программирования NIM. В Nim зарезервированное слово можно использовать в качестве идентификатора, заключив его в обратные кавычки.

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

Разрыв компилятором

В интерфейс компилятора, прерывание изначально произошло во время начального реконструкция линии фаза, которая также устранила пробелы. Затем последовали разбор без сканирования (без токенизации); это было стандартом в 1960-х, особенно для АЛГОЛА. В современном использовании снятие повязки обычно выполняется как часть лексический анализ. Это становится ясно, если разграничить лексический анализатор на две фазы: сканер и анализатор: сканер классифицирует штрихованную последовательность в правильную категорию, а затем анализатор прекращает выполнение при вычислении значения. Например, в языке, где начальное подчеркивание используется для привязки идентификаторов, чтобы избежать конфликтов с зарезервированными словами, последовательность _если будет классифицироваться как идентификатор (а не как зарезервированное слово если) сканером, а затем оценщик даст ему значение если, уступая (Идентификатор, если) как тип и значение токена.

Подобные техники

Существует ряд аналогичных методов, как правило, с префиксом или суффиксом идентификатора для обозначения различного обращения, но семантика различна. Строго говоря, строппинг состоит из разных представлений одного и того же имени (значения) в разных пространствах имен и происходит на этапе токенизации. Например, в АЛГОЛе 60 с выравниванием совпадающего апострофа, 'если' токенизируется как (Ключевое слово, если), а если токенизируется как (Идентификатор, если) - одно и то же значение в разных классах токенов.

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

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

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

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

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

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

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

Изменение имени

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

Сигилы

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

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

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

  • Размещение важных слов в смелый, например, самое первое упоминание о строппинг в начале этой страницы, потому что определение штриховки - это сама цель страницы.
  • Форматирование новых слов в курсив когда они впервые представлены в тексте. Это обычно используется в научная фантастика и фантазия при знакомстве с изобретенными растениями, едой, живыми существами; в путешествие и историческое письмо при описании незнакомых иностранных слов; и так далее. Также используется специальный шрифт, возможно связанный с рассматриваемым языком, например, с использованием Готика шрифт для Немецкий слова.
  • Использование другого языка, обычно латинский или же Греческий для обозначения технических терминов. Это похоже на использование зарезервированных слов, но обычно сочетается с курсивом для удобства чтения. Например:
  • Письменно Японский, в добавление к Кандзи символы, два разных алфавита (более строго, слоговые слова ) Хирагана и Катакана, оба представляют один и тот же набор звуков, используются для отличия написанных фонетически японских слов от импортированных иностранных слов, соответственно; Катакана также используется для акцента, как и курсив по-английски.

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

Примечания

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

Рекомендации

  1. ^ Кинг, Питер Р., изд. (1974-06-18). "(неизвестный)". Труды международной конференции по реализации Алгола 68. Департамент компьютерных наук, Университет Манитобы, Виннипег: Университет Манитобы, Департамент компьютерных наук: 148. ISBN  9780919628113. Более серьезные проблемы возникают при использовании «штриховки», метода, используемого для отделения полужирного текста от латинского. В некоторых реализациях требуются апострофы вокруг полужирного шрифта (отсюда и начертание имени); другие требуют обратного интервала и подчеркивания; […] Cite использует общий заголовок (помощь)
  2. ^ а б ван Вейнгаарден, Адриан; Майлу, Барри Джеймс; Пек, Джон Эдвард Ланселот; Костер, Корнелис Херманус Антониус; Синцов, Мишель; Линдси, Чарльз Ходжсон; Меертенс, Ламбер Гийом Луи Теодор; Фискер, Ричард Г., ред. (1976). «Раздел 9.3 Заявления» (PDF). Пересмотренный отчет об алгоритмическом языке Алгол 68. Springer-Verlag. С. 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. ^ http://www.personal.psu.edu/jhm/f90/lectures/10.html
  6. ^ Братья Хардин; Роусон, Том; Конн, Рекс К.; Пол, Маттиас Р .; Краситель, Чарльз Э .; Георгиев, Лучезар И. (27.02.2002). Онлайн-справка 4DOS 8.00.
  7. ^ Web IDL, "3.1. Имена ". […] Для всех этих конструкций идентификатор - это значение токена идентификатора с удаленным единственным начальным символом (подчеркиванием) U + 005F LOW LINE (" _ "). […] Примечание […] Начальный" _ "используется для того, чтобы идентификатор не выглядел как зарезервированное слово, чтобы, например, можно было определить интерфейс с именем" interface ". Начальный знак" _ "отбрасывается, чтобы не экранировать идентификатор. […]
  8. ^ PEP 008: Описательный: стили именования
  9. ^ C99 стандарт, 7.1.3 Зарезервированные идентификаторы

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