Московский Государственный Университет им. Ломоносова
Факультет Вычислительной Математики и Кибернетики
Кафедра Автоматизации Систем Вычислительных Комплексов



Курсовая работа
"Язык Иерархической Связанной Спецификации Допустимых Характеристик Сложных Систем"




Оглавление

  1. Введение
  2. Концепция языка спецификации
  3. Лексические основы языка
    1. Алфавит и лексемы языка
    2. Строки и числа, константы
    3. Идентификаторы и имена переменных итерации
    4. Формальное описание синтаксиса
    5. Синтаксические ошибки
  4. Семантическое описание языка
    1. Описание иерархии, именование компонент
    2. Атрибуты (строки, числа, альтернативы, вектора)
    3. Условное включение и его исключение
    4. Списки, зацепление списков
    5. Альтернативы
    6. Множественная селекция
    7. Регуляризация спецификации
    8. Наследование
  5. Описание связей характеристик
    1. Ограничение множества атрибутов, ограничение при наследовании
    2. Выражения, константы, признак числа
    3. Функциональные операторы
    4. Стандартные функции
    5. Агрегатные функции
    6. Оператор вычисления, непосредственная и условная вычислимость
  6. Заключение

1. Введение

Данная работа выполнялась в рамках общего проекта, связанного с созданием методологического базиса проектирования систем управления безопасностью информационных технологий (СУБ ИТ), и конкретного направления - разработка принципов автоматизации проектирования СУБ ИТ и действующего прототипа средств автоматизации.

По замыслу, автоматизация процесса проектирования СУБ ИТ должна состоять в автоматизации методики проектирования, уже разработанной на одном из предыдущих этапов. Реально это означает, что средство автоматизации (CASE-средство) должно принимать те или иные решения по проектированию защиты для заданной системы и выдавать документы типа политики безопасности, основываясь на данных от пользователей системы, системных администраторов, обслуживающего систему персонала, сотрудников, ответственных за безопасность, и руководства организации. Необходимым требованием к данному средству проектирования является также требование дружественности интерфейса и простоты использования.

В ходе уяснения задачи оказалось, что из-за большой гибкости методики проектирования, из-за большого количества справочной информации, которая с течением времени меняется, а также из-за достаточно сложных алгоритмов принятия и документирования решения, практически не возможно реализовать указанное средство как единое целое. Наиболее оптимальной формой реализации подобного средства-инструмента проектировщика СУБ ИТ явилась бы, по мнению автора, форма, основанная на записи применяемых алгоритмов и всей справочной информации (т.е. формирование базы знаний) на некотором языке, и создании средства-инструмента, не связанного непосредственно с задачей проектирования СУБ ИТ, интерпретирующего входной язык со спецификацией алгоритмов принятия решения и дополнительной информацией, производящего опрос (в виде диалога) пользователя инструмента для получения недостающей информации о системе, необходимой для однозначного принятия решения по применению тех или иных средств защиты, и выдающей полученный результат и описание системы на выходном языке, близком к естественному. Кроме того, подобный инструмент необходимо дополнить требуемыми технологическими процессорами, представляющие собой отдельные программы проблемно-ориентированной обработки спецификаций, записанных на выходном языке. Таковым технологическим процессором, например, может являться транслятор на язык Единой Системы Конструкторской/Проектной Документации (ЕСКД/ЕСПД).

По указанной причине задача создания выше описанного инструмента разбивается на несколько подзадач, а данный этап работы состоит из нескольких шагов, однозначно соответствующих подзадачам, которыми являются:

Данный отчет является результатом выполнения самого первого шага работы. В качестве входного языка был предложен специализированный язык связанной спецификации LHIV, а в качестве выходного языка - подмножество входного языка (множество всех так называемых "чистых" спецификаций системы).

Следующие части отчета посвящены описанию предлагаемого языка - его концепции, лексическим основам, семантике и выражениям связи характеристик системы.

2. Концепция языка спецификации

Язык иерархической связанной спецификации допустимых характеристик сложных систем LHIV (Language for Hierarchic Inter-linked specification of complex systems' Valid properties) - это язык, который не только позволяет описывать характеристики заданной системы, но и описывать множества систем, обладающих теми или иными характеристиками. Язык в достаточной степени лаконичен и выразителен, обладает большой гибкостью в части вида записи спецификации и семантической проверки ее корректности. Язык был специально спроектирован для эффективной организации процесса автоматизированной спецификации характеристик конкретной системы.

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

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

Концепция задания атрибутов состоит в возможности указания наличия атрибутов некоторого типа (т.е. характеристики) у специфицируемой системы и ее подсистем, концепция выражений связи - в возможности указания конкретных значений атрибутов или описания допустимых множеств значений конкретных атрибутов.

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

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

Все перечисленные выше концепции были заложены в описываемый язык, их использование описано в части отчета, посвященной семантике языка.

3. Лексические основы языка

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

3.1. Алфавит и лексемы языка

В алфавит данного языка входит весь набор ASCII символов, причем этот набор разбит на следующие группы:

  • множество специальных символов;
  • множество пробельных символов;
  • множество "обычных" символов; и
  • символ, используемый для обозначения пробела.

Рассмотрим эти множества по отдельности.

3.1.1. Пробельные символы и комментарии

Множество пробельных символов состоит из всех управляющих ASCII символов (т.е. символов с десятичным кодом от 0 до 31 и кодом равным 127) и символа пробела. Символы из данного множества не формируют лексем языка и используются для большей наглядности представления спецификации. Однако данные пробельные символы являются разделителями лексем (в соответствии со стандартными правилами образования лексем) и, следовательно, не могут использоваться внутри цепочек литер, принадлежащих одной и той же лексеме. Важно отметить, что при представлении спецификации на данном языке нет никакой необходимости в использовании пробельных символов.

Аналогичной функцией обладает конструкция, называемая "комментарием". Комментарий задается путем указания лексемы "//" (как в Си++) в тексте спецификации и заключения тела комментария, следующего сразу же за "//", в фигурные скобки ("{", "}"). Тело комментария может содержать любые символы из алфавита языка, однако фигурные скобки должны быть сбалансированы (если они не экранированы с помощью символа "\"). Таким образом, допускается вложенность комментариев друг в друга, а также исключение из рассмотрения частей спецификации путем их заключения в тело комментария.

3.1.2. Специальные символы

Множество специальных символов составляют лексическую основу описываемого языка. Специальными символами считаются следующие: "!", "#", "$", "%", "&", "(", ")", "{", "}", "*", "+", "-", "/", ":", ";", "<", "=", ">", "?", "@", "\" и "|". Специальные символы могут образовывать лексемы как самостоятельно, так в паре с "обычными" символами (в зависимости от контекста использования). Эти лексемы делятся на следующие категории:

  • структурирующие (т.е. задающие структуру спецификации);
  • разделительные;
  • операционные (т.е. определяющие знаки операций в ограничивающих выражениях);
  • функциональные (задающие операцию вычисления функции);
  • параметризирующие;
  • типизирующие;
  • вспомогательные.

Спецификация всей системы представляется в виде спецификаций отдельных компонент рассматриваемой системы, которые, в свою очередь, представляются аналогичным образом, т.е. любая спецификация на данном языке задается в виде иерархии. Структура такой иерархии задается в тексте спецификации с помощью специальных символов "{" и "}", принадлежащих категории структурирующих. В спецификации любой сущности (компоненты или списка) могут присутствовать символы "{" и "}", между которыми указываются спецификации сущностей (подкомпонент или элементов списка) содержащихся в описываемой сущности. Если между символами "{" и "}" нет ни одной спецификации, то это обозначает атомарность описываемой сущности. В случае отсутствия описания структуры, у рассматриваемой сущности структура (состав) считается произвольной.

К разделительным лексемам относятся символы ";", ":" и "@". Точка с запятой (";") используется для отделения спецификаций разных компонент, точнее для указания конца спецификации компоненты (или списка, или его элемента). Применение двоеточия (":") указывает на наличие ограничивающего (связывающего атрибуты) выражения, которое задается между символами ":" и ";". Символ "@" необходим для задания ссылки (т.е. каждая отдельная ссылка начинается с "@") на наследуемую сущность. Все ссылки задаются непосредственно между спецификацией типа компоненты и описанием состава компоненты или списка (т.е. до открывающей фигурной скобки с возможным признаком списка).

Как было указано выше, в операционную категорию входят лексемы, обеспечивающие формирование и последующий учет ограничивающих выражений, задающих связь атрибутов различных компонент. В предлагаемом языке определены следующие знаки операций (функциональные операторы): "()", "?:", "!", "+", "-", "*", "/", "%", "**", "=", "<", ">", "!=", "<=", ">=", "&", "|", "@", "#", "$". За исключением операций "()" (указание порядка вычисления) и "?:" (оператор условного вычисления) все знаки операций распознаются как отдельные лексемы. В зависимости от контекста одна и та же лексема может обозначать разные операции. Таковыми являются лексема "-", обозначающая либо унарный минус, либо бинарную операцию вычитания, и лексемы "=", "<", ">", "!=", "<=", ">=" (знаки сравнения) и "+" (знак сложения чисел или конкатенации строк), обозначающие полиморфные бинарные операции над множеством чисел или строк. Кроме того, лексема "=" может интерпретироваться как оператор присвоения (вычисления) значения, а не как операция сравнения. Каждая операция (кроме "?:") записывается либо в префиксном виде (если она унарная), либо в инфиксном виде (если она бинарная). Унарными являются операции "!" (логическое отрицание) и "-", а также параметризируемые операторы "@", "#", "$". Бинарными являются операции сравнения ("=", "<", ">", "!=", "<=", ">="), соответствующие арифметические операции ("+", "-", "*", "/", "%" (взятие остатка от деления), "**" (возведение в степень)), операция конкатенации строк ("+"), а также логические операции "И" ("&") и "ИЛИ" ("|"). Оператор условного вычисления "?:" является тернарным (т.е. имеет три аргумента) и позволяет задавать два выражения (второй и третий аргументы), из которых вычисляться будет только одно, в зависимости от значения выражения, заданного первым аргументом. Круглые скобки ("(", ")") используются для задания оператора указания порядка вычисления выражения. Следует отметить, что с каждым оператором связан приоритет и направление связывания (исключение составляют операции сравнения - без связывания), задающие естественные правила вычисления, поэтому во многих случаях нет необходимости явного указания порядка вычисления.

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

Кроме того, круглые скобки ("(", ")"), наряду с фигурными ("{", "}"), входят в категорию лексем, называющихся параметризирующими. Они употребляются в выражениях после имени агрегатной функции (кроме функций, задающих строковую итерацию) и после знаков унарных операторов "@" (получить значение атрибута), "#" (получить значения индекса), "$" (получить идентификатор) непосредственно перед их аргументом, и используются для точного указания сущности, в контексте которой и применяются перечисленные функции и операторы. Каждый дополнительный указанный параметр детализирует (раскрывает) текущую сущность (компоненту или список) на один уровень, а самый первый указанный параметр детализирует сущность, к которому принадлежит данное выражение ограничения. Параметр, задаваемый фигурными скобками ("{", "}"), позволяет указывать (выбирать) конкретную используемую альтернативу, а круглые скобки применяются во всех остальных случаях детализации. Возможно задание любого числа параметров любого вида, а в случае их отсутствия операция применяется в контексте текущей описываемой сущности.

Тип описываемой компоненты задается с помощью символов "$", "#", "&", "?", "!", "+", "-" и "*", принадлежащих категории типизирующих специальных символов. Наличие атрибута у компоненты определяется наличием символов "$" или "#" в описании компоненты. Знак "$" указывает на принадлежность атрибута множеству строк, а знак "#" говорит о том, что атрибут является вещественным числом (строкой, представляющей вещественное число). Символ "&" в описании - признак того, что описываемая сущность является (может являться) списком, а не компонентой. Списки используются для организации возможности задания альтернатив и множественного выбора. Для указания на возможность выбора конкретного описания данной компоненты из множества альтернатив используется знак "?". Для задания возможности множественного выбора необходимо использовать знак "!" вместо "?". Следует отметить, что выбор конкретной альтернативы из множества осуществляется путем задания значения атрибута компоненты, совпадающего с идентификатором выбранной альтернативы. Кроме возможностей, перечисленных выше, существует также возможность условного включения компонент, т.е. указания на то, что данная компонента может как присутствовать в системе, так и отсутствовать. Есть и возможность исключения условно включенной компоненты (обычно при наследовании). Для указания таких возможностей, в тексте спецификации после идентификатора описываемой сущности используются знаки "+" и "-" соответственно. И, наконец, существует знак "*" - указание регуляризации описания, т.е. указание на то, что данная сущность состоит из нескольких (ноль или более) сущностей указанного далее типа, но без указания их конкретных идентификаторов и, возможно, их количества.

Существует еще одна категория специальных символов и лексем - вспомогательная. В нее входят: лексема "//" - признак начала комментария, лексема "/@" - указание на отступ при разрешении ссылки, символ четвероточия "::" - для образования имени переменной итерации, символ "/" - квалификатор идентификатора и символ обратной косой черты "\" - признак начала эскейп-последовательности. Следует отметить, что квалификатор идентификатора образует лексему вместе с самим идентификатором и используется при описании ссылки. Там же используется и лексема-указатель на отступ при разрешении ссылки (т.е. явное ограничение области поиска сущности ссылки для устранения коллизии при наличии одинаковых идентификаторов на разных уровнях поиска).

Особую функцию имеет символ "\" - он используется, во-первых, при записи символов строк, не имеющих графического обозначения, во-вторых, для игнорирования функции служебных символов (т.е. превращения их в "обычные"), и, в-третьих, для введения символов в строки, явно задавая их коды в шестнадцатеричном виде. Последовательности литер, начинающиеся с "\", называются эскейп-последовательностями и могут состоять от одного до четырех символов.

Для записи символов, не имеющих графического обозначения, существуют следующие эскейп-последовательности: "\0" - обозначает символ с нулевым кодом, "\a" - обозначает символ с кодом 7, "\b" - обозначает символ "возврата на шаг" (код 8), "\t" - обозначает символ табуляции (код 9), "\n" - обозначает символ новой строки (код 0A), "\v" - обозначает символ "вертикальной" табуляции (код 0B), "\f" - обозначает символ новой страницы (код 0C), "\r" - обозначает символ "возврата каретки" (код 0D), "\z" - обозначает символ с кодом 1A, "\e" - обозначает ASCII эскейп-символ (код 1B) и "\d" - обозначает символ с кодом 7F. Особую роль играет символ новой строки (представимых с помощью эскейп-последовательности "\n") - с его помощью можно задавать строковые константы или идентификаторы, содержащие несколько ASCII строк текста.

Если необходимо явно указать шестнадцатеричный код символа, включенного в строковую константу или идентификатор, то применяется эскейп-последовательность, начинающаяся с цепочки "\x", за которой непосредственно следует не более двух шестнадцатеричных цифр, определяющих код символа. В случае если сразу же за цепочкой "\x" следует символ, не являющийся шестнадцатеричной цифрой, то такая эскейп-последовательность состоит из двух символов и обозначает символ с нулевым кодом. Возможен и случай, когда за цепочкой "\x" следует шестнадцатеричная цифра, а за ней - символ, не являющийся шестнадцатеричной цифрой, - тогда эскейп-последовательность состоит из трех символов и обозначает символ с кодом, заданным указанной одной цифрой.

Наиболее часто эскейп-последовательность применяется для игнорирования функции (т.е. экранирования) служебных символов и символа подчеркивания ("_") при записи констант (в т.ч. числовых) и идентификаторов описываемых сущностей. Для реализации этой возможности следует указать цепочку из символов - символа "\" и экранируемого символа. Следует отметить, что экранирование фактически означает указание на локальную (т.е. в данном месте спецификации) интерпретацию данного символа как "обычного", имеющего только функцию обозначения самого себя, символа.

Эскейп-последовательность, состоящая из символа "\" и "обычного" символа, не являющегося "a", "b", "d", "e", "f", "n", "r", "t", "v", "x", "z" или "0", трактуется как указанный "обычный" символ (т.е. символ "\" просто игнорируется).

Эскейп-последовательность может состоять только из символа "\", если непосредственно следующий за ним символ является пробельным. Данная эскейп-последовательность не только обозначает сам символ обратной косой черты "\" (аналогично эскейп-последовательности "\\"), но и является последним символом строки, так как пробельный символ отделяет лексемы друг от друга.

3.1.3. Символ обозначения пробела и "обычные" символы

Остальные символы языка, не являющиеся пробельными или служебными, используются для формирования таких лексем, как идентификаторы, константы и имена переменных итерации. Все эти символы, за исключением подчеркивания ("_"), называются "обычными", и в тексте спецификации каждый такой "обычный" символ обозначает именно тот символ, которым он и является. В противоположность, символ подчеркивания в тексте спецификации на предлагаемом языке обозначает пробел (" "), а для обозначения внутри строки самого подчеркивания "_" необходимо использовать эскейп-последовательность "\_" (т.е. экранировать специальную функцию подчеркивания).

3.2. Строки и числа, константы

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

Числом называется строка, состоящая из особой последовательности символов: необязательного знака представляемого числа, цифр представления целой части числа, возможной десятичной точки и цифр представления дробной части, а также необязательной экспоненты, начинающейся с символа "E" или "e" и содержащей знак (необязательный) и цифры ее показателя. Для представления знаков числа и его экспоненты должны использоваться эскейп-последовательности "\+" и "\-" в силу того, что символы "+" и "-" являются специальными, а не "обычными". Следует отметить, что разные строки могут представлять одно и тоже число. Кроме того, числами являются строки, представляемые следующими последовательностями: "0Inf", "\+0Inf", "\-0Inf" (обозначение бесконечности) и "0NaN", "\+0NaN", "\-0NaN" (обозначение "не-числа").

Внутри ограничивающих выражений строки представляют собой константы. Константа - это атомарная единица спецификации, имеющая некоторое значение и являющаяся основой составления и вычисления выражений в целом. Константа может иметь признак числа, который влияет на интерпретацию знаков полиморфных операций сравнения "=", "<", ">", "!=", "<=", ">=" и сложения/конкатенации "+".

3.3. Идентификаторы и имена переменных итерации

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

Существует также понятие квалифицированного идентификатора, состоящего из квалификатора "/" и, собственно, самого идентификатора (вся конструкция является лексемой). Квалифицированные идентификаторы используются при указании ссылок.

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

3.4. Формальное описание синтаксиса

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

Спецификация синтаксиса выполнена с использованием метода порождающих правил. Порождающие правила задаются в виде "Левая часть → Правая часть". Левая часть представляет собой вводимое синтаксическое понятие, имя которого изображается последовательностью букв, а правая часть правила содержит композицию понятий, в терминах которых описывается вводимое понятие, и терминальных (конечных) символов - последовательностей литер, заключенных в апострофы ('). Каждое правило заканчивается точкой с запятой (";"). Правая часть строится с использованием стандартных метасимволов, таких как "|", "(", ")", "[", "]", "{", "}". Символ "|" указывается для разделения альтернатив, при этом для ограничения области выбора альтернативы используются скобки (любого вида). Если некоторая конструкция в правой части может отсутствовать, то она заключается в квадратные скобки ("[", "]"). Заключение конструкции в фигурные скобки ("{", "}") означает возможность ее многократного повторения (ноль или более раз).

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

Спецификация →
Пробельная_конструкция Описание_компоненты;
Обычный_символ;
Пробел;
Комментируемый_символ;
Служебный_символ →
'!' | '#' | '$' | '%' | '&' | '(' | ')' | '*' | '+' | '-' | '/' | ':' | ';' | '<' | '=' | '>' | '?' | '@' | '\' | '{' | '|' | '}';
Символ_обозначения_пробела →
'_';
Эскейп_последовательность →
Эскейп_символ (Служебный_символ | Символ_обозначения_пробела | Символ_со_специальным_значением | Символ_с_заданным_кодом | Обычный_символ);
Эскейп_символ →
'\';
Символ_со_специальным_значением →
'0' | 'a' | 'b' | 'd' | 'e' | 'f' | 'n' | 'r' | 't' | 'v' | 'z';
Символ_с_заданным_кодом →
'x' Шестнадцатеричная_цифра Шестнадцатеричная_цифра;
Шестнадцатеричная_цифра →
Цифра | 'A' | 'a' | 'B' | 'b' | 'C' | 'c' | 'D' | 'd' | 'E' | 'e' | 'F' | 'f';
Константа →
Строка | Число;
Строка →
{Строковый_символ};
Непустая_строка →
Строковый_символ {Строковый_символ};
Строковый_символ →
Обычный_символ | Символ_обозначения_пробела | Эскейп_последовательность;
Число →
['\+' | '\-'] ([{Цифра} '.'] Цифра {Цифра} [('E' | 'e') ['\+' | '\-'] Цифра {Цифра}] | '0Inf' | '0NaN');
Цифра →
'0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9';
Пробельная_конструкция →
{Пробел | Комментарий};
Комментарий →
Признак_комментария Комментируемая_последовательность;
Признак_комментария →
'//' {Пробел};
Комментируемая_последовательность →
'{' {Комментируемый_символ | Эскейп_последовательность | Комментируемая_последовательность} '}';
Описание_компоненты →
([Идентификатор_компоненты Пробельная_конструкция] '-' | Идентификатор_компоненты Пробельная_конструкция Описание_типа_Компонента) ';' Пробельная_конструкция;
Описание_списка →
Идентификатор_списка Пробельная_конструкция Описание_типа_Список ';' Пробельная_конструкция;
Идентификатор_компоненты →
Идентификатор;
Идентификатор_списка →
Идентификатор;
Идентификатор →
Непустая_строка;
Ссылка_на_компоненту →
Признак_ссылки {Признак_отступа_ссылки} {Квалифицированный_идентификатор_компоненты} Квалифицированный_идентификатор_компоненты;
Ссылка_на_список →
Признак_ссылки {Признак_отступа_ссылки} {Квалифицированный_идентификатор_списка} Квалифицированный_идентификатор_списка;
Признак_отступа_ссылки →
Квалификатор_идентификатора '@' Пробельная_конструкция;
Квалифицированный_идентификатор_списка →
Квалификатор_идентификатора Идентификатор_списка Пробельная_конструкция;
Квалифицированный_идентификатор_компоненты →
Квалификатор_идентификатора Идентификатор_компоненты Пробельная_конструкция;
Признак_ссылки →
'@' Пробельная_конструкция;
Квалификатор_идентификатора →
'/';
Описание_типа_Компонента →
{[Признак_условного_включения] {Признак_наличия_атрибута} Признак_регулярности} [Признак_условного_включения] ({Ссылка_на_компоненту} {Признак_наличия_атрибута} [Описание_состава_компоненты] | [Признак_выбора] Описание_типа_Список) [Признак_наличия_ограничения Выражение_ограничения];
Описание_типа_Список →
{Ссылка_на_список} (Ссылка_на_список | Описание_элементов_списка) | Признак_списка Признак_регулярности Описание_типа_Компонента;
Признак_условного_включения →
'+' Пробельная_конструкция;
Признак_регулярности →
'*' Пробельная_конструкция;
Признак_наличия_атрибута →
Признак_наличия_строкового_атрибута | Признак_наличия_числового_атрибута;
Признак_наличия_строкового_атрибута →
'$' Пробельная_конструкция;
Признак_наличия_числового_атрибута →
'#' Пробельная_конструкция;
Признак_выбора →
Признак_выбора_альтернативы | Признак_множественного_выбора;
Признак_выбора_альтернативы →
'?' Пробельная_конструкция;
Признак_множественного_выбора →
'!' Пробельная_конструкция;
Описание_состава_компоненты →
Признак_начала_детализации {Описание_компоненты} Признак_конца_детализации;
Описание_элементов_списка →
Признак_списка Признак_начала_детализации {Описание_компоненты | Описание_списка} Признак_конца_детализации;
Признак_списка →
'&' Пробельная_конструкция;
Признак_начала_детализации →
'{' Пробельная_конструкция;
Признак_конца_детализации →
'}' Пробельная_конструкция;
Признак_наличия_ограничения →
':' Пробельная_конструкция;
Выражение_ограничения →
Выражение;
Выражение →
{Выражение_0 '?' Пробельная_конструкция Выражение_0 ':' Пробельная_конструкция} Выражение_0;
Выражение_0 →
Выражение_1 {'|' Пробельная_конструкция Выражение_1};
Выражение_1 →
Выражение_2 {'&' Пробельная_конструкция Выражение_2};
Выражение_2 →
Выражение_3 [('=' | '<' | '>' | '!=' | '<=' | '>=') Пробельная_конструкция Выражение_3];
Выражение_3 →
Выражение_4 [('+' | '-') Пробельная_конструкция Выражение_4];
Выражение_4 →
Выражение_5 {('*' | '/' | '%') Пробельная_конструкция Выражение_5};
Выражение_5 →
{Выражение_6 '**' Пробельная_конструкция} Выражение_6;
Выражение_6 →
'(' Выражение ')' Пробельная_конструкция | Использование_непосредственного_значения | Использование_унарного_оператора | Использование_стандартной_функции | Использование_агрегатной_функции | Использование_значения_атрибута | Использование_значения_индекса | Использование_значения_имени;
Использование_непосредственного_значения →
Константа Пробельная_конструкция;
Использование_унарного_оператора →
('!' | '-') Пробельная_конструкция Выражение_6;
Использование_стандартной_функции →
Имя_стандартной_функции Пробельная_конструкция Фактический_аргумент {Фактический_аргумент};
Имя_стандартной_функции →
Непустая_строка;
Фактический_аргумент →
'(' Выражение ')' Пробельная_конструкция;
Использование_агрегатной_функции →
Использование_функции_строковой_итерации | Использование_функции_поэлементной_итерации;
Использование_функции_строковой_итерации →
Имя_функции_строковой_итерации Пробельная_конструкция Фактическая_итерируемая_строка Имя_переменной_строковой_итерации Фактический_аргумент;
Имя_функции_строковой_итерации →
Непустая_строка;
Фактическая_итерируемая_строка →
'(' Выражение ')' Пробельная_конструкция;
Имя_переменной_строковой_итерации →
Префикс_переменной_итерации;
Префикс_переменной_итерации →
'::';
Использование_функции_поэлементной_итерации →
Имя_функции_поэлементной_итерации Пробельная_конструкция Указатель_сущности Имя_переменной_поэлементной_итерации Фактический_аргумент;
Имя_функции_поэлементной_итерации →
Непустая_строка;
Указатель_сущности →
{Указатель_на_подкомпоненту | Указатель_на_альтернативу};
Указатель_на_подкомпоненту →
'(' Выражение ')' Пробельная_конструкция;
Указатель_на_альтернативу →
'{' Выражение '}' Пробельная_конструкция;
Имя_переменной_поэлементной_итерации →
Префикс_переменной_итерации Непустая_строка;
Использование_значения_атрибута →
'@' Указатель_сущности [Выражение_6];
Использование_значения_индекса →
'#' Указатель_сущности (Выражение_6 | Указатель_на_альтернативу);
Использование_значения_имени →
'$' Указатель_сущности Выражение_6;.

Замечания:

  1. Целевым синтаксическим понятием является понятие "Спецификация";
  2. Под понятием "Пробел" понимается любой символ с кодом от 0 до 32 или символ с кодом 127;
  3. Под понятием "Обычный_символ" понимается любой символ, не являющийся служебным или символом обозначения пробела;
  4. Понятие "Комментируемый_символ" обозначает любой символ, отличный от фигурной скобки ("{", "}") и обратной косой черты ("\").

3.5. Синтаксические ошибки

При лексическом анализе спецификации системы на предлагаемом языке возможно появление следующих синтаксических ошибок (исходя из формального описания):

  1. Незаконченный комментарий (встречен конец файла, отсутствует "}");
  2. Неправильное начало комментария (отсутствует "{" после "//");
  3. Неэкранированный служебный символ в идентификаторе;
  4. Отсутствует признак ссылки ("@");
  5. Отсутствует квалификатор идентификатора ("/");
  6. Квалификатор идентификатора ("/") отделен от самого идентификатора или признака отступа ("@");
  7. Ссылка не найдена (неразрешенная ссылка);
  8. Неправильная ссылка (ссылка на себя);
  9. Повтор признака условного включения ("+");
  10. Повтор признака наличия атрибута ("$" или "#");
  11. Повтор признака выбора ("?" или "!");
  12. Выбор не из списочного типа (отсутствует признак списка или ссылка на список);
  13. Незаконченное описание подкомпонент или элементов списка (встречен конец файла, отсутствует "}");
  14. Незаконченное описание компоненты или списка (встречен символ "}" или конец файла, отсутствует ";");
  15. Отсутствует признак наличия выражения ограничения (":");
  16. Отсутствует выражение ограничения (после ":");
  17. Незаконченный условный оператор ("?" без последующего символа ":");
  18. Нет явного указания порядка вычисления операторов сравнения;
  19. Отсутствует закрывающая функциональная скобка (встречен символ ";" или конец файла, отсутствует ")" или "}");
  20. Отсутствует аргумент оператора (пустая строка в качестве числового аргумента оператора);
  21. Неправильное имя функции (использование неизвестной функции);
  22. Недостаточное количество фактических аргументов у функции;
  23. Отсутствует знак оператора между двумя выражениями;
  24. Отсутствует аргумент у оператора получения индекса или имени;
  25. Отсутствует или неправильное имя определяемой переменной итерации;
  26. Использование неопределенного имени переменной итерации.

4. Семантическое описание языка

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

4.1. Описание иерархии, именование компонент

Главный принцип, используемый при спецификации системы (или множества систем), - принцип последовательной детализации и иерархического описания. Каждая описываемая сущность может быть представлена в виде набора других более мелких сущностей (детализация) и связей между ними. Подробными сущностями могут являться и абстрактные понятия, например характеристики описываемой (более крупной) сущности.

При описании каждой сущности (системы, компоненты, списка и др.) необходимо задавать ее имя - идентификатор-строка, уникальный в пределах описываемой более крупной сущности.

Форма описания сущности на предлагаемом языке следующая: указывается имя сущности, далее в фигурных скобках ("{", "}") описываются все сущности более мелкого масштаба, далее может следовать описание связи (т.е. выражения ограничения), и в конце описания ставится точка с запятой (";").

Пример:

Система_А // { идентификатор описываемой сущности }
{ // { начало описания состава сущности }
 Подсистема_1 // { сущность атомарного типа }
 {
 };
 Подсистема_2
 {
  Компонента_2.1 {};
  Компонента_2.2 {};
 };
 Подсистема_3; // { сущность неопределенного типа }
}; // { конец описания сущности }

4.2. Атрибуты (строки, числа, альтернативы, вектора)

Кроме возможности определения состава (детализации) специфицируемой сущности можно указывать атрибуты сущности - как числа, так и строки. При этом в начале спецификации сущности необходимо указать признак наличия атрибута того или иного вида, а в конце - само значение атрибута (в виде выражения ограничения).

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

Конкретное значение атрибута указывается в выражении ограничения (т.е. между символами ":" и ";") и имеет вид "@ = <значение>", где <значение> - это и есть конкретное задаваемое значение атрибута описываемой сущности.

Пример:

Система_Б $ // { признак наличия строкового атрибута }
{
 Основные_характеристики
 {
  Стоимость # {} : @ = 10000; // { задание конкретного числового атрибута }
  Тип ? // { признак выбора из множества альтернатив }
   & // { признак списка (альтернатив) }
  { // { перечисление всех элементов списка }
   Тип_А {};
   Тип_Б {};
  } : @ = Тип_А; // { указание конкретного выбора }
  Преимущества & // { список }
  {
   Преимущество_1;
   Преимущество_2;
   Преимущество_3;
  };
  Надежность $$ : // { признак атрибута векторного типа (два элемента) }
   @ = Качественная_шкала & // { задание значения первого элемента }
   @{Качественная_шкала} = Высокая; // { задание значения второго элемента }
 };
} : @ = Полное_описание_системы; // { указание конкретного значения атрибута }

4.3. Условное включение и его исключение

Принцип условного включения более мелких сущностей в описание более крупной сущности является одним из принципов, позволяющих описывать допустимые множества сущностей (более крупного масштаба). Условное включение сущности означает, что данная сущность может либо присутствовать в более крупной сущности, либо отсутствовать в ней. Далее, при описании конкретной сущности из уже описанного допустимого множества сущностей, уточняется факт присутствия или отсутствия каждой условно включенной более мелкой сущности.

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

Пример:

Абстрактная_сущность // { описание множества сущностей }
{
 Компонента_1+; // { указание на условное (возможное) включение
                    в состав описываемой сущности }
 Компонента_2; // { обязательное включение в состав описываемой сущности }
 Компонента_3+
 {
  Характеристики;
 };
 Компонента_4+;
};
Реальная_сущность @ /Абстрактная_сущность
 // { описание-выбор конкретной сущности из множества }
{ // { полное исключение условных включений }
 Компонента_1-; // { указание на отсутствие данной компоненты }
 Компонента_3;// { указание на обязательное присутствие в составе сущности }
} : !(#Компонента_4); // { указание на отсутствие данной компоненты,
                          заданное в виде выражения ограничения }
Реальная_сущность_1 // { эквивалентное описание конкретной сущности }
{
 -; // { указание на отсутствие некоторой компоненты -
        описание пустого "гнезда" }
 Компонента_2; // { данная компонента является второй в описании состава }
 Компонента_3
 {
  Характеристики;
 };
 -;
}; // { описанная сущность состоит из четырех элементов }

4.4. Списки, зацепление списков

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

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

Признаком списка (или группы элементов) является одновременное присутствие символа "&" в спецификации перед открывающей фигурной скобкой, обозначающей начало перечисления элементов описываемого списка, и отсутствие выражения ограничения после закрывающей фигурной скобки.

Пример:

Список_1 & // { признак описания списка }
{
 Элемент_1_списка; // { элемент неизвестной структуры }
 Элемент_2_списка {}; // { элемент без свойств }
 Элемент_3_списка # : @ = 0; // { элемент с заданным значением атрибута }
 Элемент_4_списка // { элемент с конкретной структурой (свойствами) }
 {
  Свойства_элемента;
 };
 Группа_элементов_5 &
  // { подсписок, т.е. список, зацепленный с объемлющим его списком }
 { // { перечень элементов, непосредственно принадлежащих одному списку
       (вложенному) и косвенно - другому (объемлющему) }
  Элемент_5.1_списка;
  Элемент_5.2_списка;
 };
};

4.5. Альтернативы

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

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

Пример:

Каталог_типов & // { описание списка альтернатив }
{
 Тип_1
 {
  Характеристики;
 };
 Тип_2;
 Категория_типов_3 &
 {
  Тип_3_1;
  Тип_3_2;
  Тип_3_3;
 };
 Тип_4;
};
Описание_системы // { спецификация шаблона-описания системы }
{
 Тип ? @ /Каталог_типов; // { указание на необходимость выбора альтернативы }
 Тип_Т ? @ /Каталог_типов;
};
Система_В @ /Описание_системы
 // { спецификация конкретной системы по указанному шаблону }
{
 Тип : @ = Тип_1; // { выбор конкретной альтернативы }
 Тип_Т : @ = Категория_типов_3 & @{Категория_типов_3} = Тип_3_2;
};
Система_В_1 // { эквивалентная спецификация конкретной системы }
{
 Тип ? &
  // { задана одна альтернатива - она выбирается автоматически }
 {
  Тип_1
  {
   Характеристики;
  };
 };
 Тип_Т ? &
  // { задана одна альтернатива - она выбирается автоматически }
 {
  Категория_типов_3 &
  {
   Тип_3_2;
  };
 };
};
Система_В_2 // { эквивалентная спецификация конкретной системы }
{
 Тип $ // { имитация выбора альтернативы при помощи задания
           значения атрибута строкового типа }
 {
  Характеристики;
 } : @ = Тип_1;
 Тип_Т $$ : @ = Категория_типов_3 & @{Категория_типов_3} = Тип_3_2;
};

4.6. Множественная селекция

Множественная селекция (выбор) является другой разновидностью выбора из списка. Признак множественного выбора также указывает на описание допустимого множества сущностей (систем), но в отличие от выбора альтернативы, множественный выбор означает условное включение каждого элемента списка, включая элементы всех его "зацепленных" подсписков.

Признаком наличия множественного выбора является знак "!" в описании (множества сущностей) сразу после идентификатора или признака условного включения. Осуществление конкретного множественного выбора производится путем исключения получающегося условного включения каждого элемента списка.

Пример:

Каталог_свойств & // { описание списка свойств }
{
 Свойство_1
 {
  Характеристики;
 };
 Свойство_2;
 Категория_свойств_3 &
  // { группа свойств, объединенных по какому-то признаку }
 {
  Свойство_3_1;
  Свойство_3_2;
  Свойство_3_3;
 };
 Категория_свойств_4 &
 {
  Свойство_4_1;
  Свойство_4_2;
 };
};
Описание_системы_С // { спецификация шаблона-описания системы }
{
 Свойства ! @ /Каталог_свойств;
  // { указание на необходимость множественного выбора }
 Свойства_С ! @ /Каталог_свойств;
};
Система_Г @ /Описание_системы_С
 // { спецификация конкретной системы по указанному шаблону }
{
 Свойства
 {
  Свойство_1; // { явное указание на присутствие }
  Свойство_2-; // { указание на отсутствие данного свойства }
  Категория_свойств_3
   // { указание на присутствие некоторых свойств данной категории }
  {
   Свойство_3_1-; // { указание на отсутствие данного свойства }
   Свойство_3_2-;
   Свойство_3_3;
  };
  Категория_свойств_4-;// {все свойства данной категории отсутствуют}
 };
};
Система_Г_1 // { эквивалентная спецификация конкретной системы }
{
 Свойства &
 {
  Свойство_1;
  Свойство_2-;
  Категория_свойств_3 &
  {
   Свойство_3_1-;
   Свойство_3_2-;
   Свойство_3_3;
  };
  Категория_свойств_4-;
 };
};

4.7. Регуляризация спецификации

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

Признаком регулярности спецификации является знак "*" в описании сущности-массива сразу после идентификатора сущности или признака условного включения. Следует отметить, что возможны различные комбинации сочетаний знаков "+", "?", "!", "*" и "$", "#" обозначающие различные виды (типы) спецификаций.

Пример:

Описание_системы_Р // { спецификация шаблона-описания системы }
{
 Подсистемы * // { указание на наличие нескольких регулярных единиц
                  (в данном случае подсистем) с заданной структурой }
 { // { описание структуры любой (каждой) регулярной единицы }
  Характеристики;
 } : $0 <= 10; // { ограничение на число регулярных единиц }
};
Система_Д @ /Описание_системы_Р
 // { спецификация конкретной системы по указанному шаблону }
{
 Подсистемы
 { // { определение имен подсистем
       (и, возможно, конкретных характеристик каждой подсистемы) }
  Подсистема_1;
  Подсистема_2;
 };
};
Система_Д_1 // { эквивалентная спецификация конкретной системы }
{
 Подсистемы
 {
  Подсистема_1
  {
   Характеристики;
  };
  Подсистема_2
  {
   Характеристики;
  };
 };
};

4.8. Наследование

Наследование - дополнительная возможность в описываемом языке, которая позволяет сделать запись спецификации более короткой, более удобной для чтения и проверки ее семантики. Использование наследования при описании новой сущности или множества сущностей является указанием того, что данной множество - это подмножество наследуемой спецификации множества сущностей, описанной ранее. Другими словами, все свойства (т.е. идентификатор, тип, атрибуты, состав) описываемой сущности или множества сущностей сохраняются при наследовании. Возможно также множественное наследование, при котором описываемое множество является подмножеством пересечения наследуемых спецификаций множеств.

Признаком наследования является указание одной или более ссылок в описании данной сущности, а признаком указания ссылки является знак "@". Сама ссылка состоит из указания на отступ и последовательности квалифицированных идентификаторов. Указание на отступ, обозначающееся лексемой "/@", - это указание количества спецификаций сущностей, объемлющих данную, в которых не будет производиться поиск (в глубь) указанной последовательности квалифицированных идентификаторов при разрешении данной ссылки.

Разрешение ссылки, т.е. обработка указания на наследование происходит в несколько этапов:

  1. Поиск адресата ссылки - поиск начинается со спецификации сущности, объемлющей данную, с учетом указания на отступ и происходит на каждом уровне спецификаций, вплоть до самой крупной спецификации, объемлющей все просмотренные спецификации; поиск заканчивается при нахождении первого подходящего адресата (успешный поиск) или после просмотра самой крупной спецификации, объемлющей все просмотренные спецификации (некорректное наследование из-за неразрешимости ссылки); подходящий адресат считается найденным на данном уровне поиска, если данном уровне существует описание сущности с идентификатором, совпадающим с первым идентификатором из заданной ссылкой последовательности квалифицированных идентификаторов (без учета символа-квалификатора "/"), и в составе спецификации этой сущности есть сущности с идентификатором, совпадающим со вторым идентификатором из последовательности, и т.д. пока не будет просмотрена вся последовательность.
  2. Проверка соответствия типов данной описываемой сущности и наследуемой сущности (в случае успешного поиска).
  3. Проверка соответствия иерархии данной спецификации с иерархией, наследуемой (в случае соответствия типов).
  4. Проверка явной непротиворечивости выражений связи характеристик данной описываемой сущности и наследуемой сущности (в случае соответствия иерархий).

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

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

5. Описание связей характеристик

5.1. Ограничение множества атрибутов, ограничение при наследовании

5.2. Выражения, константы, признак числа

5.3. Функциональные операторы

5.4. Стандартные функции

5.4.1. Арифметические функции

5.4.2. Символьные функции

5.4.3. Функции обработки строк

5.5. Агрегатные функции

5.5.1. Принцип агрегирования

5.5.2. Итерация по строке

5.5.3. Итерация по непосредственным компонентам и элементам списка

5.5.4. Полная итерация с рекурсивным спуском

5.6. Оператор вычисления, непосредственная и условная вычислимость

6. Заключение

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

Разработка предложенного языка - это первый шаг работы по разработке концепций автоматизации спецификации сложных систем и созданию работающих прототипов средств автоматизации. Следующим шагом должна явиться разработка принципов использования описанного языка в системе автоматизации проектирования для представления "знаний" о возможных описываемых системах, а также разработка модели работы подобной системы автоматизации с учетом указанных принципов. После завершения этого шага уже будет возможна разработка работающего прототипа инструмента, автоматизирующего процесс проектирования спецификаций сложных систем, в том числе СУБ ИТ.