ABNF описание правил трансформации#
Для описания используется RFC 2234 Augmented Backus-Naur Form (ABNF).
Основные правила ABNF:#
ALPHA = %x41-5A / %x61-7A ; A-Z / a-z
BIT = "0" / "1"
CHAR = %x01-7F ; any 7-bit US-ASCII character, excluding NUL
CR = %x0D ; carriage return
CRLF = CR LF ; Internet standard newline
CTL = %x00-1F / %x7F ; controls
DIGIT = %x30-39 ; 0-9
DQUOTE = %x22 ; (Double Quote)
HEXDIG = DIGIT / "A" / "B" /
"C" / "D" / "E" / "F"
HTAB = %x09 ; horizontal tab
LF = %x0A ; linefeed
LWSP = *(WSP / CRLF WSP) ; linear white space (past newline)
OCTET = %x00-FF ; 8 bits of data
SP = %x20 ; space
VCHAR = %x21-7E ; visible (printing) characters
WSP = SP / HTAB ; white space
ABNF правил трансформации сообщений#
QUOTE = "'" ; single Quote
BACKSLASH = %x5C ; backslash '\'
;Константы
QSTRING = (DQUOTE / QUOTE) *(ALPHA / "\b" / "\n" / "\f" / "\r" / "\t" / BACKSLASH DQUOTE / BACKSLASH QUOTE ) (DQUOTE / QUOTE) ; quoted string constant
SHORT = ["-"] *DIGIT ["S" / "s"] ; short constant
INT = ["-"] *DIGIT "i" ; integer constant
BIGINTEGER = ["-"] *DIGIT ["B" / "b"] "I" ; big integer constant
DECIMAL = ["-"] *DIGIT "d" ; decimal constant
LONG = ["-"] *DIGIT ["L" / "l"] ; long constant
FLOAT = ["-"] *DIGIT ["." *DIGIT [ ("e" / "E") ["+" / "-"] *DIGIT]] ("f" / "F") ; float constant, regex "-?(\d+(\.\d*)?|\d*\.\d+)([eE][+-]?\d+)?[fF]"
DOUBLE = ["-"] *DIGIT ["." *DIGIT [ ("e" / "E") ["+" / "-"] *DIGIT]] ["D"] ; double constant
BOOLEAN = ("T" / "t") "rue" / "TRUE" / ("F" / "f") "alse" / "FALSE" ; boolean constant
NUMBER_CONSTANT = SHORT / INT / BIGINTEGER / DECIMAL / LONG / FLOAT / DOUBLE
CONSTANT = QSTRING / NUMBER_CONSTANT / BOOLEAN
;Ссылки
INPUT = "In" / "in" / "IN" ; корень входного сообщения
OUTPUT = "Out" / "out" / "OUT" ; корень выходного сообщения
HEADER = "Headers" / "headers" / "HEADERS" ; корень заголовков сообщения
ENVIRONMENT = "Environment" / "environment" / "ENVIRONMENT" ; корень переменных окружения
INPUT_ROOT = INPUT / ENVIRONMENT ; корень входных данных
OUTPUT_ROOT = OUTPUT / HEADER / ENVIRONMENT ; корень выходных данных
ROOT = INPUT / OUTPUT / HEADER / ENVIRONMENT ; корень структуры
INDEX = "[" ( *DIGIT / [+] ( ">" / "<" ) / VARIABLE ) "]" ; индекс элемента в массиве
NODE_NAME = ( ["@"] *(ALPHA / DIGIT / "_" / "-" / ":" / "*" / QUOTE) ) / [ *INDEX ] ; имя элемента структуры
PATH = NODE_NAME [ *( "." NODE_NAME ) ] ; путь от родителя к дочернему элементу
NODE_PATH = ROOT [ INDEX ] "." PATH ; путь от корня к дочернему элементу
INPUT_PATH = INPUT_ROOT [ INDEX ] "." PATH ; путь от корня к дочернему элементу
OUTPUT_PATH = OUTPUT_ROOT [ INDEX ] "." PATH ; путь от корня к дочернему элементу
VARIABLE = "$" *(ALPHA / "_" / "-" / DIGIT ) ; переменная
VAR_PATH = VARIABLE [ *( "." NODE_NAME ) ] ; путь от переменной к дочернему элементу
VALUE = ARITHMETIC_EXPR / CONSTANT / FUNCTION / NODE_PATH / VAR_PATH / ARRAY / LOGICAL_EXP ;значение элемента
ARRAY = "[" [ *LWSP ] VALUE [ *LWSP ] [ "," [ *LWSP ] VALUE [ *LWSP ] ] "]" ; массив
FUNCTION = *(ALPHA / DIGIT / "_" / "-") "(" [ *LWSP ] VALUE [ *LWSP ] [ "," [ *LWSP ] VALUE [ *LWSP ] ] ")" ; вызов функции
COMPARE_SIGN = "==" / "!=" / "<" / ">" / "=>" / "=<" ; операция сравнения
AND_SIGN = "AND" / "And" / "and" ; логический оператор И
OR_SIGN = "OR" / "Or" / "or" ; логический оператор ИЛИ
LOGIC_VALUE = ARITHMETIC_EXPR / CONSTANT / FUNCTION / NODE_PATH / VAR_PATH / ARRAY
COMPARE = LOGIC_VALUE [ *WSP ] COMPARE_SIGN [ *WSP ] LOGIC_VALUE ; операция сравнения двух значений
CONTAINS = LOGIC_VALUE *WSP IN *WSP ( LOGIC_VALUE / ARRAY) ; операция вхождения левого операнда в правый
LOGIC_NOT_EXP = "!" [*WSP] VALUE ; логическая операция отрицание
; Выражения
CONCAT_EXPR = [ *( VALUE [ *LWSP ] "||" [ *LWSP ]) ] VALUE ; конкатинация строковых значений
LOGIC_EXPR = LOGIC_NOT_EXP / COMPARE / CONTAINS / LOGIC_VALUE ; логическое выражение
SET_EXPR = OUTPUT_PATH [ *WSP ] "=" [ *WSP ] ( CONCAT_EXPR / ARITHMETIC_EXPR / VALUE ) ; изменение значения элемента
SET_VAR = ( "Define" / "define" / "DEFINE" ) [ *WSP ] *(ALPHA / "_" / "-") [ *WSP ] "=" [ *WSP ] ( CONCAT_EXPR / ARITHMETIC_EXPR / VALUE) ; задание переменной
SET_NAMESPACE = ( "Namespace" / "namespace" / "NAMESPACE" ) [ *WSP ] *(ALPHA / "_" / "-") [ *WSP ] = [ *WSP ] QSTRING ; задание пространства имен XML
IF_EXPR = ("If" / "if" / "IF") [ *WSP ] "(" [ *WSP ] LOGIC_EXPR [ *WSP ] ")" [ *LWSP ] BLOCK [ [ *LWSP ] ( "Else" / "else" / "ELSE" ) [ *LWSP ] BLOCK ]
FOR_EXPR = ( "For" / "for" / "FOR" ) [ *WSP ] "(" [ *WSP ] "$" *(ALPHA / "_" / "-") [ *WSP ] ":" *WSP VALUE [ *WSP ] ")" [ *LWSP ] BLOCK
SINGLE_EXPR = ( SET_EXPR / SET_VAR / IF_EXPR / FOR_EXPR / SET_NAMESPACE / FUNCTION )
BLOCK = "{" [ *LWSP ] SINGLE_EXPR [ *LWSP SINGLE_EXPR ] [ *LWSP ] "}"
; Арифметическое выражение
ARITHMETIC_EXPR = TERM * ( ("+" / "-") TERM)
TERM = FACTOR * ( ("*" / "/" / "%") FACTOR)
FACTOR = NUMBER_CONSTANT / NODE_PATH / VAR_PATH / FUNCTION / "(" *WSP ARITHMETIC_EXPR *WSP ")"
; Логическое выражение
LOGICAL_EXPR = LOGICAL_TERM * ( OR_SIGN LOGICAL_TERM)
LOGICAL_TERM = LOGICAL_FACTOR * ( AND_SIGN LOGICAL_FACTOR)
LOGICAL_FACTOR = LOGIC_EXPR / "(" *WSP LOGICAL_EXPR *WSP ")"
; Корневое выражения AST-дерева
ROOT_EXPR = [ *LWSP ] ( BLOCK / *( SINGLE_EXPR [ *LWSP ] ) ) [ *LWSP ]