atc-router 1.3.1

Versatile DSL based rule matching engine used by the Kong API Gateway
Documentation
WHITESPACE = _{ " " | "\t" | "\r" | "\n" }
ident = @{ ASCII_ALPHA ~ (ASCII_ALPHANUMERIC | "_" | ".")* }
rhs = { str_literal | rawstr_literal | ip_literal | int_literal }
transform_func = { ident ~ "(" ~ lhs ~ ")" }
lhs = { transform_func | ident }


int_literal = ${ "-"? ~ digits }
digits = _{ oct_digits | ( "0x" ~ hex_digits ) | dec_digits }
hex_digits = { ASCII_HEX_DIGIT+ }
oct_digits = { "0" ~ ASCII_OCT_DIGIT+ }
dec_digits = { ASCII_DIGIT+ }


str_literal = ${ "\"" ~ str_inner ~ "\"" }
str_inner = _{ (str_esc | str_char)* }
str_char = { !("\"" | "\\") ~ ANY }
str_esc = { "\\" ~ ("\"" | "\\" | "n" | "r" | "t") }

rawstr_literal = ${ "r#\"" ~ rawstr_char* ~ "\"#" }
rawstr_char = { !"\"#" ~ ANY }

ipv4_literal = @{ ASCII_DIGIT{1,3} ~ ( "." ~ ASCII_DIGIT{1,3} ){3} }
ipv6_literal = @{
    ( ":" | ASCII_HEX_DIGIT{1,4} ) ~ ":" ~ ( ASCII_HEX_DIGIT{1,4} | ":" )*
}
ipv4_cidr_literal = @{ ipv4_literal ~ "/" ~ ASCII_DIGIT{1,2} }
ipv6_cidr_literal = @{ ipv6_literal ~ "/" ~ ASCII_DIGIT{1,3} }
ip_literal = _{ ipv4_cidr_literal | ipv6_cidr_literal | ipv4_literal | ipv6_literal }


binary_operator = { "==" | "!=" | "~" | "^=" | "=^" | ">=" |
                    ">" | "<=" | "<" | "in" | "not" ~ "in" | "contains" }
logical_operator = _{ and_op | or_op }
and_op = { "&&" }
or_op = { "||" }


predicate = { lhs ~ binary_operator ~ rhs }
parenthesised_expression = { "(" ~ expression ~ ")" }
term = { predicate | parenthesised_expression }
expression = { term ~ ( logical_operator ~ term )* }
matcher = { SOI ~ expression ~ EOI }