-
Notifications
You must be signed in to change notification settings - Fork 15
/
Copy pathiQuery.g
109 lines (98 loc) · 1.87 KB
/
iQuery.g
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
grammar iQuery;
query
: selectors NEWLINE* EOF
| NEWLINE* EOF
;
selectors
: multi_selectors multi_selectors*
;
multi_selectors
: selector
| '>' selector
| DESCENDANT INTEGER selector
| DESCENDANT selector
;
selector
: selector_expression
(
('+' selector_expression)
|
('~' selector_expression)
)?
| multi_attributes
;
num_comp_op
: '>'
| '<'
| '>='
| '<='
| '='
;
multi_attributes
: '[' ELEMENT op QUOTED_STRING ']'
| '[' ':' ELEMENT op QUOTED_STRING ']'
| '[' ELEMENT num_comp_op (INTEGER | FLOAT | PERCENTAGE) ']'
| '[' ':' ELEMENT num_comp_op (INTEGER | FLOAT | PERCENTAGE) ']'
| '[' ELEMENT ']'
;
op
: '='
| '!='
| '$='
| '^='
| '*='
;
indexop
: EQ
| GT
| LT
| NTH_CHILD
;
selector_expression
: atom
| ':' indexop '(' INTEGER ')'
| ':' NOT '(' selectors ')'
| ':' HAS '(' selectors ')'
| ':' CONTAINS '(' QUOTED_STRING ')'
| ':' LAST_CHILD
| ':' FIRST_CHILD
| ':' FIRST
| ':' LAST
| ':' EMPTY
| ':' PARENT
| ':' ELEMENT
{
$survival = filterPseudo($candidates, $ELEMENT.text);
}
| '#' ELEMENT
;
atom
: ASTERISK
| ELEMENT
;
DESCENDANT: '>>';
EQ: 'eq';
GT: 'gt';
LT: 'lt';
NOT: 'not';
CONTAINS: 'contains';
EMPTY: 'empty';
HAS: 'has';
PREV: 'prev';
NEXT: 'next';
SIBLINGS: 'siblings';
NTH_CHILD: 'nth-child';
PARENT: 'parent';
LAST_CHILD: 'last-child';
FIRST_CHILD: 'first-child';
FIRST: 'first';
LAST: 'last';
INTEGER: DIGIT+;
PERCENTAGE: ('+' | '-')? DIGIT+ ('.' DIGIT+)? '%';
FLOAT: ('+' | '-')? DIGIT+ ('.' DIGIT+)?;
fragment DIGIT: ('0' .. '9');
ELEMENT: ('a'..'z'|'A'..'Z'|'_')('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'.')*;
ASTERISK: '*';
QUOTED_STRING: '\'' .+ '\'';
NEWLINE: '\r'? '\n';
WS: (' ' | '\t') { skip(); };