Книга: Учебное пособие по курсу «Нейроинформатика»

Описание языка описания компонентов

Описание языка описания компонентов

В табл. 12 приведен список ключевых слов, общих для всех языков описания компонентов нейрокомпьютера. Кроме того, к ключевым словам относятся типы данных, приведенные в табл. 1; обозначения операций, приведенные в табл. 3, 7, 8, 9, 10; названия функций преобразования (табл. 5) и приведения типов (табл. 6); идентификаторы предопределенных констант, приведенные в табл. 11; имена интерфейсных функций, приведенных в разделе «Перечень интерфейсных функций»; имена элементарных функций, приведенных в табл.13; обозначения строковых функций, приведенных в разделе «Строковые функции» и обозначения функций управления памятью из раздела «Функции управления памятью».

Таблица 12. Ключевые слова, общие для всех языков описания компонент нейрокомпьютера.

Ключевое слово Краткое описание
Begin Начало описания тела процедуры, или операторных скобок.
By Часть оператора цикла с шагом. Предшествует шагу цикла.
Do Завершающая часть операторов цикла.
Else Часть условного оператора. Предшествует оператору, выполняемому, если условие ложно.
End Конец описания тела процедуры или операторных скобок.
For Заголовок оператора цикла с шагом.
Function Заголовок описания функции.
Global Начало блока описания глобальных переменных.
GoTo Начало оператора перехода.
If Начало условного оператора.
Include Предшествует имени файла, целиком вставляемого в это место описания.
Label Начало описания меток
Name Предшествует имени статической переменной.
SetParameters Признак раздела установления значений параметров.
Static Начало блока описания статических переменных.
Then Часть условного оператора. Предшествует оператору, выполняемому, если условие истинно.
To Часть оператора цикла с шагом. Предшествует верхней границе цикла.
Var Начало блока описания переменных.
While Заголовок оператора цикла по условию.

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

Имя Значение
Sin Синус
Cos Косинус
Tan Тангенс
Atan Арктангенс
Sh Гиперболический синус
Ch Гиперболический косинус
Th Гиперболический тангенс
Lg Логарифм двоичный
Ln Логарифм натуральный
Exp Экспонента
Sqrt Квадратный корень
Sqr Квадрат
Abs Абсолютное значение
Sign Знак аргумента (0 — минус)

Передача аргументов функциям

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

Имена структурных единиц компонентов

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

1. Имя компонента является полным именем компонента.

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

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

Способ описания синтаксических конструкций

Для описания синтаксиса языков описаний компонентов используется расширенная Бэкусова нормальная форма. Описание синтаксиса языка с помощью БНФ состоит в расшифровке понятий от более сложных к более простым. Каждое предложение БНФ состоит из двух частей, разделенных символами «::=» (два двоеточия, за которыми следует знак равенства). Наиболее подходящим названием для этого разделителя является слово «является» в отличие от «равно» или «присвоить» в языках программирования. Слева от разделителя находится объясняемое понятие, справа — конструкция разъясняющая это понятие. Например, предложение

<Имя переменной>::= <Идентификатор>

означает, что объясняемое понятие — <Имя переменной> является идентификатором. Заметим, что порядок предложений в БНФ описания синтаксиса языка не имеет значения. Однако традиционно сложилось так, что БНФ начинают с наиболее сложных понятий.

При описании синтаксиса языка с помощью БНФ используются следующие понятия и обозначения.

Нетерминальным символом называется понятие, которое должно быть раскрыто в пределах данной БНФ. Нетерминальным символом является произвольный набор символов, заключенный в угловые скобки, например <Имя>. Нетерминальный символ раскрыт, если в пределах БНФ встретилось предложение, в котором этот нетерминальный символ стоит в левой части.

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

Подмножеством терминальных символов является набор ключевых слов языка. Для удобства ключевые слова набраны полужирным шрифтом, например, Имя.

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

<Целое число>::= [—] <Положительное целое число>

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

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

<Буква>::= { A | B |C | D | E | F | G | H | I | J | K |L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z }

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

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

Кроме того в данную модификацию БНФ включены нетерминальные символы с параметрами. В теле нетерминального символа параметры набраны полужирным курсивом. В качестве примера приведем набор предложений, описывающих формальные аргументы:

<Список формальных аргументов>::= <Формальный аргумент> [; <Список формальных аргументов>]
<Формальный аргумент>::= <Список имен аргументов>:<Скалярный тип>
<Список имен аргументов>::= <Имя аргумента> [,<Список имен аргументов>]
<Имя аргумента>::= <Идентификатор>
<Аргумент типа Тип> — одно из следующих понятий:
 имя аргумента, который при описании формальных аргументов имел тип Тип
 имя элемента аргумента-массива, если элементы массива имеют тип Тип
 результат приведения произвольного аргумента или элемента аргумента-массива к типу Тип.

В этом фрагменте содержится предложение, раскрывающее понятие <Аргумент типа Тип>, являющееся нетерминальным символом с параметром. Из последнего предложения легко понять, что представляет собой понятие <Аргумент типа Тип>. Для описания этого понятия в соответствии с требованиями стандартной БНФ пришлось бы описывать отдельно следующие понятия: <Аргумент типа long>, <Аргумент типа real>, <Аргумент типа integer>, <Аргумент типа color>, <Аргумент типа logic>, <Аргумент типа string>, <Аргумент типа prealarray>, <Аргумент типа pintegerarray>, <Аргумент типа plongarray>, <Аргумент типа plogicarray>, <Аргумент типа pstring>, <Аргумент типа visual>, <Аргумент типа pointer>, <Аргумент типа functype>. Кроме того, пришлось бы отказаться от простой и понятной конструкции описания формальных аргументов. Ниже приведена часть конструкции описания формальных аргументов, которую пришлось бы включить в БНФ. В данном фрагменте приведена расшифровка только одного понятия — <Аргумент типа long>. Остальные нераскрытые понятия описываются аналогично. Понятия <Идентификатор> и <Номер элемента> считаются раскрытыми ранее.

<Список формальных аргументов>::= <Формальный аргумент> [; <Список формальных аргументов>]
<Формальный аргумент>::= {<Формальный аргумент типа Long> | <Формальный аргумент типа Real> | <Формальный аргумент типа Integer> | <Формальный аргумент типа Color> | <Формальный аргумент типа Logic> | <Формальный аргумент типа String> | <Формальный аргумент типа PRealArray> | <Формальный аргумент типа PIntegerArray> | <Формальный аргумент типа PLongArray> | <Формальный аргумент типа PLogicArray> | <Формальный аргумент типа PString> | <Формальный аргумент типа Visual> | <Формальный аргумент типа Pointer> | <Формальный аргумент типа FuncType>}
<Формальный аргумент типа Long>::= <Список имен аргументов типа Long>: Long;
<Список имен аргументов типа Long>::= <Имя аргумента типа Long> [,<Список имен аргументов типа Long>]
<Имя аргумента типа Long>::= <Идентификатор>
<Аргумент типа Long>::= {<Имя аргумента типа Long> | <Имя аргумента типа PLongArray>^[ <Номер элемента>] | TLong( <Имя произвольного аргумента>) }
<Имя произвольного аргумента>::= <Имя аргумента типа Long>, <Имя аргумента типа Real>, <Имя аргумента типа Integer>, <Имя аргумента типа Color>, <Имя аргумента типа Logic>, <Имя аргумента типа String>, <Имя аргумента типа PRealArray>, <Имя аргумента типа PIntegerArray>, <Имя аргумента типа PLongArray>, <Имя аргумента типа PLogicArray>, <Имя аргумента типа PString>, <Имя аргумента типа Visual>, <Имя аргумента типа Pointer>, <Имя аргумента типа FuncType>

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

Описание общих синтаксических конструкций

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

Список синтаксических конструкций общего назначения:

<Идентификатор>::= <Буква> [<Символьная строка>]
<Буква>::= {a | b |c | d |e |f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y |z | A | B |C | D | E | F | G | H | I | J | K |L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z }
<Символьная строка>::= {<Буква> | <Цифра> | _ } [<Символьная стока>]
<Цифра>::= {0 | 1 | 2 | 3 | 4 | 5 | 6 |7 |8 |9 }
<Число>::= {<Целое число> | <Действительное число>}
<Целое число>::= [—] <Положительное целое число>
<Положительное целое число>::= <Цифра> [<Положительное целое число>]
<Действительное число>::= <Целое число>[.<Положительное целое число>][e<Целое число>]
<Целочисленная константа>::= {<Предопределенная константа типа Integer> | < Предопределенная константа типа Long> | <Целое число>}
<Цветовая константа>::= H <Шестнадцатеричная цифра> <Шестнадцатеричная цифра> <Шестнадцатеричная цифра> <Шестнадцатеричная цифра>
<Шестнадцатеричная цифра>::= {0 | 1 | 2 | 3 | 4 | 5 | 6 |7 |8 |9 | A | B |C | D | E | F }
<Строковая константа>::= “<Строка произвольных символов>”
<Логическая константа>::= {True | False}
<Строка произвольных символов> — Последовательность произвольных символов из набора ANSI. В этой последовательности допускаются символы национальных алфавитов. При необходиости включить в эту конструкцию символ кавычек, он должен быть удвоен.
<Скалярный тип>::= {Long|Real|Integer|Color|Logic|String|PRealArray|PIntegerArray|PLongArray|PLogicArray|PString|Visual|Pointer|FuncType}
<Тип массива>::= { RealArray|IntegerArray|LongArray|LogicArray}
<Константа типа Тип> — константа имеющая тип Тип.

Список синтаксических конструкций для формальных аргументов:

<Список формальных аргументов>::= <Формальный аргумент> [; <Список формальных аргументов>]
<Формальный аргумент>::= <Список имен аргументов>:<Скалярный тип>
<Список имен аргументов>::= <Имя аргумента> [,<Список имен аргументов>]
<Имя аргумента>::= <Идентификатор>
<Аргумент типа Тип> — одно из следующих понятий:
 имя аргумента, который при описании формальных аргументов имел тип Тип
 имя элемента аргумента-массива, если элементы массива имеют типТип
 результат приведения произвольного аргумента или элемента аргумента-массива к типу Тип.

Синтаксические конструкции описания переменных:

<Описание переменных>::= Var<Список описаний однотипных переменных>
<Список описаний однотипных переменных>::= <Тип переменной> <Список переменных>; [<Список описаний однотипных переменных>]
<Список переменных>::= <Имя переменной> [, <Список переменных>]
<Имя переменной>::= <Идентификатор>
<Тип переменной>::= {<Скалярный тип> | <Тип массива>[ <Целочисленноеконстантное выражение>] }
<Переменная типа Тип> — одно из следующих понятий:
 имя переменной, которая при описании переменных имела тип Тип
 имя элемента массива, если элементы массива имеют типТип
 результат приведения произвольной переменной или элемента массива к типу Тип.

Синтаксическая конструкция описания глобальных переменных (доступна только в языках описания компонентов учитель и контрастер):

<Описание глобальных переменных>::= Global<Список описаний однотипных переменных>

Синтаксические конструкции описания статических переменных

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

<Описание статических переменных>::= Static <Список описаний статических переменных>
<Список описаний статических переменных>::= <Описание статической переменной>; [<Список описаний статических переменных>]
<Описание статической переменной>::= <Тип переменной> <Имя переменной> [Name <Имя статической переменной>] [Default <Значение по умолчанию>]
<Имя статической переменной>::= <Строковая константа>
<Значение по умолчанию>::= <Константное выражение типа <Тип переменной>>

Синтаксические конструкции описания функций

<Описание функций>::= <Описание функции> [<Описание функций>]
<Описание функции>::= <Заголовок функции> <Описание переменных> <Описание меток> <Тело функции>
<Заголовок функции>::= Function<Имя функции>[( <Список формальных аргументов>)]: <Скалярный тип>;
<Описание меток>::= Label<Список меток>;
<Список меток>::= <Имя метки> [, <Список меток>]
<Имя метки>::= <Идентификатор>
<Тело функции>::= Begin<Составной оператор> End;
<Составной оператор>::= [<Имя метки>:] <Оператор> [; <Составной оператор>]
<Оператор>::= {<Оператор присваивания> | <Оператор ветвления> | <Оператор цикла> | <Оператор перехода> | <Операторные скобки>}
<Оператор присваивания>::= <Допустимое имя переменной> =<Выражение>
<Оператор ветвления>::= If<Логическое выражение> Then<Оператор> [Else<Оператор>]
<Оператор цикла>::= { <Цикл For> | <Цикл While> }
<Цикл For>::= For<Имя переменной> = <Целочисленное выражение> To<Целочисленное выражение> [By<Целочисленное выражение>] Do <Оператор>
<Цикл While>::= While<Логическое выражение> Do <Оператор>
<Оператор перехода>::= GoTo <Имя метки>
<Операторные скобки>::= Begin<Составной оператор> End
<Функция типа Тип > — функция, возвращающая величину типа Тип.
<Допустимое имя переменной> — допустимой переменной являются все переменные, описанные в данной функции или в данном процедурном блоке, глобальные переменные данного компонента. Для возвращения значения функции, в левой части оператора присваивания должно стоять имя функции.

Синтаксические конструкции описания выражений:

<Выражение>::= { <Выражение типа Long> | <Выражение типа Real> | <Выражение типа Integer> | <Выражение типа Color> | <Выражение типа Logic> | <Выражение типа String>|<Выражение типа Pointer>}
<Целочисленное выражение>::= { <Выражение типа Long> | <Выражение типа Integer>}
<Выражение типа Тип>::= [<Префиксная операция типа Тип>] <Операнд типа Тип> [<Операция типа Тип> <Операнд типа Тип>]
<Операция типа Long>::= {+| —| *|Div| Mod| And| Or| Xor}
<Операция типа Real>::= {+| —| *|/| RMod }
<Операция типа Integer>::= {+| —| *|Div| Mod| And| Or| Xor}
<Операция типа Color>::= {COr| CAnd| CXor}
<Операция типа Logic>::= {And| Or| Xor}
<Операция типа String>::= +
<Префиксная операция типа Long>::= { —| Not }
<Префиксная операция типа Real>::= —
<Префиксная операция типа Integer>::= { —| Not }
<Префиксная операция типа Color>::= CNot
<Префиксная операция типа Logic>::= Not
<Операнд типа Logic>::=::= {<Результат сравнения> | <Выражение типа Logic> | ( <Выражение типа Logic>) | <Константа типа Logic> | <Переменная типа Logic> | <Аргумент типа Logic> | <Вызов функции типа Logic>}
<Результат сравнения типов Long, Integer, Real>::= ( <Выражение типаLong, Integer, Real> {> | < | >= | <= | = | <>} <Выражение типаLong, Integer, Real> )
<Результат сравнения типаColor>::= ( <Выражение типа Color> {CEqual | CIn | CInclude | CExclude | CIntersect} <Выражение типа Color> )
<Результат сравнения типа String>::= ( <Выражение типаString> {= | <>} <Выражение типаString> )
<Операнд типа Тип>::= {<Выражение типа Тип> | ( <Выражение типа Тип>) | <Константа типа Тип> | <Переменная типа Тип> | <Аргумент типа Тип> | <Вызов функции типа Тип>}
<Вызов функции типа Тип>::= <Имя функции типа Тип> [( <Список фактических аргументов>)]
<Список фактических аргументов>::= <Выражение> [,<Список фактических аргументов>]
<Константное выражение типа Тип> — <Выражение типа Тип> в операндах которого не могут фигурировать переменные и функции, описанные пользователем.
<Числовое выражение>::= { <Выражение типа Long> | <Выражение типа Real> | <Выражение типа Integer>}

Синтаксические конструкции задания значений статическим переменным

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

<Установление параметровСтруктурной единицы>::= <Однозначное имя Структурной единицы> [[ [<Переменная цикла>:] <Начальный номер> [..<Конечный номер> [:<Шаг>]]]] SetParameters <Список значений параметров>
<Переменная цикла>::= <Идентификатор>
<Начальный номер>::= <Константное выражение типа Long>
<Конечный номер>::= <Константное выражение типа Long>
<Шаг>::= <Константное выражение типа Long>
<Список значений параметров>::= <Значение параметра> [,<Список значений параметров>]
<Значение параметра>::= <Специальное выражение типа Тип>
<Специальное выражение типа Тип>::= [<Префиксная операция типа Тип>] <Специальный операнд типа Тип> [<Операция типа Тип> <Специальный операнд типа Тип>]
<Специальный операнд типа Тип >::= {<Специальное выражение типа Тип >|<Константатипа Тип>|<Переменная цикла>|(<Специальное выражение типа Тип >|<Аргумент типа Тип> | <Вызов функции типа Тип>)>

Синтаксические конструкции описания распределения сигналов или параметров:

Данная конструкция имеет четыре аргумента, имеющих следующий смысл:

Данное — сигнал или параметр.

Объект — предобработчик, интерпретатор, оценка, сеть.

Подобъект— частный предобработчик, частный интерпретатор, частная оценка, подсеть.

<Идентификатор данных>— одно из ключевых слов signals, parameters, data, insignals, outsignals.
<Описание распределения Данных, Объекта, Подобъекта,<Идентификатор данных>>::= Connections<Описание групп соответствийДанных>
<Описание групп соответствийДанных>::= <Описание группы соответствийДанных> [;<Описание групп соответствийДанных>]
<Описание группы соответствийДанных>::= <Блок сигналов Подобъекта> <=> {<Блок сигналов Объекта> | <Блок сигналов Подобъекта>}
<Блок сигналов Подобъекта>::= <Описатель сигналов Подобъекта> [;<Блок сигналов Подобъекта>]
<Описатель сигналов Подобъекта>::= { For<Переменная цикла> = <Начальный номер> To<Конечный номер> [Step <Шаг>] Do <Блок сигналов Подобъекта> End| <Список Данных Подобъекта>}
<Переменная цикла>::= <Идентификатор>
<Список Данных Подобъекта>::= <ДанноеПодобъекта>[; <Список ДанныхПодобъекта>]
<ДанноеПодобъекта>::= <Псевдоним>[[ <Номер экземпляра>]].<Идентификатор данных>[[ <Номер Данного>]]
<Номер экземпляра>::= {<Специальное выражение типа Long>| [+:]<Начальный номер> [..<Конечный номер> [:<Шаг>]]}
<Номер Данного> {<Специальное выражение типа Long>| [+:]<Начальный номер> [..<Конечный номер> [:<Шаг>]]}
<Блок ДанныхОбъекта>::= <Описатель ДанныхОбъекта> [; <Блок ДанныхОбъекта>]
<Описатель ДанныхОбъекта>::= { For<Переменная цикла> = <Начальный номер> To<Конечный номер> [Step <Шаг>] Do <Блок ДанныхОбъекта> End| <Список ДанныхОбъекта> }
<Список Данных Объекта>::= <ДанноеОбъекта>[; <Список ДанныхОбъекта>]
<ДанноеОбъекта>::= <Идентификатор данных>[[ <Номер Данного>]]

Комментарии

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

Область действия переменных

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

Заглавные и прописные буквы не различаются ни в именах, ни в ключевых словах.

Языки описания некоторых компонентов позволяют описывать глобальные переменные. Эти переменные доступны во всех функциях и процедурных блоках данного компонента. Функциям и процедурным блокам других компонентов эти переменные недоступны. Все остальные переменные (описанные в блоках Var и Static) являются локальными и доступны только в пределах той функции или процедурного блока, в котором они описаны. Статические переменные сохраняют свое значение между вызовами функций или процедурных блоков, тогда как переменные, описанные в блоках Var не сохраняют. В некоторых компонентах определены стандартные переменные и массивы (см. например описание языка описания нейронных сетей). В таких разделах область доступности предопределенных переменных оговаривается отдельно.

Переменная Error является глобальной для всех компонентов. Глобальной является также переменная ErrorManager. Однако не рекомендуется использование этих переменных путем прямого обращения к ним. Для получения значения переменной Error служит запрос GetError, исполняемый макрокомпонентом нейрокомпьютер.

Основные операторы

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

Оператор ветвления. Оператор ветвления состоит из трех частей, каждая из которых начинается соответствующим ключевым словом. Первая часть — условие, начинается с ключевого слова If и содержит логическое выражение. В зависимости от значения вычисленного логического выражения выполняется Then часть (истина) или Else часть (ложь). Третья (Else) часть оператора может быть опущена. Каждая из выполняемых частей состоит из ключевого слова и оператора. При необходимости выполнить несколько операторов, необходимо использовать операторные скобки Begin End.

Цикл For имеет следующий вид:

For Переменная_цикла = Начальное_значение To Конечное_значение [By Шаг] Do <Оператор>

Переменная цикла должна быть одного из целочисленных типов. В ходе выполнения оператора она пробегает значения от Начальное_значение до Конечное_значение с шагом Шаг. Если описание шага опущено, то шаг равен единице. При каждом значении переменной цикла из диапазона выполняется оператор, являющийся телом цикла. Если в теле цикла необходимо выполнить несколько операторов, то необходимо воспользоваться операторными скобками. Допускается любое число вложенных циклов. Выполнение цикла в зависимости от соотношения между значениями Начальное_значение, Конечное_значение и Шаг приведено в табл. 14.

Таблица 14. Способ выполнения цикла в зависимости от значений параметров цикла.

Конечное значение Шаг Способ выполнения
>Начального значения >0 Цикл выполняется пока переменная цикла ? Конечного значения
<Начального значения >0 Тело цикла не выполняется
=Начальному значению ?0 Тело цикла выполняется один раз
>Начального значения <0 Тело цикла не выполняется
<Начального значения <0 Цикл выполняется пока переменная цикла ? Конечного значения
Любое =0 Тело цикла не выполняется

Цикл While. Тело цикла выполняется до тех пор, пока верно логическое выражение. Проверка истинности логического выражения производится перед выполнением тела цикла. Если тело цикла должно содержать более одного оператора, то необходимо использовать операторные скобки.

Описание распределения сигналов

Раздел описания распределения сигналов начинается с ключевого слова Connections. За ключевым словом Connections следует одна или несколько групп соответствий. Каждая группа соответствий состоит из правой и левой частей, разделенных символами «<=>«и описывает соответствие имен сигналов (параметров) различных структурных единиц. Каждая часть группы соответствий представляет собой список сигналов (параметров) или интервалов сигналов (параметров), разделенных между собой символом «;». Указанные в левой и правой частях сигналы (параметры) отождествляются. Если при указании сигнала (параметра) не указано имя подобъекта, то это сигнал (параметр) описываемого объекта. Использование интервала сигналов (параметров) в правой или левой части группы соответствий равносильно перечислению сигналов (параметров), с номерами, входящими в интервал, начиная с начального номера c шагом, указанным после символа «:». Если шаг не указан, то он полагается равным единице. Число сигналов в правой и левой частях группы соответствий должно совпадать. Если интервал пуст (например [2..1:1]), то описываемая им группа сигналов считается отсутствующей и пропускается. При использовании в описании соответствий явных циклов, во всех выражениях внутри цикла возможно использование переменной цикла. При этом подразумевается следующий порядок перечисления: Сначала изменяется номер в самом правом интервале, далее во втором справа, и т. д. В последнюю очередь изменяются значения переменных цикла явных циклов в порядке их вложенности (переменная самого внутреннего цикла меняется первой и т. д.). Рассмотрим следующий пример описания группы соответствий блока, содержащего две сети Net с 3 входами каждая. Ниже приведено две различных структуры связей по несколько эквивалентных вариантов описания.

Случай 1. Естественный порядок связей.

Вариант 1.

InSignals[1] <=> Net[1].InSignals[1]
InSignals[2] <=> Net[1].InSignals[2]
InSignals[3] <=> Net[1].InSignals[3]
InSignals[4] <=> Net[2].InSignals[1]
InSignals[5] <=> Net[2].InSignals[2]
InSignals[6] <=> Net[2].InSignals[3]

Вариант 2.

InSignals[1..6] <=> Net[1..2].InSignals[1..3]

Вариант 3.

InSignals[1];InSignals[2];InSignals[3];InSignals[4];InSignals[5];InSignals[6] <=> For I=1 To 3 Do For J=1 To 2 Do Net[J].InSignals[I] End End

Случай 2. Другой порядок связей.

Вариант 1.

InSignals[1] <=> Net[2].InSignals[3]
InSignals[2] <=> Net[1].InSignals[3]
InSignals[3] <=> Net[2].InSignals[2]
InSignals[4] <=> Net[1].InSignals[2]
InSignals[5] <=> Net[2].InSignals[1]
InSignals[6] <=> Net[1].InSignals[1]

Вариант 2.

InSignals[1..6] <=> For I=3 To 1 Step -1 Do Net[2..1:-1].InSignals[I] End

Вариант 3.

InSignals[6..1:-2]; InSignals[5..1:-2]<=> For I=1 To 3 Do For J=1 To 2 Do Net[J].InSignals[I] End End

Функции управления памятью

Для создания массивов и освобождения занимаемой ими памяти используются следующие функции:

Создание массива.

Function NewArray(Type: Integer; Size: Long): PRealArray;

Описание аргументов:

Type — задает размер элемента массива и является одной из предопределенных констант, приведенных в табл. 15.

Size — число элементов в массиве.

Описание исполнения.

1. Если аргумент Type не совпадает ни с одной из предопределенных констант, приведенных в табл. 15, то возвращается значение Null, исполнение функции завершается.

2. Создается массив, занимающий Size*Type+4 байта.

3. Адрес массива возвращается как результат.

Таблица 15. Предопределенные константы типов элементов массивов

Идентификатор Значение Описание
mRealArray 4 Размер элемента — 4 байта
mIntegerArray 2 Размер элемента — 2 байта
mLongArray 4 Размер элемента — 4 байта
mLogicArray 1 Размер элемента — 1 байт

Освобождение массива.

Function FreeArray(Type: Integer; Array: PRealArray): Logic;

Описание аргументов:

Type — задает размер элемента массива и является одной из предопределенных констант, приведенных в табл. 15.

Array — адрес массива. Память, занимаемая этим массивом, должна быть освобождена.

Описание исполнения.

1. Если аргумент Type не совпадает ни с одной из предопределенных констант, приведенных в табл. 15, то возвращается значение False, исполнение функции завершается.

2. Освобождается память размером TReal(Array[0])*Type+4 байта.

3. Аргументу Array присваивается значение Null

Пересоздание массива.

Function ReCreateArray(Type: Integer; Array: PRealArray; Size: Long): Logic;

Описание аргументов:

Type — задает размер элемента массива и является одной из предопределенных констант, приведенных в табл. 15.

Array — адрес массива.

Size — число элементов в массиве.

Описание исполнения.

1. Если аргумент Type не совпадает ни с одной из предопределенных констант, приведенных в табл. 15, то возвращается значение False, исполнение функции завершается.

2. Если аргумент Array не равен Null, и TReal(Array[0]) равен Size, то возвращается значение True, выполнение функции завершается.

3. Если аргумент Array не равен Null, и TReal(Array[0]) не равен Size, то освобождается память размером TReal(Array[0])*Type+4 байта. Аргументу Array присваивается значение Null

4. Аргументу Array присваивается значение NewArray(Type,Size), возвращается значение True, исполнение функции завершается.

Оглавление книги


Генерация: 1.594. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз