4. Резервные слова в языке EasyFlow.
Синтаксис и семантика языка
Язык EasyFlow имеет следующие основные характеристики:
· EasyFlow является языком, зависимым от регистра (т. е. myVariable и MyVariable представляют собой различные идентификаторы);
· типизация переменных – динамическая, слабая, с ограниченными возможностями по указанию типов;
· язык является платформенно-независимым (с точки зрения различия операционных систем и вычислительных платформ);
· язык является интерпретируемым.
Во всём коде скрипта допускается использовать символ перевода строки. Не допускается разрывать данным символом идентификаторы и резервные слова.
Как в любом языке программирования в EasyFlow предусмотрены резервные слова, которые нельзя использовать для именования идентификаторов. Перечень резервных слов с краткими пояснениями приведён в табл. 4.1.
Табл. 4.1. Резервные слова EasyFlow
№ п/п |
Резервное слово |
Назначение |
1 |
require |
директива, определяющая перечень указателей (файловых переменных) на требуемые для скрипта исходные файлы |
2 |
step |
директива, определяющая вызов пакета (шаг потока) |
3 |
runs |
оператор определения вызываемого на шаге пакета |
4 |
sweep |
оператор перебора по значениям элемента перечислимого множества |
5 |
on |
определение режима синхронизации запуска шагов в приложении |
6 |
true |
булева константа «истина» |
7 |
false |
булева константа «ложь» |
8 |
flow |
префикс атрибутов потока |
Идентификаторы в EasyFlow могут начинаться на букву латинского алфавита или знак подчеркивания и содержать, помимо этого, любое количество букв латинского алфавита, цифр и знаков подчеркивания. Как во всех популярных языках программирования именовать идентификатор с цифры в EasyFlow не допускается.
Идентификаторы могут обозначать переменные (ID) или константы (ID_CONST), которые отличаются от переменных префиксом «@».
Строки в EasyFlow заключаются в двойные кавычки «"». Внутри кавычек могут находиться буквенно-цифровые символы, иные символы (кроме двойных кавычек) и escape-последовательности для задания специальных символов, которые нельзя или невозможно явно указать в строке. Перечень escape-последовательностей символов приведён ниже.
· «"» – символ «"» (двойные кавычки);
· «b» – символ backspace;
· «t» – символ табуляции;
· «n» – символ перевода строки;
· «f» – символ разрыва раздела;
· «r» – символ возврата каретки;
· «»– символ «»;
· «'» – символ «'» (одинарные кавычки).
Также строки могут содержать коды символов в шестнадцатеричном (вида «uXXXX», где X – шестнадцатеричная цифра) и восьмеричном (вида «ХХХ», где Х – восьмеричная цифра) представлениях.
Комментарии. Всюду в тексте скрипта можно вставлять однострочные комментарии после пар символов «//» и до конца строки, которые игнорируются парсером. Многострочные комментарии заключаются внутри пар символов «/*» и «*/».
В качестве служебных символов используются следующие символы: «{», «}», «[», «]», «(», «)», «=», «;» (точка с запятой), «:» (двоеточие), «.» (точка), «,» (запятая).
Целые числа в EasyFlow представляются стандартным образом в десятичной системе счисления и могут иметь знак.
Вещественные числа в EasyFlow представляются стандартным образом в десятичной системе счисления и могут иметь знак, мантиссу и порядок (примеры: 0.14, 0.15e+14, .34e10, 5.e–14). Очевидно, 0.142е+2 не что иное, как 14.2 (мантисса – 0,142, а порядок – 2).
Булевы константы в EasyFlow представляют собой ключевые слова: true (истина) и false (ложь).
Выражения в EasyFlow текущей версии могут содержать только один унарный оператор на верхнем уровне. При этом допускается вложенность операторов. Арифметические операции в выражениях, а также ведущий минус не допускается. Выражение могут определять одно из следующих значений:
· строка;
· целое число;
· дробное число;
· булева константа;
· константу (ID_CONST, см. выше);
· выражение доступа (см. ниже);
· выражение множества (см. ниже);
Выражения доступа. В EasyFlow для описания доступа к различным сложным объектам (именам пакетов, структурам) используются выражения доступа (varIdentifier), которые представляют собой идентификаторы, разделенные точками, и, возможно, имеющие индексаторы, заключенные в квадратные скобки (примеры: object.Field, object.Array[13], ORCA.List[“Hello”].str).
Выражение множества в EasyFlow представляют собой последовательности выражений, разделенных запятыми и заключенных в квадратные скобки (примеры: [1, 2, 3], [a, [c, d]]). Списки могут быть вложенными и содержать значения различных типов. В качестве выражения множества может быть переменная-множество.
В предыдущем пункте мы рассмотрели структуру скрипта в общих чертах. Рассмотрим теперь её в правилах синтаксиса и семантики языка.
Для определения требуемых исходных данных для работы композитного приложения используется директива require, после которой через запятую перечислятся идентификаторы файловых переменных.
Формат директивы приведён в листинге 2.:
Листинг 2. Формальное описание директивы require
require
Для определения формата вышеприведённой директивы, а также директив, операторов, которые приводятся ниже, используются упрощённая система нотация, частично заимствованная из ANTLR.
Набор символов – инструкция, не заключённая в скобки, определяет такое же написание в строке вызова оператора или использования директивы. Инструкции, указанные в угловых скобках, определяют абстракцию или требования, на место которой указываются идентификатор или иные символы. Например, требование wsnp указывает на один или большее количество пробелов, wsns – на любое количество пробелов, а brln – перевод на следующую строку. Абстракция <Идентификатор файловой переменной> определяет, что на её место указывается один идентификатор файловой переменной.
Если инструкция заключена ещё и в квадратные скобки, то её применение не обязательно. Заключение инструкций в фигурные скобки указывает на то, что её можно циклически повторять (количество применений ограничивается допустимой длиной строки). Например, инструкция [{,
Если требуется применение фигурных и квадратных скобок в выражении, то они в системе нотаций они обозначаются следующим образом:
Пример использования директивы require приведён в листинге 3.
Листинг 3. Пример использования директивы require
require File1, File2;
require Jpeg_image, bmp_image;
Атрибуты потока (композитного приложения) представляет собой задание настройки для исполнения WF и имеет синтаксис, приведенный в листинге 4.
Листинг 4. Формальное описание задания атрибутов
Как мы можем заметить из листинга 4, точка с запятой в конце строки описания атрибутов не требуется.
В данной версии языка поддерживаются следующие атрибуты:
· name – имя WF (строка);
· author – информация об авторе (строка);
· description – описание WF (строка);
· priority – приоритет выполнения WF, который учитывается планировщиком CLAVIRE. Возможные значения: @low (низкий), @normal (нормальный), @high (высокий), @urgent (экстренный).
· mode – режим работы WF. Возможные значения: @raw (режим работы непосредственно с параметрами пакетов), @meta (режим работы в терминах предметной области, которые настраиваются в описании пакетов на EasyPackage).
· sweepmode – режим варьирования параметров шага при использовании оператора sweep.
Примеры задания атрибутов приведены в листинге 5.
Листинг 5. Пример задания атрибутов
[flow:priority = @urgent]
[flow:author = “Ivan Copylov”]
[flow:name = “Molecular geometry optimization”]
[flow:mode = @raw]
[flow:sweepmode = @zip]
Теперь опишем директиву, определяющую вызов пакета (шаг потока).
Директива step задает выполнение вычислительного пакета с определенными параметрами. При необходимости могут устанавливаться связи между шагами как по данным, так и по управлению. Полный формат описания шага включает: атрибуты шага, имя шага, вызываемый пакет, условия запуска пакета (опция after) и список входных параметров и файлов.
Использование директивы step допускается по следующему формату.
Листинг 6. Формальное описание определения шага потока (WF)
step
runs
[
(
[<задание значений параметров пакета>]
);
Как мы видим из листинга 6, шаг может задавать вызов как пакета, как метода пакета, так и метода сколь угодно вложенного класса (объекта) пакета. Допускается вызов пакета без параметров и задания атрибутов. В таком случае в круглых скобках ничего не указывается.
Задание значений параметров пакета осуществляется с помощью оператора присваивания по следующему формату (листинг 7.).
Листинг 7. Формальное описание определения задания значений параметров
[{<имя параметра пакета>
<имя параметра пакета>
Выражение может содержать константу, файловую переменную, множество, задаваемое оператором sweep, один или несколько результатов работы пакета одного из предыдущих шагов в виде выражения доступа. Тип параметра пакета перед оператором присваивания должен совпадать с типом выражения, стоящего после него. Если левый операнд оператора присваивания является списком, то ему можно сопоставить список, задаваемый в виде выражения множества.
Пример определения шага потока (step) приведён в листинге 8.
Листинг 8. Пример организации шага потока с помощью директивы step
step StepName runs Package.Method after AnotherStep
(
inFile1 = FileVariable1,
inFile2 = FileVariable2,
stringInput = "String constant",
intInput = 100,
doubleInput = 3.14,
AccessParam = AnotherStep.Object.Field,
/*
параметр, задаваемый выражением доступа к полю
Field объекта Object после выполнения шага AnotherStep
*/
sweepParam = sweep [1, 2, 3],
listParam1 = [AnotherStep.outs["out.txt"]],
// Список, состоящий из одного элемента
listParam2 = AnotherStep2.outs["out.txt"]
/*
список, состоящий из нескольких элементов, количество
которых определено одним или несколькими sweep
шага AnotherStep2
*/
);
Листинг 8. иллюстрирует определение шага StepName, который вызывает метод Method пакета Package, расщепляя вызов на три экземпляра (см. строку со sweep). Шаг может быть выполнен только после завершения шага AnotherStep (связь по управлению и по данным) и AnotherStep2 (связь по только данным – AnotherStep2 не указан после after в первой строке листинга).
Для скачивания документа в формате SCORM необходимо обладать правами привилегированного пользователя.
[вернуться в оглавление]