@@ -9,6 +9,7 @@ class ExpressionParser implements Parser
9
9
{
10
10
const TOK_OR = 'or ' ;
11
11
const TOK_AND = 'and ' ;
12
+ const TOK_IN = 'in ' ;
12
13
const TOK_LT = '< ' ;
13
14
const TOK_LTE = '<= ' ;
14
15
const TOK_GT = '> ' ;
@@ -21,6 +22,7 @@ class ExpressionParser implements Parser
21
22
const TOK_RPAREN = ') ' ;
22
23
const TOK_ID = 'id ' ;
23
24
const TOK_DOT = '. ' ;
25
+ const TOK_COMMA = ', ' ;
24
26
const TOK_WS = 'whitespace ' ;
25
27
26
28
private $ lex ;
@@ -68,6 +70,7 @@ public function parseOpExpression($stream) {
68
70
$ left = $ this ->parseElement ($ stream );
69
71
$ op = null ;
70
72
$ right = null ;
73
+ $ value_list = null ;
71
74
72
75
if ($ stream ->isEmpty ()) {
73
76
return new AQL \AST \OpExpression ($ left );
@@ -106,21 +109,47 @@ public function parseOpExpression($stream) {
106
109
$ stream ->getToken ();
107
110
$ right = $ this ->parseOpExpression ($ stream );
108
111
break ;
112
+ case self ::TOK_IN :
113
+ $ op = AQL \AST \Operators::OP_IN ;
114
+ $ stream ->getToken ();
115
+ $ this ->expect ($ stream , self ::TOK_LPAREN );
116
+ $ value_list = $ this ->parseValueList ($ stream );
117
+ $ this ->expect ($ stream , self ::TOK_RPAREN );
109
118
}
110
119
111
- return new AQL \AST \OpExpression ($ left , $ op , $ right );
120
+ return new AQL \AST \OpExpression ($ left , $ op , $ right, $ value_list );
112
121
}
113
122
114
- public function parseElement ($ stream ) {
115
- $ tok = $ stream ->peek ();
123
+ public function parseValueList ($ stream ) {
124
+ $ value = $ this ->parseValue ($ stream );
125
+ $ right = null ;
116
126
117
- if ($ tok -> token == self ::TOK_STRING ) {
127
+ if ($ stream -> peek ()-> token == self ::TOK_COMMA ) {
118
128
$ stream ->getToken ();
119
- return AQL \AST \Element::string ($ tok );
129
+ $ right = $ this ->parseValueList ($ stream );
130
+ }
131
+
132
+ return new AQL \AST \ValueList ($ value , $ right );
133
+ }
134
+
135
+ public function parseValue ($ stream ) {
136
+ $ tok = $ stream ->getToken ();
137
+
138
+ if ($ tok ->token == self ::TOK_STRING ) {
139
+ return AQL \AST \Value::string ($ tok );
120
140
}
121
141
if ($ tok ->token == self ::TOK_NUMBER ) {
122
- $ stream ->getToken ();
123
- return AQL \AST \Element::number ($ tok );
142
+ return AQL \AST \Value::number ($ tok );
143
+ }
144
+
145
+ throw new ParseException ('Expected value ' );
146
+ }
147
+
148
+ public function parseElement ($ stream ) {
149
+ $ tok = $ stream ->peek ();
150
+
151
+ if ($ tok ->token == self ::TOK_STRING || $ tok ->token == self ::TOK_NUMBER ) {
152
+ return AQL \AST \Element::value ($ this ->parseValue ($ stream ));
124
153
}
125
154
if ($ tok ->token == self ::TOK_LPAREN ) {
126
155
$ stream ->getToken ();
@@ -157,6 +186,7 @@ public static function createLexer() {
157
186
$ lex = Lex \lexer ([
158
187
'/or(?![a-z])/iA ' => self ::TOK_OR ,
159
188
'/and(?![a-z])/iA ' => self ::TOK_AND ,
189
+ '/in(?![a-z])/iA ' => self ::TOK_IN ,
160
190
'/<=/A ' => self ::TOK_LTE ,
161
191
'/>=/A ' => self ::TOK_GTE ,
162
192
'/</A ' => self ::TOK_LT ,
@@ -168,6 +198,7 @@ public static function createLexer() {
168
198
'/"[^"]*"/A ' => self ::TOK_STRING ,
169
199
'/(\d*\.\d+|\d+)/A ' => self ::TOK_NUMBER ,
170
200
'/[_a-zA-Z][_a-zA-Z0-9]*/A ' => self ::TOK_ID ,
201
+ '/,/A ' => self ::TOK_COMMA ,
171
202
'/\./A ' => self ::TOK_DOT ,
172
203
'/\s+/A ' => self ::TOK_WS
173
204
]);
0 commit comments