automatic whitespace for eskip
This commit is contained in:
parent
5c9cdc0ad1
commit
8dbc479804
43
eskip.parser
43
eskip.parser
@ -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*;
|
|
||||||
|
@ -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",
|
||||||
|
}},
|
||||||
|
}},
|
||||||
}})
|
}})
|
||||||
}
|
}
|
||||||
|
@ -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})
|
||||||
|
Loading…
Reference in New Issue
Block a user