From 8dbc479804a6477f84144ccbea6537c2068e666c Mon Sep 17 00:00:00 2001 From: Arpad Ryszka Date: Sun, 29 Oct 2017 01:14:31 +0200 Subject: [PATCH] automatic whitespace for eskip --- eskip.parser | 49 +++++++++++++++++++++---------------------------- sexpr_test.go | 26 ++++++++++++++++++++++++++ whitespace.go | 7 +++++-- 3 files changed, 52 insertions(+), 30 deletions(-) diff --git a/eskip.parser b/eskip.parser index 541a577..3a6cdcf 100644 --- a/eskip.parser +++ b/eskip.parser @@ -2,56 +2,49 @@ 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; +space:ws = [ \n\b\f\r\t\v]; +comment:ws = "//" [^\n]*; 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; +decimal:alias:nows = [1-9] decimal-digit*; +octal:alias:nows = "0" octal-digit*; +hexa:alias:nows = "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; +exponent:alias:nows = [eE] [+\-]? decimal-digit+; +float:nows = decimal-digit+ "." decimal-digit* exponent? + | "." decimal-digit+ exponent? + | decimal-digit+ exponent; -number:alias = "-"? (int | float); +number:alias:nows = "-"? (int | float); -string = "\"" ([^\\"] | "\\" .)* "\""; -regexp = "/" ([^\\/] | "\\" .)* "/"; -symbol = [a-zA-Z_] [a-zA-z0-9_]*; +string:nows = "\"" ([^\\"] | "\\" .)* "\""; +regexp:nows = "/" ([^\\/] | "\\" .)* "/"; +symbol:nows = [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* ")"; +args:alias = arg ("," arg)*; +term:alias = symbol "(" args? ")"; predicate = term; -predicates:alias = "*" | predicate (wsc* "&&" wsc* predicate)*; +predicates:alias = "*" | predicate ("&&" predicate)*; filter = term; -filters:alias = filter (wsc* "->" wsc* filter)*; +filters:alias = filter ("->" filter)*; address:alias = string; shunt = ""; loopback = ""; backend:alias = address | shunt | loopback; -expression = predicates (wsc* "->" wsc* filters)? wsc* "->" wsc* backend; +expression = predicates ("->" filters)? "->" backend; id:alias = symbol; -definition = id wsc* ":" wsc* expression; +definition = id ":" expression; -free-sep:alias = (wsc | ";"); -sep:alias = wsc* ";" free-sep*; -definitions:alias = free-sep* definition (sep definition)* free-sep*; +definitions:alias = ";"* definition (";"+ definition)* ";"*; diff --git a/sexpr_test.go b/sexpr_test.go index d28e92d..d907c6a 100644 --- a/sexpr_test.go +++ b/sexpr_test.go @@ -67,5 +67,31 @@ func TestSExpr(t *testing.T) { }}, }}, 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", + }}, + }}, }}) } diff --git a/whitespace.go b/whitespace.go index 2683a37..ff00779 100644 --- a/whitespace.go +++ b/whitespace.go @@ -2,6 +2,7 @@ package treerack import ( "fmt" + "strconv" "strings" ) @@ -59,6 +60,8 @@ func patchName(s ...string) string { return strings.Join(s, ":") } +// TODO: check what's more useful: update quantified char classes or not + func applyWhitespaceToSeq(s *sequenceDefinition) []definition { var ( defs []definition @@ -78,7 +81,7 @@ func applyWhitespaceToSeq(s *sequenceDefinition) []definition { 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}) defs = append(defs, restDef) @@ -99,7 +102,7 @@ func applyWhitespaceToSeq(s *sequenceDefinition) []definition { 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}) defs = append(defs, optDef) items = append(items, SequenceItem{Name: optName, Min: 0, Max: 1})