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 ]