Директивы предварительной обработки

Общее описание

Директива #NAME

Директива #INDEX_LANGUAGE

Директива #CONTENTS_LANGUAGE

Директива #SOURCE_CODE_PAGE

Директива #INCLUDE

Директива #ICON_FILE

Директива #LANGUAGE

Директива #FULL_NAME

Общее описание

Синонимами к термину «директива предварительной обработки» являются: директива препроцессора (англ. preprocessor directive), команда препроцессора (англ. preprocessor command).

Директива предварительной обработки — это команда к выполнению программы предварительной обработки данных до начала основного процесса обработки данных. Подобные программы называются препроцессорами и обычно используются при таких задачах, как компилирование. Одно компилирование может предварять несколько разных препроцессоров. Во многих языках программирования при написании кода употребляются директивы препроцессора, например в C, Perl и других.

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

Директивы делятся на обязательные и необязательные.

Обязательных директив всего три: #NAME, #INDEX_LANGUAGE и #CONTENTS_LANGUAGE. При отсутствии одной из них процесс компилирования словаря прервётся с сообщением об ошибке.

Директива в DSL состоит из ключевого слова и значения. Ключевое слово всегда начинается со знака решётки #. Значение заключается в двойные кавычки и отделяется от ключевого слова при помощи пробела (одного или нескольких) или табуляции (одной или нескольких).

Для обрамления значений недопустимо использование кавычек, отличных от двойных.

В области значений разрешается размещать служебные комментарии {{…}}. При компиляции они будут проигнорированы и в окнах словарной программы нигде не отобразятся.

Одна директива занимает одну, отдельную строку файла. Команда директивы # должна располагаться в начале строки (на первой позиции). Наличие перед командой пробела, табуляции или любого другого символа приведёт к ошибке при компилировании[1].

Несколько директив, следующих друг за другом, составляют заголовочную часть словаря, т.н. «шапку». Между строками директив допускается наличие пустых строк.

Порядок расположения директив в «шапке» относительно друг друга не имеет значения. Однако, рекомендуется соблюдать следующую последовательность:

  1. На первом месте (строке) директива #NAME.
  2. На втором месте (строке) директива #INDEX_LANGUAGE.
  3. На третьем месте (строке) директива #CONTENTS_LANGUAGE.
  4. На следующих местах (строках) другие необязательные директивы.

Пример обязательной «шапки» :: Запись в DSL

#NAME			"Словарь синонимов (Ru-Ru)"
#INDEX_LANGUAGE		"Russian"
#CONTENTS_LANGUAGE	"Russian"

карточка
	[m1]фотография, снимок; визитка[/m]

Известно, что директивы использовались в словарях DSL уже в Lingvo версии 6. Первоначально существовали всего лишь две директивы: #FULL_NAME и #LANGUAGE — обе без упоминания в документации. Первая содержала наименование словаря, а вторая — язык словарных заголовков. В Lingvo 8 было введено в употребление основное большинство современных директив и правила их использования были освещены в официальном справочном руководстве.

Директива #NAME

Назначение: Указание «внутреннего» наименования словаря.

Использование: Только в файлах основного текста *.dsl и аббревиатур *_abrv.dsl.

Синтаксис: Обязательная директива. Должна располагаться в начале файла, в его первых строках.

Команда директивы # должна располагаться в начале строки (на первой позиции). Наличие перед командой пробела, табуляции или любого другого символа приведёт к ошибке при компилировании.

Значение директивы: «внутреннее» наименование словаря. «Внутренним» оно называется потому, что используется для отображения в окнах словарной программы. В Lingvo оно отображается в верхней правой части словарной карточки (или в левой, если язык словаря — правосторонний) и во всех списках словарей. В силу характера использования «внутреннее» наименование должно быть по возможности лаконичным и выразительным для того, чтобы лучше воспринималось и умещалось в упомянутых местах.

Длина «внутреннего» наименования словаря не должна превышать 255 символов.

В конце наименования рекомендуется указывать языковую пару словаря в скобках и через дефис, например, (En-Ru) или (Eng-Rus). В словарях от ABBYY в языковых парах используются 2-буквенные сокращения, согласно стандарту ISO-639-1. Соглашение лексикографов в данном случае рекомендует употреблять 3-буквенные сокращения, по стандарту ISO-639-3 (или ISO-639-2).

Значение обрамляется двойными кавычками. Использование для этой цели кавычек другого типа недопустимо.

Пример директивы #NAME :: Запись в DSL

#NAME	"Синонимы и антонимы (Ru-Ru)"

Между обрамляющими наименование двойными кавычками разрешается размещать любые другое символы, включая сами двойные кавычки. Так, например, запись #NAME "Энциклопедия "Слова о полку Игореве" (Ru-Ru)" будет работоспособна и отобразится в окнах словарной программы, как Энциклопедия "Слова о полку Игореве" (Ru-Ru).

Разрешается, но не рекомендуется использовать в наименовании символы квадратных скобок [ ], т.к. они вызывают ошибку в оболочке Lingvo версий от x5 и выше[2].

Рекомендуемая форма наименованийНерекомендуемая форма наименований
Малый академический словарь (Ru-Ru)Малый академический словарь русского языка
Греческие пословицы и поговорки (El-Ru)Новогреческо-русский словарь греческих пословиц и поговорок с подбором аналогов в русском языке (El-Ru)
Marketing (En-Ru)The New English-Russian Dictionary of Marketing and Commerce

История: Директива введена в употребление в Lingvo 8.

Директива #INDEX_LANGUAGE

Назначение: Указание языка заголовков словаря.

Использование: Только в файлах основного текста *.dsl и аббревиатур *_abrv.dsl.

Синтаксис: Обязательная директива. Должна располагаться в начале файла, в его первых строках.

Команда директивы # должна располагаться в начале строки (на первой позиции). Наличие перед командой пробела, табуляции или любого другого символа приведёт к ошибке при компилировании.

Значение директивы: английское наименование языка согласно стандарту ISO-639-2. Могут быть использованы только языки, поддерживаемые в Lingvo (см. Список поддерживаемых языков). Значение чувствительно к регистру символов и должно указываться в точности так, как оно приводится в ISO-639-2. Так, например, форма "English" является правильной, а "english" и "ENGLISH" — нет.

Значение обрамляется двойными кавычками. Использование для этой цели кавычек другого типа недопустимо.

Пример директивы языка заголовков :: Запись в DSL

#INDEX_LANGUAGE		"English"

Особенности: Если в значении указать неподдерживаемый в Lingvo язык, то компилирование словаря прервётся с сообщением об ошибке.

Если фактический язык заголовков не соответствует языку, указанному в директиве, то это повлияет на поведение Lingvo при выполнении задач, связанных с языковыми особенностями (такими, например, как показ грамматических форм). Подробнее об этом см. в главе о тэге языковой разметки.

История: Директива введена в употребление в Lingvo 8.

Директива #CONTENTS_LANGUAGE

Назначение: Указание языка переводной / толковательной части словаря.

Использование: Только в файлах основного текста *.dsl и аббревиатур *_abrv.dsl.

Синтаксис: Обязательная директива. Должна располагаться в начале файла, в его первых строках.

Команда директивы # должна располагаться в начале строки (на первой позиции). Наличие перед командой пробела, табуляции или любого другого символа приведёт к ошибке при компилировании.

Значение директивы: английское наименование языка согласно стандарту ISO-639-2. Могут быть использованы только языки, поддерживаемые в Lingvo (см. Список поддерживаемых языков). Значение чувствительно к регистру символов и должно указываться в точности так, как оно приводится в ISO-639-2. Так, например, форма "Russian" является правильной, а "russian" и "RUSSIAN" — нет.

Значение обрамляется двойными кавычками. Использование для этой цели кавычек другого типа недопустимо.

Пример директивы языка переводов :: Запись в DSL

#CONTENTS_LANGUAGE		"Russian"

Особенности: Если в значении указать неподдерживаемый в Lingvo язык, то компилирование словаря прервётся с сообщением об ошибке.

Если фактический язык переводов не соответствует языку, указанному в директиве, то это повлияет на поведение Lingvo при выполнении задач, связанных с языковыми особенностями (такими, например, как показ грамматических форм). Подробнее об этом см. в главе о тэге языковой разметки.

История: Директива введена в употребление в Lingvo 8.

Директива #SOURCE_CODE_PAGE

Назначение: Указание имени кодовой страницы.

Использование: Только в файлах основного текста *.dsl и аббревиатур *_abrv.dsl. Только в случаях, когда файл словаря сохранён в кодировке ANSI.

Синтаксис: Необязательная директива. Должна располагаться в начале файла, в его первых строках.

Команда директивы # должна располагаться в начале строки (на первой позиции). Наличие перед командой пробела, табуляции или любого другого символа приведёт к ошибке при компилировании.

Значение директивы: специальное наименование кодовой страницы в Windows. Могут быть использованы только наименования, поддерживаемые в Lingvo (см. главу Кодовые страницы ANSI в Windows). Значение чувствительно к регистру символов и должно указываться в точности так, как оно приводится в указанном списке. Так, например, форма "Cyrillic" является правильной, а "cyrillic" и "CYRILLIC" — нет.

Значение обрамляется двойными кавычками. Использование для этой цели кавычек другого типа недопустимо.

Пример директивы кодовой страницы :: Запись в DSL

#SOURCE_CODE_PAGE		"EasternEuropean"

Замечания: Если файл словаря сохранён в кодировке Unicode (UTF-16 LE), то использование #SOURCE_CODE_PAGE (т.е. дополнительное определение кодовой страницы) не требуется. В этом случае компилятор проигнорирует значение директивы.

При сохранении файла словаря в кодировке ANSI важно учесть, что язык заголовков и язык перевода / толкований должны принадлежать одной кодовой странице. Если это не так, файл должен быть сохранен в кодировке Unicode. Соответствия языков и их кодовых страниц см. в таблице Коды локалей Microsoft.

История: Директива введена в употребление в Lingvo 8.

Директива #INCLUDE

Назначение: Добавление дополнительных файлов с текстом словаря.

Использование: Только в файлах основного текста *.dsl.

Синтаксис: Необязательная директива. Должна располагаться в начале файла, в его первых строках.

Команда директивы # должна располагаться в начале строки (на первой позиции). Наличие перед командой пробела, табуляции или любого другого символа приведёт к ошибке при компилировании.

Значение директивы: путь к дополнительному файлу с текстом словаря. Пути могут быть абсолютными и относительными. Обратную косую черту, используемую в пути, необходимо удваивать: \\.

Значение обрамляется двойными кавычками. Использование для этой цели кавычек другого типа недопустимо.

Указание абсолютного пути :: Запись в DSL

#INCLUDE		"c:\\Lingvo\\Dictionaries\\rus-rus_synonyms-2.dsl"

Дополнительный файл в одной папке с исходным :: Запись в DSL

#INCLUDE		"rus-rus_synonyms-2.dsl"

Дополнительный файл в подпапке рядом с исходным :: Запись в DSL

#INCLUDE		"Extra\\rus-rus_synonyms-2.dsl"

Дополнительный файл папкой выше от исходного :: Запись в DSL

#INCLUDE		"..\\Thesaurus\\rus-rus_synonyms-2.dsl"

Замечания: В Lingvo директива обрабатывается следующим образом: во время компилирования основного файла словаря, его содержимое объединяется с содержимым дополнительного файла и записывается в результирующий LSD.

GoldenDict не поддерживает обработку данной директивы.

История: Первое упоминание об #INCLUDE встречается в официальном справочном руководстве к Lingvo 9.

Директива #ICON_FILE

Недокументированная директива

Назначение: Указание местонахождения файла иконки для словаря.

Использование: Только в файлах основного текста *.dsl.

Синтаксис: Необязательная директива. Должна располагаться в начале файла, в его первых строках.

Команда директивы # должна располагаться в начале строки (на первой позиции). Наличие перед командой пробела, табуляции или любого другого символа приведёт к ошибке при компилировании.

Значение директивы: путь к файлу иконки. Пути могут быть абсолютными и относительными. Обратную косую черту, используемую в пути, необходимо удваивать: \\. Примеры путей см. выше, в главе Директива #INCLUDE.

Значение обрамляется двойными кавычками. Использование для этой цели кавычек другого типа недопустимо.

История: Директива появилась в системных словарях Lingvo x5 (15.0).

Директива #LANGUAGE

Назначение: Языковая разметка словарных аннотаций.

Использование: Только в файлах аннотаций *.ann.

Синтаксис: Необязательная директива. Может располагаться на любой строке файла, а не только на первой.

Расположение команды директивы # на первой позиции в начале строки не обязательно. Допускается наличие перед командой пробелов и табуляций.

Значение директивы: английское наименование языка согласно стандарту ISO-639-2. Могут быть использованы только языки, поддерживаемые в Lingvo (см. Список поддерживаемых языков). Значение чувствительно к регистру символов и должно указываться в точности так, как оно приводится в ISO-639-2. Так, например, форма "English" является правильной, а "english" и "ENGLISH" — нет.

Значение обрамляется двойными кавычками. Использование для этой цели кавычек другого типа недопустимо.

Общее описание: Директива делит аннотацию на части. Частью считается фрагмент текста от одной строки с директивой до другой строки с директивой или до конца файла. Каждой части присваивается язык, указанный в значении её директивы.

Употребление директив #LANGUAGE :: Запись в ANN

#LANGUAGE "Russian"
LatinAmerican (Es-Ru) (к версии ABBYY Lingvo x5)

Испанско-русский словарь. Латинская Америка. © «Русский язык-Медиа», 2004, Фирсова Н.М. 50 тыс. слов и словосочетаний.

#LANGUAGE "English"
LatinAmerican (Es-Ru) (for ABBYY Lingvo x5)

The Spanish-Russian Dictionary of Latin America. © Russkiy Yazyk - Media, 2004, N.M. Firsova. 50,000 words and phrases.

#LANGUAGE "Ukrainian"
LatinAmerican (Es-Ru) (до версії ABBYY Lingvo x5)

Іспансько-російський словник. Латинська Америка. © «Русский язык-Медиа», 2004, Фірсова Н.М. 50 тис. слів і словосполучень.

При вызове окна с аннотацией, в нём отобразится та языковая часть, которая соответствует языку интерфейса программы, выбранному в настройках. Остальные языковые части будут скрыты. Рассмотрим эти действия подробнее.

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

Правильность оформления в этом случае требует особого внимания. DSL Compiler не проверяет аннотации на синтаксические ошибки, следовательно допущенные неточности всплывают позже, при поиске совпадений. Если одна из директив оформлена неправильно, то совпадение найдено не будет, и соответствующая языковая часть не отобразится. Если же не найдётся ни одной правильно оформленной #LANGUAGE, то окно аннотации откроется пустым, без текста.

Появления пустого окна можно избежать, поместив в начало аннотации текст без директивы. Он будет отображён при отсутствии совпадений и английской части.

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

Язык Наименование Используется в Lingvo
Английский English 12, x3, x5, x6
Русский Russian 12, x3, x5, x6
Украинский Ukrainian 12, x3, x5, x6
Казахский Kazakh x3, x5, x6
Испанский SpanishTraditionalSort x3, x5
Немецкий German x3
Французский French x3
Польский Polish x3
Китайский Chinese x3

Замечание: GoldenDict не поддерживает обработку данной директивы.

История: В Lingvo 6 и 7 #LANGUAGE (в паре с устаревшей #FULL_NAME) использовалась в файле основного текста и в её значении указывался язык словарных заголовков. В Lingvo 8 состав директив был переработан и употребление #LANGUAGE было отвергнуто. Позднее директива перекочевала в файл аннотации. Первое упоминание о ней в контексте создания аннотаций встречается в официальном справочном руководстве к Lingvo 12.

Директива #FULL_NAME

Устаревшая директива, ныне недействующая. Использовалась без упоминания в документации в Lingvo 6 и 7 для указания «внутреннего» наименования словаря. В Lingvo 8 её полностью заменила #NAME. Попытка откомпилировать #FULL_NAME в современном компиляторе (x6) возбуждает протест Unknown pre-processor keyword.


[1] Исключение составляет только директива #LANGUAGE.

[2] Если во внутреннем наименовании словаря присутствуют символы квадратных скобок, то после перезапуска оболочки в Lingvo x5 такой словарь самопроизвольно пропадает с полки, а в Lingvo x6 вдобавок перестаёт показывать карточки (т.е. при щелчке по заголовкам карточки не открываются). В Lingvo x3 и в GoldenDict этой проблемы нет.