-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathql.ohm
79 lines (79 loc) · 2.81 KB
/
ql.ohm
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
ql {
Expression = ExpressionComma
ExpressionComma =
identifier "=" ExpressionQuery "," ExpressionComma -- comma
| ExpressionQuery
ExpressionQuery =
ExpressionQuery "where" ExpressionConditional -- filter
| ExpressionQuery "which" ExpressionConditional -- which
| ExpressionQuery "map" ExpressionConditional -- map
| ExpressionQuery "limit" ExpressionConditional -- limit
| ExpressionQuery "order" ExpressionConditional ("asc"|"desc")? -- order
| ExpressionQuery "group" ExpressionConditional -- group
| "distinct" ExpressionConditional -- distinct
| ExpressionConditional
ExpressionConditional = ExpressionConditional "?" ExpressionConditional ":" ExpressionConditional -- conditional
| ExpressionOr
ExpressionOr =
ExpressionOr "|" ExpressionAnd -- or
| ExpressionAnd
ExpressionAnd =
ExpressionAnd "&" ExpressionNot -- and
| ExpressionNot
ExpressionNot =
"!" ExpressionNot -- not
| ExpressionRelation
ExpressionRelation =
ExpressionRelation ("<="|"="|">="|"<"|"!="|">"|"in") ExpressionAdd -- relation
| ExpressionAdd
ExpressionAdd =
ExpressionAdd ("+"|"-") ExpressionMultiply -- add
| ExpressionMultiply
ExpressionMultiply =
ExpressionMultiply ("*"|"/") ExpressionAddUnary -- multiply
| ExpressionAddUnary
ExpressionAddUnary =
("+"|"-") ExpressionAddUnary -- add
| ExpressionCount
ExpressionCount =
ExpressionCount "#" -- count
| ExpressionCall
ExpressionCall =
ExpressionMember ExpressionCall -- call
| ExpressionMember
ExpressionMember =
ExpressionMember "." identifier -- property
| ExpressionMember "@" ExpressionId -- element
| ExpressionId
ExpressionId =
identifier "#" ExpressionAtom -- id
| ExpressionAtom
ExpressionObject = "{" ListOf<ExpressionObjectProperty, ","> "}"
ExpressionObjectProperty = identifier ":" Expression
ExpressionArray = "[" ListOf<Expression, ","> "]"
ExpressionTuple = "{" ListOf<Expression, ","> "}"
ExpressionAtom =
"(" Expression ")" -- parentheses
| "%" identifier "%" -- placeholder
| ExpressionObject
| ExpressionArray
| ExpressionTuple
| ExpressionThis
| ExpressionName
| number
| string
ExpressionThis = "this" identifier
ExpressionName = "::"? identifier
identifier = ~(("where"|"which"|"map"|"limit"|"order"|"asc"|"desc"|"group"|"distinct"|"in") ~(alnum|"_")) &(letter|"_") (alnum|"_")+
number = digit+ ("." digit+)?
string = "\"" char* "\""
char = ~("\""|"\\") any -- literal
| "\\" ("\"" | "\\" | "b" | "f" | "n" | "r" | "t" | "v") -- escaped
Declarations = Declaration*
Declaration = identifier "{" DeclarationStatement* "}"
DeclarationStatement = DeclarationProperty | DeclarationId
DeclarationProperty = DeclarationPropertyType | DeclarationPropertyValue
DeclarationPropertyType = identifier ":" identifier ";"
DeclarationPropertyValue = identifier "=" Expression ";"
DeclarationId = "id" identifier ";"
}