Обвязка (синтаксис)
В компьютерного языка разработке строппинг — это метод явной маркировки последовательностей букв как обладающих особым свойством, например, ключевым словом или определенным типом переменной или местом хранения, и, таким образом, находящимися в пространстве имен, отличном от обычных имен («идентификаторов»). , чтобы избежать столкновений. Строппинг не используется в большинстве современных языков — вместо этого ключевые слова являются зарезервированными и не могут использоваться в качестве идентификаторов. Строппинг позволяет использовать одну и ту же последовательность букв как в качестве ключевого слова, так и в качестве идентификатора , и в этом случае упрощает синтаксический анализ — например, позволяя использовать переменную с именем if
без конфликта с ключевым словом if .
Строппинг в первую очередь ассоциируется с АЛГОЛом и родственными языками 1960-х годов. Хотя он находит современное применение , его легко спутать с другими похожими методами , которые внешне похожи.
История [ править ]
Метод строповки и термин «строппинг» возникли при разработке АЛГОЛА в 1960-х годах, где он использовался для обозначения типографских различий (жирный шрифт и подчеркивание), обнаруженных в языке публикации, которые не могли быть непосредственно представлены на аппаратном языке - На пишущей машинке могли быть жирные символы, но при кодировании на перфокартах жирных символов не было. Термин «стропинг» возник в Алголе 60 от слова « апостроф », поскольку в некоторых реализациях Алгола 60 апострофы использовались вокруг текста для обозначения жирного шрифта. [1] такой как 'if'
для представления ключевого слова if . Строппинг также важен в АЛГОЛе 68 , где используются несколько методов стропинга, известные как «режимы стропинга»; оригинальные совпадающие апострофы из АЛГОЛа 60 не получили широкого распространения, чаще использовалась начальная точка или прописные буквы, [2] как в .IF
или IF
и ко всему этому применялся термин «строппинг».
Синтаксис [ править ]
Для обрезки использовался ряд различных синтаксисов:
- В АЛГОЛе 60 обычно использовалось только соглашение об одинарных кавычках вокруг слова, обычно в виде апострофов, отсюда и название «строппинг» (например,
'BEGIN'
). - АЛГОЛ 68 [3] [2] в некоторых реализациях последовательность букв с префиксом одинарной кавычки ' рассматривается как ключевые слова (например,
'BEGIN
) [4]
На самом деле часто в одном языке могло использоваться несколько соглашений о стропинге. Например, в АЛГОЛе 68 выбор соглашения об ограничении может быть определен директивой компилятора ( в терминологии АЛГОЛА « прагматом »), а именно POINT, UPPER, QUOTE или RES:
- ТОЧКА для 6-битного формата (недостаточно символов для нижнего регистра), как в
.FOR
– аналогичное соглашение используется в FORTRAN 77, где ключевые слова LOGICAL обрезаются как.EQ.
и т. д. (см. ниже) - UPPER для 7-битного режима, например
FOR
– для обычных идентификаторов используется нижний регистр - ЦИТАТА как в АЛГОЛе 60, как в
'for'
- Зарезервированные слова RES, используемые в современных языках –
for
зарезервировано и недоступно для обычных идентификаторов
Различные режимы правил представляют собой лексическую спецификацию сокращенных символов, хотя в некоторых случаях они имеют простую интерпретацию: в режимах с одним апострофом и точкой первый символ функционирует как escape-символ , тогда как в режиме совмещенных апострофов апострофы функционируют как разделители , как в строковых литералах .
Другие примеры:
- У Atlas Autocode было три варианта: ключевые слова могли быть
underlined
используя клавишу Backspace и Overstrike на клавиатуре Flexowriter , их можно ввести с помощью%percent %symbol
, или их можно ввестиUPPER CASE
без символа-разделителя (режим «разделители в верхнем регистре», в этом случае все переменные должны быть в нижнем регистре). - В АЛГОЛе 60 на компьютерах Elliott 803 и Elliott 503 использовалось подчеркивание. У флексорайтеров (производящих перфоленту) была неподвижная клавиша (подчеркивание _), так что ввод _b_e_g_i_n вызывал начало , которое было очень читабельным. Вертикальная полоса | также была клавишей, не позволяющей перемещаться, поэтому ввод |= давал хорошее приближение к ≠.
- Компилятор Kidsgrove для ALGOL 60 на English Electric KDF9, судя по всему, использовал по крайней мере два других соглашения о сокращении в дополнение к кавычкам: восклицательные знаки и символы процента .
- В программах АЛГОЛ 68RS допускается использование нескольких вариантов корректировки даже в рамках одного языкового процессора.
- Эдинбургский IMP унаследовал автокод Атласа.
%percent %symbol
соглашение о префиксах, но не другие параметры ограничения
Примеры различных стилей ALGOL 68 [ править ]
Обратите внимание на ведущую pr (аббревиатура от pragmat ) директиву , которая сама по себе заключена в стиль POINT или кавычку, а также ¢
за комментарий (от " 2¢
") - см. в разделе АЛГОЛ 68: pr & co: Прагматы и комментарии подробности .
Алгол68 "строгий" как обычно публикуется |
Обрезание цитат (например, викитекст ) |
Для 7-битного персонажа компилятор кода |
Для 6-битного персонажа компилятор кода |
Algol68 с использованием res-обвязки (зарезервированное слово) |
---|---|---|---|---|
¢ underline or bold typeface ¢ mode xint = int; xint sum sq:=0; for i while sum sq≠70×70 do sum 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 .PR
MODE XINT = INT;
XINT sum sq:=0;
FOR i WHILE
sum sq/=70*70
DO
sum sq+:=i**2
OD
|
.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 .PR
mode .xint = int;
.xint sum sq:=0;
for i while
sum sq≠70×70
do
sum sq+:=i↑2
od
|
Другие языки [ править ]
По разным причинам в Фортране 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 инфраструктуре общего языка (CLI) Microsoft требует способа использования переменных на другом языке, которые могут быть ключевыми словами на вызывающем языке. Иногда это делается с помощью префиксов, таких как @
в C# или заключив идентификатор в скобки в Visual Basic.NET .
Второй важный пример — многие реализации языка структурированных запросов . В этих языках зарезервированные слова могут использоваться в качестве имен столбцов, таблиц или переменных путем их лексического разграничения. Стандарт определяет заключение зарезервированных слов в двойные кавычки, но на практике точный механизм зависит от реализации; MySQL , например, позволяет использовать зарезервированные слова в других контекстах, заключая их в обратные кавычки, а Microsoft SQL Server использует квадратные скобки.
На нескольких языках, включая Ним , Р , [7] и Скала , [8] зарезервированное слово или небуквенно-цифровое имя можно использовать в качестве идентификатора, заключив его в обратные кавычки .
Есть и другие, более мелкие примеры. Например, Web IDL использует начальное подчеркивание. _
для ограничения идентификаторов, которые в противном случае конфликтуют с зарезервированными словами: значение идентификатора удаляет это ведущее подчеркивание, создавая такое сокращение, а не соглашение об именах. [9]
Другие цели [ править ]
В Haskell окружение имени функции обратными кавычками приводит к ее анализу как инфиксному оператору .
Распаковка компилятором [ править ]
Во внешнем интерфейсе компилятора отмена первоначально происходила на этапе начальной реконструкции строки , что также устраняло пробелы. Затем последовал анализ без сканирования (без токенизации); это было стандартом в 1960-х годах, особенно для АЛГОЛА. В современном использовании разблокировка обычно выполняется как часть лексического анализа . Это станет ясно, если разделить лексер на две фазы: сканер и вычислитель: сканер относит сокращенную последовательность к правильной категории, а затем вычислитель снимает ограничение при вычислении значения. Например, в языке, где начальное подчеркивание используется для ограничения идентификаторов во избежание конфликтов с зарезервированными словами, последовательность _if
будет классифицирован как идентификатор (а не как зарезервированное слово if
) сканером, а затем оценщик присвоит этому значение if
, уступая (Identifier, if)
как тип и значение токена.
Подобные методы [ править ]
Существует ряд подобных методов, обычно с добавлением префикса или суффикса к идентификатору для обозначения другого обращения, но семантика различна. Строго говоря, строппинг состоит из разных представлений одного и того же имени (значения) в разных пространствах имен и происходит на этапе токенизации. Например, в АЛГОЛе 60 с согласованной обрезкой апострофов: 'if'
обозначается как (Ключевое слово, if), а if
токенизируется как (Идентификатор, if) – одно и то же значение в разных классах токенов.
Использование прописных букв для ключевых слов по-прежнему используется в качестве соглашения о написании грамматик для лексического и синтаксического анализа – токенизации зарезервированного слова. if
как класс токена IF, а затем представляя предложение if-then-else фразой IF Expression THEN Statement ELSE Statement
где термины, записанные заглавными буквами, являются ключевыми словами, а термины, написанные с заглавной буквы, являются нетерминальными символами в производственном правиле ( терминальные символы обозначаются терминами в нижнем регистре, например identifier
или integer
, для целочисленного литерала ).
Соглашения об именах [ править ]
Проще говоря, можно использовать соглашения об именах , чтобы избежать конфликтов, обычно добавляя префикс или суффикс подчеркивания, как в if_
или _then
. Ведущее подчеркивание часто используется для обозначения частных членов в объектно-ориентированном программировании.
Эти имена могут интерпретироваться компилятором и иметь некоторый эффект, хотя обычно это делается на этапе семантического анализа, а не на этапе токенизации. Например, в Python одно ведущее подчеркивание является слабым частным индикатором и влияет на то, какие идентификаторы импортируются при импорте модуля, тогда как двойное ведущее подчеркивание (и не более одного завершающего подчеркивания) в атрибуте класса вызывает искажение имени . [10]
Зарезервированные слова [ править ]
В то время как современные языки обычно используют зарезервированные слова, а не пытаются отличить ключевые слова от идентификаторов, например, делая if
зарезервировано - они также часто резервируют синтаксический класс идентификаторов в качестве ключевых слов, создавая представления, которые можно интерпретировать как режим ограничения, но вместо этого имеют семантику зарезервированных слов.
Это особенно заметно в C, где идентификаторы, начинающиеся с подчеркивания, зарезервированы, хотя точные сведения о том, какие идентификаторы зарезервированы и в какой области задействованы, а ведущие двойные подчеркивания зарезервированы для любого использования; [11] аналогично в C++ любой идентификатор, содержащий двойное подчеркивание, зарезервирован для любого использования, а идентификатор, начинающийся с подчеркивания, зарезервирован в глобальном пространстве. [номер 1] Таким образом, можно добавить новое ключевое слово foo
используя зарезервированное слово __foo
. Хотя на первый взгляд это похоже на строппинг, семантика другая. В качестве зарезервированного слова строка __foo
представляет идентификатор __foo
в пространстве имен общего идентификатора. При строппинге (путем добавления к ключевым словам префикса __
), строка __foo
представляет ключевое слово foo
в отдельном пространстве имен ключевых слов. Таким образом, используя зарезервированные слова, токены для __foo
и foo
являются (идентификатор, __foo) и (идентификатор, foo) — разные значения в одной категории — при ограничении токенов для __foo
и foo
are (ключевое слово, foo) и (идентификатор, foo) – одни и те же значения в разных категориях. Они решают одну и ту же проблему конфликтов пространств имен одинаковым для программиста способом, но различаются с точки зрения формальной грамматики и реализации.
Искажение имени [ править ]
Искажение имен также устраняет конфликты имен путем переименования идентификаторов, но это происходит гораздо позже при компиляции, во время семантического анализа, а не во время токенизации. Это заключается в создании имен, включающих информацию об области действия и типе, в первую очередь для использования компоновщиками, чтобы избежать конфликтов и включить необходимую семантическую информацию в само имя. В этих случаях исходные идентификаторы могут быть идентичными, но контекст различен, как в функциях foo(int x)
против foo(char x)
, в обоих случаях имеющих одинаковый идентификатор foo
, но другая подпись. Эти имена могут быть искажены foo_i
и foo_c
, например, чтобы включить информацию о типе.
Сигилы [ править ]
Синтаксически похожее, но семантически разное явление — это сигилы , которые вместо этого указывают свойства переменных. Они распространены в BASIC , Perl , Ruby и различных других языках для определения характеристик переменных/констант: BASIC и Perl для обозначения типа переменной, Ruby для различения переменных от констант и для указания области действия. Обратите внимание, что это влияет на семантику переменной, а не на синтаксис того, является ли она идентификатором или ключевым словом.
Параллели в человеческом языке [ править ]
Строппинг используется в языках программирования, чтобы облегчить работу компилятора (или, точнее, синтаксического анализатора ), то есть в пределах возможностей относительно небольших и медленных компьютеров, доступных на заре вычислительной техники в 20 веке. Однако подобные методы широко используются и для улучшения понимания прочитанного людьми. Некоторые примеры:
- Выделяя важные слова жирным шрифтом , [12] например, самое первое упоминание об ограничении в начале этой страницы, поскольку определение ограничения является самой целью страницы.
- Форматирование новых слов курсивом [13] когда они впервые появляются в тексте. Это обычно используется в научной фантастике и фэнтези при представлении изобретенных растений, продуктов питания и существ; в травелогах и исторических трудах при описании незнакомых иностранных слов; и так далее. Также используется специальный шрифт, возможно, связанный с рассматриваемым языком, например, готический. [14] шрифт для немецких слов.
- Использование другого языка, обычно латинского или греческого, для обозначения технических терминов. Это похоже на использование зарезервированных слов, но обычно оно сочетается с курсивом для удобства чтения. Например:
- типичная биномиальная номенклатура [15] или «латинские названия» растений и животных помогают читателю увидеть, что « Erithacus Rubecula » — это специальное техническое название Erithacus Rubecula , в отличие от «Краснозобого европейского дрозда».
- многие юридические термины, в которых короткая латинская фраза относится к большому объему законов и прецедентов, например habeas corpus , sub judice , in locoparis . [16]
- логические и математические термины, такие как КЭД , априори , наоборот ...
- В письменном японском языке , помимо символов кандзи , есть два отдельных алфавита (точнее, слоговые письма ) хирагана. [17] [18] и Катакана , [19] оба представляют один и тот же набор звуков и используются для различения фонетически написанных японских слов от импортированных иностранных слов соответственно; Катакана также используется для выделения, подобно курсиву в английском языке.
См. также [ править ]
Примечания [ править ]
- ^ Существуют и другие ограничения, например идентификатор, начинающийся с подчеркивания, за которым следует заглавная буква.
Ссылки [ править ]
- ^ Кинг, Питер Р., изд. (18 июня 1974 г.). "(неизвестный)" . Материалы международной конференции по внедрению Алгола 68 . Факультет компьютерных наук, Университет Манитобы, Виннипег: Университет Манитобы, факультет компьютерных наук: 148. ISBN 9780919628113 .
Более серьезные проблемы создает «обрезание» — метод, используемый для различения текста, выделенного жирным шрифтом, от текста, написанного латиницей. Некоторые реализации требуют апострофов вокруг жирного шрифта (отсюда и сокращение имени); другие требуют возврата и подчеркивания; [...]
{{cite journal}}
: Cite использует общий заголовок ( справка ) - ^ Jump up to: а б ван Вейнгаарден, Адриан ; Майу, Барри Джеймс ; Пек, Джон Эдвард Ланселот ; Костер, Корнелис Герман Антоний ; Синцов, Мишель [на французском языке] ; Линдси, Чарльз Ходжсон ; Меертенс, Ламбер Гийом Луи Теодор ; Фискер, Ричард Г., ред. (1976). «Раздел 9.3 Заверения» (PDF) . Пересмотренный отчет об алгоритмическом языке АЛГОЛ 68 . Спрингер Верлаг . стр. 94, 123. ISBN 978-0-387-07592-1 . OCLC 1991170 . Архивировано (PDF) из оригинала 19 апреля 2019 г. Проверено 11 мая 2019 г.
- ^ http://www.fh-jena.de/~kleine/history/languages/Algol68-RR-HardwareRepresentation.pdf [ мертвая ссылка ]
- ^ Линдси, Чарльз Ходжсон ; ван дер Мейлен, Ситсе Г. (1977). Неофициальное введение в АЛГОЛ 68 . Северная Голландия. стр. 348–349. ISBN 978-0-7204-0726-6 . OCLC 230034877 .
- ^ «Логические структуры» .
- ^ Братья Хардин; Роусон, Том ; Конн, Рекс К .; Пол, Матиас Р.; Дай, Чарльз Э.; Георгиев, Лучезар И. (27 февраля 2002 г.). Онлайн-справка по 4DOS 8.00 .
- ^ Основная команда R, Котировки: Котировки , Фонд R для статистических вычислений.
- ^ Одерски, Мартин (24 мая 2011 г.), Спецификация языка Scala, версия 2.9
- ^ Web IDL , « 3.1. Имена ». [...] Для всех этих конструкций идентификатор представляет собой значение токена идентификатора с удаленным любым ведущим символом U+005F LOW LINE («_») (подчеркивание). [...] Примечание [...] Ведущий «_» используется для того, чтобы идентификатор не выглядел как зарезервированное слово, чтобы, например, можно было определить интерфейс с именем «интерфейс». Ведущий "_" опускается, чтобы отменить экранирование идентификатора. [...]
- ^ PEP 008 : Описательное: стили именования
- ^ C99 , 7.1.3 Зарезервированные идентификаторы Стандарт
- ^ Твайман, Майкл. «Смелая идея: использование смелых шрифтов в девятнадцатом веке». Журнал Полиграфического исторического общества . 22 (107–143).
- ^ Трасс, Линн (2004), Ест, стреляет и уходит: подход нулевой терпимости к пунктуации , Нью-Йорк: Gotham Books, стр. 146, ISBN 978-1-59240-087-4
- ^ «Стили почерка» . Ригсаркивет . Датский национальный архив . Проверено 26 марта 2017 г.
- ^ «Как писать научные названия организмов» (PDF) , Competition Science Vision , получено 20 июня 2011 г.
- ^ Подборка юридических принципов, классифицированных и проиллюстрированных в Google Книгах.
- ^ Двойной Дайджирин
«Хира» означает «обычный» или «легкий» и означает, что это была система письма, широко использовавшаяся в то время. Кандзи — общедоступный иероглиф, используемый для написания писем и важных текстов, тогда как хирагана — личный иероглиф, используемый людьми, мало знающими кандзи.
Перевод: 平 [часть «хира» в слове «хирагана»] означает «обычный» или «простой», поскольку в то время [когда было дано это имя] это была система письма для повседневного использования. В то время как кандзи было официальной системой, используемой для написания писем и важных текстов, хирагана предназначалась для личного использования людьми, которые имели ограниченные знания кандзи. - ^ «Японская каллиграфия» . Британская энциклопедия . Проверено 22 июня 2017 г.
- ^ «Хирагана, Катакана и Кандзи» . Символы японского слова. 08.09.2010 . Проверено 15 октября 2011 г.
Дальнейшее чтение [ править ]
- Хансен, WJ; Бум, HJ (1978). «Отчет о стандартном аппаратном представлении для пересмотренной версии ALGOL 68». Акта Информатика . 9 (2): 105–119. дои : 10.1007/BF00289072 . S2CID 34231916 .
- Линдси, Чарльз Ходжсон (март 1970 г.), «Представление ISO-кода для АЛГОЛА 68» , Бюллетень АЛГОЛА (31), ACM: 37–60, AB31.3.6