automatic whitespace for eskip

This commit is contained in:
Arpad Ryszka 2017-10-29 01:14:31 +02:00
parent 5c9cdc0ad1
commit 8dbc479804
3 changed files with 52 additions and 30 deletions

View File

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

View File

@ -67,5 +67,31 @@ func TestSExpr(t *testing.T) {
}}, }},
}}, }},
ignorePosition: true, ignorePosition: true,
}, {
title: "comment and expression",
text: `; some comment
(some expression)`,
ignorePosition: true,
nodes: []*Node{{
Name: "list",
Nodes: []*Node{{
Name: "symbol",
}, {
Name: "symbol",
}},
}},
}, {
title: "empty comment and expression",
text: `;
(some expression)`,
ignorePosition: true,
nodes: []*Node{{
Name: "list",
Nodes: []*Node{{
Name: "symbol",
}, {
Name: "symbol",
}},
}},
}}) }})
} }

View File

@ -2,6 +2,7 @@ package treerack
import ( import (
"fmt" "fmt"
"strconv"
"strings" "strings"
) )
@ -59,6 +60,8 @@ func patchName(s ...string) string {
return strings.Join(s, ":") return strings.Join(s, ":")
} }
// TODO: check what's more useful: update quantified char classes or not
func applyWhitespaceToSeq(s *sequenceDefinition) []definition { func applyWhitespaceToSeq(s *sequenceDefinition) []definition {
var ( var (
defs []definition defs []definition
@ -78,7 +81,7 @@ func applyWhitespaceToSeq(s *sequenceDefinition) []definition {
singleItem := SequenceItem{Name: item.Name, Min: 1, Max: 1} singleItem := SequenceItem{Name: item.Name, Min: 1, Max: 1}
restName := patchName(item.Name, s.nodeName(), "wsrest") restName := patchName(item.Name, s.nodeName(), "wsrest", strconv.Itoa(i))
restDef := newSequence(restName, Alias, []SequenceItem{whitespace, singleItem}) restDef := newSequence(restName, Alias, []SequenceItem{whitespace, singleItem})
defs = append(defs, restDef) defs = append(defs, restDef)
@ -99,7 +102,7 @@ func applyWhitespaceToSeq(s *sequenceDefinition) []definition {
continue continue
} }
optName := patchName(item.Name, s.nodeName(), "wsopt") optName := patchName(item.Name, s.nodeName(), "wsopt", strconv.Itoa(i))
optDef := newSequence(optName, Alias, []SequenceItem{whitespace, singleItem, restItems}) optDef := newSequence(optName, Alias, []SequenceItem{whitespace, singleItem, restItems})
defs = append(defs, optDef) defs = append(defs, optDef)
items = append(items, SequenceItem{Name: optName, Min: 0, Max: 1}) items = append(items, SequenceItem{Name: optName, Min: 0, Max: 1})