1
1
grammar Cypher;
2
2
3
- cypher : SP ? statement ( SP ? ' ;' )? SP ? ;
3
+ cypher : singleQuery ( ' ;' )? ;
4
4
5
- statement : singleQuery ;
6
-
7
- singleQuery : clause ( SP ? clause )* ;
5
+ singleQuery : clause ( clause )* ;
8
6
9
7
clause : match
10
8
| return1
11
9
;
12
10
13
- match : MATCH SP ? pattern ( SP ? where )? ;
14
-
15
- return1 : RETURN SP returnBody ;
16
-
17
- returnBody : returnItems ;
18
-
19
- returnItems : ( ( SP ? ' ,' SP ? returnItem )* )
20
- | ( returnItem ( SP ? ' ,' SP ? returnItem )* )
21
- ;
22
-
23
- returnItem : expression
24
- ;
11
+ match : MATCH pattern ( WHERE expression )? ;
25
12
26
- where : WHERE SP expression ;
13
+ return1 : RETURN ( expression ( ' , ' expression )* ) ;
27
14
28
- pattern : patternPart ( SP ? ' ,' SP ? patternPart )* ;
15
+ pattern : patternPart ( ' ,' patternPart )* ;
29
16
30
- patternPart : ( variable SP ? ' =' SP ? anonymousPatternPart )
31
- | anonymousPatternPart
17
+ patternPart : ( variable ' =' patternElement )
18
+ | patternElement
32
19
;
33
20
34
- anonymousPatternPart : patternElement ;
35
-
36
- patternElement : ( nodePattern ( SP ? patternElementChain )* )
21
+ patternElement : ( nodePattern ( patternElementChain )* )
37
22
| ( ' (' patternElement ' )' )
38
23
;
39
24
40
- nodePattern : ' ( ' SP ? ( variable SP ? )? ( nodeLabels SP ? )? ( properties SP ? )? ' ) ' ;
25
+ patternElementChain : relationshipPattern nodePattern ;
41
26
42
- patternElementChain : relationshipPattern SP ? nodePattern ;
27
+ nodePattern : ' ( ' ( variable )? ( nodeLabels )? ( properties )? ' ) ' ;
43
28
44
- relationshipPattern : ( leftArrowHead SP ? dash SP ? relationshipDetail? SP ? dash SP ? rightArrowHead )
45
- | ( leftArrowHead SP ? dash SP ? relationshipDetail? SP ? dash )
46
- | ( dash SP ? relationshipDetail? SP ? dash SP ? rightArrowHead )
47
- | ( dash SP ? relationshipDetail? SP ? dash )
29
+ relationshipPattern : ( leftArrowHead dash relationshipDetail? dash rightArrowHead )
30
+ | ( leftArrowHead dash relationshipDetail? dash )
31
+ | ( dash relationshipDetail? dash rightArrowHead )
32
+ | ( dash relationshipDetail? dash )
48
33
;
49
34
50
- relationshipDetail : ' [' SP ? ( variable SP ? )? ( relationshipTypes SP ? )? rangeLiteral? ( properties SP ? )? ' ]' ;
35
+ relationshipDetail : ' [' ( variable )? ( relationshipTypes )? rangeLiteral? ( properties )? ' ]' ;
51
36
52
37
properties : mapLiteral
53
- | parameter
54
38
;
55
39
56
- relationshipTypes : ' :' SP ? relTypeName ( SP ? ' |' ' :' ? SP ? relTypeName )* ;
40
+ relationshipTypes : ' :' relTypeName ( ' |' ' :' ? relTypeName )* ;
57
41
58
- nodeLabels : nodeLabel ( SP ? nodeLabel )* ;
42
+ nodeLabels : ( ' : ' labelName) ( ' : ' labelName )* ;
59
43
60
- nodeLabel : ' :' SP ? labelName ;
61
-
62
- rangeLiteral : ' *' SP ? ( integerLiteral SP ? )? ( ' ..' SP ? ( integerLiteral SP ? )? )? ;
44
+ rangeLiteral : ' *' ( integerLiteral )? ( ' ..' ( integerLiteral )? )? ;
63
45
64
46
labelName : symbolicName ;
65
47
66
48
relTypeName : symbolicName ;
67
49
68
- expression : expression10 ;
50
+ expression : exp_not ( AND exp_not )* ;
51
+
52
+
53
+ // exp_not : ( NOT )* exp_arithmatic ;
54
+ exp_not : ( NOT )? exp_arithmatic ;
55
+
69
56
70
- expression10 : exp_not ( SP AND SP exp_not )* ;
57
+ // exp_arithmatic : exp_binary ( partialComparisonExpression )* ;
58
+ exp_arithmatic : exp_binary ( partialComparisonExpression )? ;
71
59
72
- exp_not : ( NOT SP ? )* exp_arithmatic ;
60
+ exp_binary : exp_muldiv ( ( ' + ' exp_muldiv ) | ( ' - ' exp_muldiv ) )* ;
73
61
74
- exp_arithmatic : exp_binary ( SP ? partialComparisonExpression )* ;
62
+ exp_muldiv : exp_xor ( ( ' * ' exp_xor ) | ( ' / ' exp_xor ) | ( ' % ' exp_xor ) )* ;
75
63
76
- exp_binary : exp_addsub ( ( SP ? ' + ' SP ? exp_addsub ) | ( SP ? ' - ' SP ? exp_addsub ) )* ;
64
+ exp_xor : exp_unary ( ' ^ ' exp_unary )* ;
77
65
78
- exp_addsub : exp_muldivmod ( ( SP ? ' * ' SP ? exp_muldivmod ) | ( SP ? ' / ' SP ? exp_muldivmod ) | ( SP ? ' % ' SP ? exp_muldivmod ) )* ;
66
+ exp_unary : ( ( ' + ' | ' - ' ) )* exp_basic ;
79
67
80
- exp_muldivmod : exp_xor ( SP ? ' ^' SP ? exp_xor )* ;
81
68
82
- exp_xor : ( ( ' +' | ' -' ) SP ? )* exp_unary ;
69
+ // Remove nested array visit. Only support list visiting for constants.
70
+ // exp_basic : expression2 ( ( '[' expression ']' ) | ( '[' expression? '..' expression? ']' ) )*;
71
+ exp_basic : expression2 ( ( ' [' expression ' ]' ) | ( ' [' expression? ' ..' expression? ' ]' ) )?;
83
72
84
- exp_unary : expression2 ( ( SP ? ' [' expression ' ]' ) | ( SP ? ' [' expression? ' ..' expression? ' ]' ) );
85
73
86
- expression2 : atom ( SP ? ( propertyLookup | nodeLabels ) )* ;
74
+ expression2 : atom ( nodeLabels | propertyLookup )? ;
87
75
88
76
atom : literal
89
- | parameter
90
- | ( COUNT SP ? ' (' SP ? ' *' SP ? ' )' )
77
+ | ( COUNT ' (' ' *' ' )' )
91
78
| relationshipsPattern
92
79
| parenthesizedExpression
93
80
| variable
@@ -112,26 +99,24 @@ booleanLiteral : TRUE
112
99
| FALSE
113
100
;
114
101
115
- listLiteral : ' [' SP ? ( expression SP ? ( ' ,' SP ? expression SP ? )* )? ' ]' ;
102
+ listLiteral : ' [' ( expression ( ' ,' expression )* )? ' ]' ;
116
103
117
- mapLiteral : ' {' SP ? ( propertyKeyName SP ? ' :' SP ? expression SP ? ( ' ,' SP ? propertyKeyName SP ? ' :' SP ? expression SP ? )* )? ' }' ;
104
+ mapLiteral : ' {' ( propertyKeyName ' :' expression ( ' ,' propertyKeyName ' :' expression )* )? ' }' ;
118
105
119
- partialComparisonExpression : ( ' =' SP ? exp_binary )
120
- | ( ' <>' SP ? exp_binary )
121
- | ( ' !=' SP ? exp_binary )
122
- | ( ' <' SP ? exp_binary )
123
- | ( ' >' SP ? exp_binary )
124
- | ( ' <=' SP ? exp_binary )
125
- | ( ' >=' SP ? exp_binary )
106
+ partialComparisonExpression : ( ' =' exp_binary )
107
+ | ( ' <>' exp_binary )
108
+ | ( ' !=' exp_binary )
109
+ | ( ' <' exp_binary )
110
+ | ( ' >' exp_binary )
111
+ | ( ' <=' exp_binary )
112
+ | ( ' >=' exp_binary )
126
113
;
127
114
128
- parenthesizedExpression : ' (' SP ? expression SP ? ' )' ;
115
+ parenthesizedExpression : ' (' expression ' )' ;
129
116
130
- parameter : ' $ ' ( symbolicName | DecimalInteger ) ;
117
+ relationshipsPattern : nodePattern ( patternElementChain )+ ;
131
118
132
- relationshipsPattern : nodePattern ( SP ? patternElementChain )+ ;
133
-
134
- propertyLookup : ' .' SP ? ( propertyKeyName ) ;
119
+ propertyLookup : ' .' ( propertyKeyName ) ;
135
120
136
121
propertyKeyName : symbolicName ;
137
122
@@ -178,7 +163,6 @@ symbolicName : UnescapedSymbolicName
178
163
| MATCH
179
164
| RETURN
180
165
| WHERE
181
- | OR
182
166
| AND
183
167
| NOT
184
168
| TRUE
@@ -188,8 +172,6 @@ COUNT : ( 'C' | 'c' ) ( 'O' | 'o' ) ( 'U' | 'u' ) ( 'N' | 'n' ) ( 'T' | 't' ) ;
188
172
189
173
NULL : ( ' N' | ' n' ) ( ' U' | ' u' ) ( ' L' | ' l' ) ( ' L' | ' l' ) ;
190
174
191
- OR : ( ' O' | ' o' ) ( ' R' | ' r' ) ;
192
-
193
175
MATCH : ( ' M' | ' m' ) ( ' A' | ' a' ) ( ' T' | ' t' ) ( ' C' | ' c' ) ( ' H' | ' h' ) ;
194
176
195
177
RETURN : ( ' R' | ' r' ) ( ' E' | ' e' ) ( ' T' | ' t' ) ( ' U' | ' u' ) ( ' R' | ' r' ) ( ' N' | ' n' ) ;
@@ -235,7 +217,7 @@ IdentifierPart : ID_Continue
235
217
/* *
236
218
* Any character except "`", enclosed within `backticks`. Backticks are escaped with double backticks. */
237
219
238
- SP : ( WHITESPACE )+ ;
220
+ SP : ( WHITESPACE )+ -> skip ;
239
221
240
222
WHITESPACE : SPACE
241
223
| TAB
@@ -273,6 +255,8 @@ Comment : ( '/*' ( Comment_1 | ( '*' Comment_2 ) )* '*/' )
273
255
| ( ' //' ( Comment_3 )* CR ? ( LF | EOF ) )
274
256
;
275
257
258
+
259
+
276
260
leftArrowHead : ' <'
277
261
;
278
262
0 commit comments