forked from square/grange
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathrange.peg
57 lines (47 loc) · 1.87 KB
/
range.peg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package grange
type rangeQuery Peg {
currentLiteral string
nodeStack []parserNode
}
expression <- combinedexpr? !.
combinedexpr <- rangeexpr combinators?
rangeexpr <- space
( const
/ function
/ cluster
/ clusterq
/ group
/ groupq
/ localkey
/ regex
/ value
/ brackets
/ { p.addBraceStart() } braces
)
space
combinators <- space (union / intersect / exclude / braces)
intersect <- '&' rangeexpr { p.addOperator(operatorIntersect) } combinators?
exclude <- '-' rangeexpr { p.addOperator(operatorSubtract) } combinators?
union <- ',' rangeexpr { p.addOperator(operatorUnion) } combinators?
# See https://github.com/pointlander/peg/issues/21 for context
braces <- '{' combinedexpr? '}' rangeexpr? { p.addBraces() }
brackets <- '(' combinedexpr? ')'
clusterq <- '*' rangeexpr { p.addClusterQuery() }
groupq <- '?' rangeexpr { p.addGroupQuery() }
cluster <- '%' literal { p.addValue(buffer[begin:end]); p.addClusterLookup() } key?
/ '%' rangeexpr { p.addClusterLookup() } key?
group <- '@' rangeexpr { p.addGroupLookup() }
# TODO: Use rangeexpr for the following?
key <- ':' rangeexpr { p.addKeyLookup() }
localkey <- '$' literal { p.addLocalClusterLookup(buffer[begin:end]) }
function <- literal { p.addFunction(buffer[begin:end]) } '(' funcargs ')'
funcargs <- combinedexpr? { p.addFuncArg() } ';' funcargs
/ combinedexpr? { p.addFuncArg() }
regex <- '/' < (!'/' .)* > '/' { p.addRegex(buffer[begin:end]) }
literal <- < leaderChar [[a-z0-9-_]]* >
value <- < leaderChar [[:a-z0-9-_.]]* > { p.addValue(buffer[begin:end]) }
leaderChar <- [[a-z0-9._]] # Do not match "-" so not to confuse with exclude rule
space <- ' '*
const <- q / quoted
q <- 'q(' <(!')' .)*> ')' { p.addConstant(buffer[begin:end]) }
quoted <- '"' <(!'"' .)*> '"' { p.addConstant(buffer[begin:end]) }