Орграфы и триграфы

редактировать

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

Существуют различные причины использования диграфов и триграфов: на клавиатуре могут отсутствовать клавиши, охватывающие весь набор символов языка, ввод специальных символов может быть затруднен, некоторые символы могут быть зарезервированы для специальных использование и так далее. Триграфы могут также использоваться для некоторых кодовых страниц EBCDIC , в которых отсутствуют символы, такие как {и }.

Содержание
  • 1 История
  • 2 Реализации
  • 3 Поддержка языков
    • 3.1 АЛГОЛ
    • 3.2 Паскаль
    • 3.3 J
    • 3.4 C
    • 3.5 C ++
    • 3.6 RPL
  • 4 Поддержка приложений
    • 4.1 Vim
    • 4.2 Экран GNU
    • 4.3 Lotus
  • 5 См. Также
  • 6 Ссылки
  • 7 Внешние ссылки
История

Базовым набором символов языка программирования C является подмножество набора символов ASCII, которое включает девять символов, лежащих вне инвариантного набора символов ISO 646. Это может создать проблему для записи исходного кода, когда используемая кодировка (и, возможно, keyboard ) не поддерживает ни один из этих девяти символов. Комитет ANSI C изобрел триграфы как способ ввода исходного кода с помощью клавиатуры, поддерживающей любую версию набора символов ISO 646.

Реализации

Триграфы обычно не встречаются вне компилятора наборов тестов. Некоторые компиляторы поддерживают возможность отключения распознавания триграфов или отключения триграфов по умолчанию и требуют включения их. Некоторые могут выдавать предупреждения при обнаружении триграфов в исходных файлах. Borland предоставил отдельную программу, препроцессор триграфа (TRIGRAPH.EXE), для использования только тогда, когда требуется обработка триграфа (цель заключалась в максимальном увеличении скорости компиляции).

Поддержка языков

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

АЛГОЛ

Ранние версии АЛГОЛА предшествовали стандартизированным наборам символов ASCII и EBCDIC и обычно реализовывались с использованием специфичного для производителя шестибитного кода символа. Ряду операций ALGOL либо не хватало кодовых точек в доступном наборе символов, либо они не поддерживались периферийными устройствами, что привело к ряду замен, включая : =для ( присвоение) и >=для (больше или равно).

Pascal

Язык программирования Pascal поддерживает орграфы (., .), (*и *)для [, ], {и }соответственно. В отличие от всех других случаев, упомянутых здесь, (*и *)были и до сих пор широко используются. Однако многие компиляторы рассматривают их как другой тип блока комментариев, а не как фактические орграфы, то есть комментарий, начинающийся с (*не может быть закрыт с помощью }и наоборот.

J

Язык программирования J является потомком APL, но использует набор символов ASCII, а не символы APL. Поскольку печатаемый диапазон ASCII меньше, чем у APL специальный набор символов, .(точка) и :(двоеточие) символы используются для склонения символов ASCII, эффективно интерпретируя униграфы, орграфы или редко триграфы как отдельные «символы».

В отличие от использования орграфов и триграфов в C и C ++, в J. нет односимвольных эквивалентов им.

C

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

ТриграфЭквивалент
?? =#
?? /\
?? '^
?? ([
??)]
??!|
??<{
??>}
?? -~

Программа mer может захотеть поместить два вопросительных знака вместе, но не заставить компилятор рассматривать их как вводящие триграфик. Грамматика C не допускает двух последовательных токенов ?, поэтому единственные места в файле C, где могут использоваться два вопросительных знака подряд, - это многосимвольные константы, строковые литералы, и комментарии. Это особенно проблема для классической Mac OS, где константа '????'может использоваться как тип файла или создатель. Чтобы безопасно разместить два последовательных вопросительных знака в строковом литерале, программист может использовать конкатенацию строк "...?" "?..."или escape-последовательность "...? \?... ".

???сам по себе не является триграфической последовательностью, но если за ним следует такой символ, как -, он будет интерпретирован как ?+ ? ? -, как в приведенном ниже примере, у которого 16 ?перед /.

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

// Будет ли выполнена следующая строка ???????????????? / a ++;

, которая представляет собой одну строку логического комментария (используется в C ++ и C99 ), и

/ ?? / * комментарий * ?? / /

, который является правильно сформированным комментарием блока. Эту концепцию можно использовать для проверки триграфов, как в следующем примере C99, где будет выполняться только один оператор возврата.

int trigraphsavailable () // возвращает 0 или 1; стандарт языка C99 или новее {// доступны ли триграфы ?? / return 0; возврат 1; }
ДиграфЭквивалент
<:[
:>]
<%{
%>}
%:#
%:%:##

В 1994 году нормативная поправка к стандарту C, включенная в C99, предоставила орграфы в качестве более удобочитаемых альтернатив пяти триграфам. Они перечислены в таблице справа.

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

C ++

TokenЭквивалент
comp~
not!
bitand
bitor|
и
or||
xor^
and_eq=
or_eq|=
xor_eq^=
not_eq!=

C ++ (через C ++ 14, см. ниже) ведет себя как C, включая дополнения C99, но с дополнительными токенами перечислены в таблице.

В качестве примечания, %:%:обрабатывается как один токен, а не как два вхождения %:.

. Стандарт C ++ делает этот комментарий в отношении термин "орграф":

Термин "орграф" (токен, состоящий из двух символов) не является полностью описательным, поскольку один из альтернативных токенов предварительной обработки - %:%:и, конечно, несколько основных токенов содержат два символа. Тем не менее, те альтернативные токены, которые не являются лексическими ключевыми словами, в просторечии известны как "орграфы".

Триграфы были предложены для устаревания в C ++ 0x, который был выпущен как C ++ 11. Против этого выступил IBM, выступавший от имени себя и других пользователей C ++, и в результате триграфы были сохранены в C ++ 11. Затем триграфы были снова предложены для удаления (не только для устаревания) в C ++ 17. Это прошло голосование комитета, и триграфы (но не дополнительные токены) были удалены из C ++ 17, несмотря на противодействие со стороны IBM. Существующий код, использующий триграфы, может поддерживаться переводом из исходных файлов (синтаксический анализ триграфов) в базовый исходный набор символов, который не включает триграфы.

RPL

Hewlett-Packard калькуляторы, поддерживающие Язык RPL и метод ввода обеспечивают поддержку большого количества триграфов (также называемых кодами TIO) для надежной транскрибирования не семибитных символов ASCII расширенного набора символов калькуляторов на иностранных платформах, а также для облегчения ввода с клавиатуры без использования приложения CHARS. Первый символ всех кодов TIO - это \, за которым следуют два других символа ASCII, отдаленно напоминающих глиф, который нужно заменить. Все остальные символы могут быть введены с использованием специального синтаксиса кода \ nnnTIO, где nnn является трехзначным десятичным числомведущими нулями, если необходимо) соответствующая кодовая точка (тем самым формально представляя тетраграф ).

Поддержка приложений

Vim

Текстовый редактор поддерживает диграфы для фактического ввода текстовых символов, следующих за RFC 1345. По умолчанию запись орграфов привязана к Ctrl+K. Список всех возможных орграфов можно отобразить, набрав : dig.

Экран GNU

Экран GNU имеет команду орграфа, привязанную к Ctrl+ACtrl+Vпо умолчанию.

Lotus

Lotus 1 -2-3 для DOS использует Alt+F1в качестве клавиши создания, чтобы упростить ввод многих специальных символов из международного набора символов Lotus (LICS) и Многобайтовый набор символов Lotus (LMBCS).

См. Также
  • icon Портал компьютерного программирования
Ссылки
Внешние ссылки
Последняя правка сделана 2021-05-17 06:03:27
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте