-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgrammar.js
141 lines (116 loc) · 4.77 KB
/
grammar.js
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
module.exports = grammar({
name: 'sqlrest',
extras: $ => [
/\s/,
],
rules: {
query: $ => seq($.table,
optional($.expression)),
expression: $ => seq('?',
seq($.part,
repeat(seq('&',
$.part)))),
part: $ => choice($.select,
$.order,
$.filter,
$.limit,
$.offset),
select: $ => seq('select=',
$.optionally_aliased_column,
repeat(seq(',',
$.optionally_aliased_column))),
optionally_aliased_column: $ => seq(optional(seq($.alias,
':')),
$.column,
optional(seq('::',
$.cast))),
order: $ => seq('order=',
$.order_col,
repeat(seq(',',
$.order_col))),
order_col: $ => seq($.column,
optional(seq('.',
$.ordering))),
order: $ => seq('order=',
$.column,
optional(seq('.',
$.ordering)),
repeat(seq(',',
$.column,
optional(seq('.',
$.ordering))))),
ordering: $ => choice('desc',
'asc'),
filter: $ => choice($.simple_filter,
$.special_filter),
special_filter: $ => choice($.in,
$.not_in),
in: $ => seq($.column,
'=in.',
$.list),
not_in: $ => seq($.column,
'=not_in.',
$.list),
list: $ => seq('(',
$.normal_value,
repeat(seq(',',
$.normal_value,
')'))),
simple_filter: $ => seq($.column,
'=',
choice(seq($.normal_operator,
'.',
$.normal_value),
seq($.like_operator,
'.',
$.like_value))),
normal_operator: $ => choice($.eq,
$.not_eq,
$.lt,
$.gt,
$.lte,
$.gte,
$.is,
$.not_is),
like_operator: $ => choice($.like,
$.not_like,
$.ilike,
$.not_ilike),
eq: $ => 'eq',
not_eq: $ => 'not_eq',
lt: $ => 'lt',
gt: $ => 'gt',
lte: $ => 'lte',
gte: $ => 'gte',
like: $ => 'like',
not_like: $ => 'not_like',
ilike: $ => 'ilike',
not_ilike: $ => 'not_ilike',
is: $ => 'is',
not_is: $ => 'not_is',
limit: $ => seq('limit=',
$.NUMBER),
offset: $ => seq('offset=',
$.NUMBER),
table: $ => $.STRING,
column: $ => $.STRING,
alias: $ => $.STRING,
cast: $ => $.STRING,
normal_value: $ => choice($.STRING,
$.DOUBLE_QUOTED_NORMAL_VALUE),
like_value: $ => choice($.STRING_WITH_WILDCARDS,
$.DOUBLE_QUOTED_LIKE_VALUE),
STRING: $ => token.immediate(/[\p{L}0-9_ ]+/),
STRING_WITH_WILDCARDS: $ => token.immediate(/[\p{L}0-9_* ]+/),
DOUBLE_QUOTED_STRING: $ => seq("\"",
$.STRING,
"\""),
DOUBLE_QUOTED_NORMAL_VALUE: $ => seq("\"",
token.immediate(/[\p{L}0-9_ :,\.\(\)]+/),
"\""),
DOUBLE_QUOTED_LIKE_VALUE: $ => seq("\"",
token.immediate(/[\p{L}0-9_* :,\.\(\)]+/),
"\""),
NUMBER: $ => token.immediate(/[0-9]+/),
}
});