@@ -216,21 +216,18 @@ makeItemList(List *list) {
216216%token <str> STRING_P NUMERIC_P
217217
218218%type <value> result scalar_value
219- %type <str> key
220219
221220%type <elems> path value_list
222221
223- %type <value> path_elem path_elem_any right_expr expr array
222+ %type <value> key key_any right_expr expr array
224223
225224%token <hint> HINT_P
226225
227- %type <hint> opt_hint
228-
229226%left OR_P
230227%left AND_P
231228%right NOT_P
232229%nonassoc IN_P IS_P
233- %nonassoc XXX
230+ %nonassoc ' ( ' ' ) '
234231
235232/* Grammar follows*/
236233%%
@@ -262,11 +259,6 @@ scalar_value:
262259| NUMERIC_P {$$ = makeItemNumeric(&$1 ); }
263260;
264261
265- opt_hint :
266- HINT_P {$$ =$1 ; }
267- | /* EMPTY*/ %prec XXX {$$ = jsqIndexDefault; }
268- ;
269-
270262value_list :
271263scalar_value {$$ = lappend(NIL,$1 ); }
272264| value_list ' ,' scalar_value {$$ = lappend($1 ,$3 ); }
@@ -292,11 +284,17 @@ right_expr:
292284;
293285
294286expr :
295- path opt_hint right_expr {$3 ->hint =$2 ;$$ = makeItemList(lappend($1 ,$3 )); }
287+ path right_expr {$$ = makeItemList(lappend($1 ,$2 )); }
288+ | path HINT_P right_expr {$3 ->hint =$2 ;$$ = makeItemList(lappend($1 ,$3 )); }
289+ | NOT_P expr {$$ = makeItemUnary(jqiNot,$2 ); }
290+ /*
291+ * In next two lines NOT_P is a patch actually, not a an
292+ * logical expression.
293+ */
294+ | NOT_P HINT_P right_expr {$3 ->hint =$2 ;$$ = makeItemList(lappend(lappend(NIL, makeItemKey(&$1 )),$3 )); }
295+ | NOT_P right_expr {$$ = makeItemList(lappend(lappend(NIL, makeItemKey(&$1 )),$2 )); }
296296| path ' (' expr ' )' {$$ = makeItemList(lappend($1 ,$3 )); }
297297| ' (' expr ' )' {$$ =$2 ; }
298- | NOT_P expr {$$ = makeItemUnary(jqiNot,$2 ); }
299- | NOT_P opt_hint right_expr {$3 ->hint =$2 ;$$ = makeItemList(lappend(lappend(NIL, makeItemKey(&$1 )),$3 )); }
300298| expr AND_P expr {$$ = makeItemBinary(jqiAnd,$1 ,$3 ); }
301299| expr OR_P expr {$$ = makeItemBinary(jqiOr,$1 ,$3 ); }
302300;
@@ -305,39 +303,38 @@ expr:
305303 * key is always a string, not a bool or numeric
306304*/
307305key :
308- STRING_P {$$ =$1 ; }
309- | IN_P {$$ =$1 ; }
310- | IS_P {$$ =$1 ; }
311- | OR_P {$$ =$1 ; }
312- | AND_P {$$ =$1 ; }
313- | NULL_P {$$ =$1 ; }
314- | TRUE_P {$$ =$1 ; }
315- | ARRAY_T {$$ =$1 ; }
316- | FALSE_P {$$ =$1 ; }
317- | NUMERIC_T {$$ =$1 ; }
318- | OBJECT_T {$$ =$1 ; }
319- | STRING_T {$$ =$1 ; }
320- | BOOLEAN_T {$$ =$1 ; }
321- | NUMERIC_P {$$ =$1 ; }
322- ;
323-
324- path_elem :
325306' *' {$$ = makeItemType(jqiAny); }
326307| ' #' {$$ = makeItemType(jqiAnyArray); }
327308| ' %' {$$ = makeItemType(jqiAnyKey); }
328309| ' $' {$$ = makeItemType(jqiCurrent); }
329- | key {$$ = makeItemKey(&$1 ); }
310+ | STRING_P {$$ = makeItemKey(&$1 ); }
311+ | IN_P {$$ = makeItemKey(&$1 ); }
312+ | IS_P {$$ = makeItemKey(&$1 ); }
313+ | OR_P {$$ = makeItemKey(&$1 ); }
314+ | AND_P {$$ = makeItemKey(&$1 ); }
315+ | NULL_P {$$ = makeItemKey(&$1 ); }
316+ | TRUE_P {$$ = makeItemKey(&$1 ); }
317+ | ARRAY_T {$$ = makeItemKey(&$1 ); }
318+ | FALSE_P {$$ = makeItemKey(&$1 ); }
319+ | NUMERIC_T {$$ = makeItemKey(&$1 ); }
320+ | OBJECT_T {$$ = makeItemKey(&$1 ); }
321+ | STRING_T {$$ = makeItemKey(&$1 ); }
322+ | BOOLEAN_T {$$ = makeItemKey(&$1 ); }
323+ | NUMERIC_P {$$ = makeItemKey(&$1 ); }
330324;
331325
332- path_elem_any :
333- path_elem {$$ =$$ ; }
326+ /*
327+ * NOT keyword needs separate processing
328+ */
329+ key_any :
330+ key {$$ =$$ ; }
334331| NOT_P {$$ = makeItemKey(&$1 ); }
335332;
336333
337334path :
338- path_elem {$$ = lappend(NIL,$1 ); }
339- | path ' .' path_elem_any {$$ = lappend($1 ,$3 ); }
340- | NOT_P ' .' path_elem_any {$$ = lappend(lappend(NIL, makeItemKey(&$1 )),$3 ); }
335+ key {$$ = lappend(NIL,$1 ); }
336+ | path ' .' key_any {$$ = lappend($1 ,$3 ); }
337+ | NOT_P ' .' key_any {$$ = lappend(lappend(NIL, makeItemKey(&$1 )),$3 ); }
341338;
342339
343340%%