Специальные конструкции

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

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

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

Пример:

const А = 10

const structure = Filter(SourceIP = 1.1.1.1)

const c1 = 1,2,3

const c2 = 4,5,6

Описание объектов o1 и o2

Filter o1 ( DestinationPort* = c1,c2)

Filter o2 ( DestinationPort* = A )

Эквивалентно нижеследующему описанию:

Filter o1 ( DestinationPort* = 1,2,3,4,5,6)

Filter o2 ( DestinationPort* = 10 )

Шаблон (template) является константой, единственное значение которой является структурой того типа, к которой этот шаблон будет применен. Для использования шаблона, внутри описания структуры необходимо написать символ ’+’ и имя константы за ним. Подстановка шаблона заключается в копировании всех полей из структуры, которая является значением константы, в структуру, в которую шаблон подставляется.

Если в структуре, куда подставляется шаблон, присутствует поле, описанное в шаблоне, то возможны следующие варианты:

      в шаблоне и в структуре поле имеет признак списка – *, тогда значения объединяются в единый список, причем порядок составления списков соответствует порядку перечисления полей и шаблонов в структуре

      если признак списка в одном из описаний отсутствует, то будет ошибка разбора.

Пример:

Описание шаблона:

const icmp = Filter(ProtocolID* = 1)

Пример использования:

Filter  h_pl ( +icmp  DestinationIP = 23.4.4.5 )

Filter icmp_and_tcp ( +icmp ProtocolID* = 6 )

Эквивалентные описания:

Filter h_pl ( ProtocolID = 1 DestinationIP = 23.4.4.5 )

Filter ping_and_tcp ( ProtocolID = 1,6 )