Экземпляр семейства era

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

Конфигурация экземпляра семейства

<family-configuration> ::= <era-cfg-path>

Элементы конфигурации экземпляра семейства

<era-cfg-path>

Путь к файлу описания автомата.

Синтаксис файла конфигурации семейства era

<era-cfg> ::= <events> ","

<initial> ","

[<final> ","]

<scale> ","

{<state-declare> ","}

<events> ::= "events" ":" "[" <event> {"," <event>} "]"

<initial> ::= "initial" ":" <state>

<final> ::= "final" ":" <state>

<scale> ::= "scale" ":" <scale-value>

<state-declare> ::= <state> ":" "{"

<transition-func>

{"," <transition-func>}

"}"

<transition-func> ::=

<event> ":" <state> ["if" <condition>]

Элементы файла конфигурации семейства era

<events>

Список возможных событий.

<event>

Имя события.

<initial>

Начальное состояние.

<final>

Конечное состояние.

<state>

Имя состояния.

<scale>

Размерность таймера (множитель). Используется при вычислении условия (<condition>).

<state-declare>

Объявление состояния и переходов из этого состояния.

<transition-func>

Функция переходов. Описывается событием, состоянием и необязательным условием. При наступлении события будет осуществлен переход в указанное состояние. Если указано условие, то переход будет осуществлен только если условие возвращает true.

<condition>

Условие, при котором будет осуществлен переход. Условие может содержать зарезервированные слова true и false, а также следующие операторы: "|", "&", "!", "==", "!=", "<", "<=", ">", ">=", "-".

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

Пример

security.cfg

...

#include "kss/server/era.cfg"

/* era0 – пример экземпляра семейства "era". */

use family era0 = era "test.era";

...

test.era

events : [request, response],

initial : start,

final : stop,

scale : 10 msec,

start : {

/* при наступлении события "request" будет

осуществлен переход в состояние process */

request : process

},

process : {

/* Переход в состояние stop будет осуществлен,

если значение таймера события "request" больше

20 msec, т.е. последнее событие "request" произошло

более 20 msec назад. */

response : stop if request > 2

}

В начало