В компьютерных языковой конструкции, stropping представляет собой метод явно маркировки последовательностей букв, как имеющие особое свойство, например, быть ключевым словом, или определенный типа переменных или временным хранение, и, таким образом, обитающее другое пространство имен от обычных имен ( «идентификаторов»), во избежание столкновений. Растягивание не используется в большинстве современных языков - вместо этого ключевые слова являются зарезервированными словами и не могут использоваться в качестве идентификаторов. Обтягивание позволяет использовать одну и ту же последовательность букв как в качестве ключевого слова, так и в качестве идентификатора и упрощает синтаксический анализ в этом случае - например, разрешая переменную с именем if
без конфликтов с ключевым словом if.
Строппинг в первую очередь ассоциируется с АЛГОЛОМ и родственными ему языками 1960-х годов. Хотя он находит некоторое современное применение, его легко спутать с другими похожими методами, внешне похожими.
Метод штриховки и термин "штриховка" возникли при разработке АЛГОЛА в 1960-х годах, где он использовался для обозначения типографских различий (жирный шрифт и подчеркивание), обнаруженных в языке публикации, которые не могли быть напрямую представлены на языке аппаратных средств - a пишущая машинка могла иметь жирный шрифт, но в кодировке на перфокартах жирный шрифт отсутствовал. Термин «штриховка» возник в АЛГОЛе 60 от « апострофа », поскольку некоторые реализации АЛГОЛА 60 использовали апострофы вокруг текста для обозначения жирным шрифтом, например, 'if'
для представления ключевого слова if. Штриховка также важна в АЛГОЛе 68, где используются несколько методов штриховки, известные как «режимы штриховки»; исходные совпадающие апострофы из АЛГОЛА 60 не использовались широко, причем чаще использовались начальная точка или прописные буквы, как в .IF
или, IF
и ко всем этим применялся термин «зачистка».
Был использован ряд различных синтаксисов для строппинга:
'BEGIN'
).'BEGIN
)На самом деле часто бывает, что на одном языке может использоваться несколько соглашений о штриховке. Например, в АЛГОЛе 68 выбор соглашения о сглаживании может быть определен директивой компилятора (в терминологии АЛГОЛа, « прагматикой »), а именно POINT, UPPER, QUOTE или RES:
.FOR
- аналогичное соглашение используется в ФОРТРАНЕ 77, где ключевые слова ЛОГИЧЕСКИЕ помечаются как .EQ.
и т. Д. (См. Ниже)FOR
- с нижним регистром, используемым для обычных идентификаторов'for'
for
зарезервированы и недоступны для обычных идентификаторов.Различные режимы правил представляют собой лексическую спецификацию для штриховых символов, хотя в некоторых случаях они имеют простую интерпретацию: в режимах с одним апострофом и точкой первый символ функционирует как escape-символ, в то время как в режиме согласованных апострофов апострофы функционируют как разделители, как в строковых литералах.
Другие примеры:
underlined
использовать обратный пробел и замену на клавиатуре Flexowriter, они могут быть введены с помощью %percent %symbol
или они могут быть введены UPPER CASE
без символа-разделителя (режим «ограничители верхнего регистра», в этом случае все переменные должны быть быть в нижнем регистре).%percent %symbol
соглашение о префиксе Atlas Autocode, но не другие его параметры выравниванияОбратите внимание на ведущую директиву pr (сокращение от pragmat), которая сама выделена в стиле POINT или кавычки, и на комментарий (от " ") - см. АЛГОЛ 68: pr amp; co: Pragmats и комментарии для подробностей. ¢
2¢
Algol68 "строгий", как обычно публикуется | Расстановка цитат (например, вики-текст ) | Для компилятора 7-битного символьного кода | Для компилятора 6-битного символьного кода | Algol68 с использованием коррекции резкости (зарезервированное слово) |
---|---|---|---|---|
¢ подчеркнуть или жирный шрифт ¢ режим xint = int ; xint sum 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.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 |
По разным причинам, Fortran 77 имеет это "логическое" значение и оператор: .TRUE., .FALSE., .EQ., .NE., .LT., .LE., .GT., .GE., .EQV., .NEQV., .OR., .AND.,.NOT.
.AND., .OR.А .XOR.также используются в комбинированных тестов в IF
и IFF
отчетности в пакетных файлах выполняющихся JP Software командной строки процессоров «s как 4DOS, 4OS2 и 4NT / Take Command.
В большинстве современных компьютерных языков строчка не используется, за двумя заметными исключениями:
Использование многих языков в Microsoft .NET Common Language Infrastructure (CLI) требует способа использования переменных на другом языке, которые могут быть ключевыми словами на вызывающем языке. Иногда это делается с помощью префиксов, например @
в C #, или заключения идентификатора в скобки в Visual Basic.NET.
Второй важный пример - во многих реализациях языка структурированных запросов. В этих языках зарезервированные слова могут использоваться в качестве имен столбцов, таблиц или переменных, лексически ограничивая их. Стандарт определяет заключение зарезервированных слов в двойные кавычки, но на практике точный механизм зависит от реализации; MySQL, например, позволяет использовать зарезервированные слова в других контекстах, заключая их в обратные кавычки, а Microsoft SQL Server использует квадратные скобки.
Строппинг также можно использовать в языке программирования Nim. В Nim зарезервированное слово можно использовать в качестве идентификатора, заключив его в обратные кавычки.
Есть и другие, более второстепенные примеры. Например, Web IDL использует начальное подчеркивание _
для привязки идентификаторов, которые в противном случае конфликтуют с зарезервированными словами: значение идентификатора удаляет это начальное подчеркивание, создавая это сглаживание, а не соглашение об именах.
Во внешнем интерфейсе компилятора отключение строк изначально происходило на этапе восстановления начальной строки, что также устраняло пробелы. Затем последовал анализ без сканирования (без токенизации); это было стандартом в 1960-х, особенно для АЛГОЛА. В современном обиходе снятие пропуска обычно выполняется как часть лексического анализа. Это станет ясно, если разделить лексический анализатор на две фазы: сканер и анализатор: сканер классифицирует штрихованную последовательность в правильную категорию, а затем анализатор прекращает выполнение при вычислении значения. Например, на языке, где начальное подчеркивание используется для привязки идентификаторов, чтобы избежать конфликтов с зарезервированными словами, последовательность _if
будет классифицироваться if
сканером как идентификатор (а не как зарезервированное слово), а затем оценщик даст этому значение if
, уступая (Identifier, if)
как тип и значение токена.
Существует ряд аналогичных методов, как правило, с префиксом или суффиксом идентификатора для обозначения различного обращения, но семантика различна. Строго говоря, строппинг состоит из разных представлений одного и того же имени (значения) в разных пространствах имен и происходит на этапе токенизации. Например, в АЛГОЛЕ 60 с совпадающим штриховкой апострофа токенизируется 'if'
как (Ключевое слово, если), а if
токенизируется как (Идентификатор, если) - то же значение в разных классах токенов.
Использование прописных букв для ключевых слов по-прежнему используется в качестве соглашения для написания грамматик для лексирования и синтаксического анализа - токенизация зарезервированного слова if
как класса токена IF, а затем представление предложения if-then-else с помощью фразы, IF Expression THEN Statement ELSE Statement
где термины в верхнем регистре являются ключевыми словами, а термины с заглавной буквы - нетерминальные символы в производственном правиле ( терминальные символы обозначаются строчными буквами, такими как identifier
или integer
, для целочисленного литерала ).
Чаще всего можно использовать соглашения об именах, чтобы избежать конфликтов, обычно с префиксом или суффиксом с подчеркиванием, например, if_
или _then
. Верхнее подчеркивание часто используется для обозначения закрытых членов в объектно-ориентированном программировании.
Эти имена могут интерпретироваться компилятором и иметь определенный эффект, хотя обычно это делается на этапе семантического анализа, а не на этапе токенизации. Например, в Python одинарное подчеркивание в начале является слабым частным индикатором и влияет на то, какие идентификаторы импортируются при импорте модуля, в то время как двойное подчеркивание (и не более одного подчеркивания в конце) в атрибуте класса вызывает изменение имени.
В то время как современные языки обычно используют зарезервированные слова, а не зарезервированные, чтобы отличать ключевые слова от идентификаторов - например, делая if
зарезервированные - они также часто резервируют синтаксический класс идентификаторов в качестве ключевых слов, давая представления, которые можно интерпретировать как режим зарезания, но вместо этого имеют семантику зарезервированные слова.
Это наиболее заметно в C, где идентификаторы, начинающиеся с символа подчеркивания, зарезервированы, хотя точные сведения о том, какие идентификаторы зарезервированы в какой области действия, а ведущие двойные подчеркивания зарезервированы для любого использования; аналогично в C ++ любой идентификатор, содержащий двойное подчеркивание, зарезервирован для любого использования, а идентификатор, который начинается с подчеркивания, зарезервирован в глобальном пространстве. Таким образом, можно добавить новое ключевое слово, 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
, например, включать информацию о типе.
Синтаксически похожим, но семантически разным явлением являются сигилы, которые вместо этого указывают свойства переменных. Они распространены в Perl, Ruby и различных других языках для определения характеристик переменных / констант: Perl для обозначения типа переменной, Ruby для отличия переменных от констант и для обозначения области действия. Обратите внимание, что это влияет на семантику переменной, а не на синтаксис того, является ли она идентификатором или ключевым словом.
Строппинг используется в языках программирования для облегчения работы компилятора (или, точнее, анализатора ), то есть в пределах возможностей относительно небольших и медленных компьютеров, доступных на заре вычислений в 20 веке. Тем не менее, подобные методы обычно используются для помощи людям в понимании прочитанного. Вот несколько примеров: