treerack/eskip.parser
2017-06-25 23:42:42 +02:00

58 lines
1.6 KiB
Plaintext

/*
Eskip routing configuration format for Skipper: https://github.com/zalando/skipper
*/
// TODO: definition with comment, doc = comment, or just replace comment
eskip:root = (expression | definitions)?;
comment-line:alias = "//" [^\n]*;
space:alias = [ \b\f\r\t\v];
comment:alias = comment-line (space* "\n" space* comment-line)*;
wsc:alias = [ \b\f\n\r\t\v] | comment;
decimal-digit:alias = [0-9];
octal-digit:alias = [0-7];
hexa-digit:alias = [0-9a-fA-F];
decimal:alias = [1-9] decimal-digit*;
octal:alias = "0" octal-digit*;
hexa:alias = "0" [xX] hexa-digit+;
int = decimal | octal | hexa;
exponent:alias = [eE] [+\-]? decimal-digit+;
float = decimal-digit+ "." decimal-digit* exponent?
| "." decimal-digit+ exponent?
| decimal-digit+ exponent;
number:alias = "-"? (int | float);
string = "\"" ([^\\"] | "\\" .)* "\"";
regexp = "/" ([^\\/] | "\\" .)* "/";
symbol = [a-zA-Z_] [a-zA-z0-9_]*;
arg:alias = number | string | regexp;
args:alias = arg (wsc* "," wsc* arg)*;
term:alias = symbol wsc* "(" wsc* args? wsc* ")";
predicate = term;
predicates:alias = "*" | predicate (wsc* "&&" wsc* predicate)*;
filter = term;
filters:alias = filter (wsc* "->" wsc* filter)*;
address:alias = string;
shunt = "<shunt>";
loopback = "<loopback>";
backend:alias = address | shunt | loopback;
expression = predicates (wsc* "->" wsc* filters)? wsc* "->" wsc* backend;
id:alias = symbol;
definition = id wsc* ":" wsc* expression;
free-sep:alias = (wsc | ";");
sep:alias = wsc* ";" free-sep*;
definitions:alias = free-sep* definition (sep definition)* free-sep*;