treerack/eskip.parser

51 lines
1.3 KiB
Plaintext
Raw Normal View History

2017-06-25 17:51:08 +02:00
/*
Eskip routing configuration format for Skipper: https://github.com/zalando/skipper
*/
eskip:root = (expression | definitions)?;
2017-10-29 01:14:31 +02:00
space:ws = [ \n\b\f\r\t\v];
comment:ws = "//" [^\n]*;
2017-06-25 17:51:08 +02:00
decimal-digit:alias = [0-9];
octal-digit:alias = [0-7];
hexa-digit:alias = [0-9a-fA-F];
2017-10-29 01:14:31 +02:00
decimal:alias:nows = [1-9] decimal-digit*;
octal:alias:nows = "0" octal-digit*;
hexa:alias:nows = "0" [xX] hexa-digit+;
int = decimal | octal | hexa;
2017-06-25 17:51:08 +02:00
2017-10-29 01:14:31 +02:00
exponent:alias:nows = [eE] [+\-]? decimal-digit+;
float:nows = decimal-digit+ "." decimal-digit* exponent?
| "." decimal-digit+ exponent?
| decimal-digit+ exponent;
2017-06-25 17:51:08 +02:00
2017-10-29 01:14:31 +02:00
number:alias:nows = "-"? (int | float);
2017-06-25 17:51:08 +02:00
2017-10-29 01:14:31 +02:00
string:nows = "\"" ([^\\"] | "\\" .)* "\"";
regexp:nows = "/" ([^\\/] | "\\" .)* "/";
symbol:nows = [a-zA-Z_] [a-zA-z0-9_]*;
2017-06-25 17:51:08 +02:00
arg:alias = number | string | regexp;
2017-10-29 01:14:31 +02:00
args:alias = arg ("," arg)*;
term:alias = symbol "(" args? ")";
2017-06-25 17:51:08 +02:00
predicate = term;
2017-10-29 01:14:31 +02:00
predicates:alias = "*" | predicate ("&&" predicate)*;
2017-06-25 17:51:08 +02:00
filter = term;
2017-10-29 01:14:31 +02:00
filters:alias = filter ("->" filter)*;
2017-06-25 17:51:08 +02:00
address:alias = string;
shunt = "<shunt>";
loopback = "<loopback>";
backend:alias = address | shunt | loopback;
2017-10-29 01:14:31 +02:00
expression = predicates ("->" filters)? "->" backend;
2017-06-25 17:51:08 +02:00
id:alias = symbol;
2017-10-29 01:14:31 +02:00
definition = id ":" expression;
2017-06-25 17:51:08 +02:00
2017-10-29 01:14:31 +02:00
definitions:alias = ";"* definition (";"+ definition)* ";"*;