Для упрощения описания повторяющихся параметров предусмотрена возможность использования именованных констант и шаблонов.
В отличие от других конструкций языка, которые подвергаются семантическому анализу, константы и шаблоны полностью обрабатываются на этапе синтаксического разбора.
Описание каждой константы начинается с ключевого слова 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 )