line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package CQL::Token; |
2
|
|
|
|
|
|
|
|
3
|
9
|
|
|
9
|
|
71930
|
use strict; |
|
9
|
|
|
|
|
20
|
|
|
9
|
|
|
|
|
440
|
|
4
|
9
|
|
|
9
|
|
46
|
use warnings; |
|
9
|
|
|
|
|
17
|
|
|
9
|
|
|
|
|
251
|
|
5
|
9
|
|
|
9
|
|
47
|
use base qw( Exporter ); |
|
9
|
|
|
|
|
37
|
|
|
9
|
|
|
|
|
1072
|
|
6
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
=head1 NAME |
8
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
CQL::Token - class for token objects returned by CQL::Lexer |
10
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
=head1 SYNOPSIS |
12
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
my $token = $lexer->nextToken(); |
14
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
if ( $token->type() == CQL_WORD ) { |
16
|
|
|
|
|
|
|
print "the token is a word with value=", $token->string(), "\n"; |
17
|
|
|
|
|
|
|
} |
18
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
=head1 DESCRIPTION |
20
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
Ordinarily you won't really care about the tokens returned by the |
22
|
|
|
|
|
|
|
CQL::Lexer since the lexer is used behind the scenes by CQL::Parser. |
23
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
=head1 METHODS |
25
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
=head2 new() |
27
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
my $token = CQL::Token->new( '=' ); |
29
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
=cut |
31
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
## CQL keyword types |
33
|
9
|
|
|
9
|
|
48
|
use constant CQL_LT => 100; ## The "<" relation |
|
9
|
|
|
|
|
25
|
|
|
9
|
|
|
|
|
12274
|
|
34
|
9
|
|
|
9
|
|
63
|
use constant CQL_GT => 101; ## The ">" relation |
|
9
|
|
|
|
|
22
|
|
|
9
|
|
|
|
|
1288
|
|
35
|
9
|
|
|
9
|
|
666
|
use constant CQL_EQ => 102; ## The "=" relation |
|
9
|
|
|
|
|
15
|
|
|
9
|
|
|
|
|
1869
|
|
36
|
9
|
|
|
9
|
|
51
|
use constant CQL_LE => 103; ## The "<=" relation |
|
9
|
|
|
|
|
19
|
|
|
9
|
|
|
|
|
431
|
|
37
|
9
|
|
|
9
|
|
42
|
use constant CQL_GE => 104; ## The ">=" relation |
|
9
|
|
|
|
|
16
|
|
|
9
|
|
|
|
|
987
|
|
38
|
9
|
|
|
9
|
|
41
|
use constant CQL_NE => 105; ## The "<>" relation |
|
9
|
|
|
|
|
14
|
|
|
9
|
|
|
|
|
356
|
|
39
|
9
|
|
|
9
|
|
67
|
use constant CQL_AND => 106; ## The "and" boolean |
|
9
|
|
|
|
|
12
|
|
|
9
|
|
|
|
|
355
|
|
40
|
9
|
|
|
9
|
|
288
|
use constant CQL_OR => 107; ## The "or" boolean |
|
9
|
|
|
|
|
27
|
|
|
9
|
|
|
|
|
371
|
|
41
|
9
|
|
|
9
|
|
45
|
use constant CQL_NOT => 108; ## The "not" boolean |
|
9
|
|
|
|
|
16
|
|
|
9
|
|
|
|
|
390
|
|
42
|
9
|
|
|
9
|
|
44
|
use constant CQL_PROX => 109; ## The "prox" boolean |
|
9
|
|
|
|
|
25
|
|
|
9
|
|
|
|
|
3440
|
|
43
|
9
|
|
|
9
|
|
56
|
use constant CQL_ANY => 110; ## The "any" relation |
|
9
|
|
|
|
|
13
|
|
|
9
|
|
|
|
|
480
|
|
44
|
9
|
|
|
9
|
|
40
|
use constant CQL_ALL => 111; ## The "all" relation |
|
9
|
|
|
|
|
16
|
|
|
9
|
|
|
|
|
571
|
|
45
|
9
|
|
|
9
|
|
43
|
use constant CQL_EXACT => 112; ## The "exact" relation |
|
9
|
|
|
|
|
13
|
|
|
9
|
|
|
|
|
420
|
|
46
|
9
|
|
|
9
|
|
42
|
use constant CQL_WITHIN => 113; ## The "within" relation |
|
9
|
|
|
|
|
16
|
|
|
9
|
|
|
|
|
387
|
|
47
|
9
|
|
|
9
|
|
42
|
use constant CQL_ENCLOSES => 114; ## The "encloses" relation |
|
9
|
|
|
|
|
14
|
|
|
9
|
|
|
|
|
379
|
|
48
|
9
|
|
|
9
|
|
57
|
use constant CQL_PARTIAL => 115; ## The "partial" relation |
|
9
|
|
|
|
|
16
|
|
|
9
|
|
|
|
|
426
|
|
49
|
9
|
|
|
9
|
|
808
|
use constant CQL_PWORD => 116; ## The "word" proximity unit and the "word" relation modifier |
|
9
|
|
|
|
|
18
|
|
|
9
|
|
|
|
|
397
|
|
50
|
9
|
|
|
9
|
|
51
|
use constant CQL_SENTENCE => 117; ## The "sentence" proximity unit |
|
9
|
|
|
|
|
13
|
|
|
9
|
|
|
|
|
398
|
|
51
|
9
|
|
|
9
|
|
41
|
use constant CQL_PARAGRAPH => 118; ## The "paragraph" proximity unit |
|
9
|
|
|
|
|
18
|
|
|
9
|
|
|
|
|
425
|
|
52
|
9
|
|
|
9
|
|
46
|
use constant CQL_ELEMENT => 119; ## The "element" proximity unit |
|
9
|
|
|
|
|
18
|
|
|
9
|
|
|
|
|
442
|
|
53
|
9
|
|
|
9
|
|
42
|
use constant CQL_ORDERED => 120; ## The "ordered" proximity ordering |
|
9
|
|
|
|
|
19
|
|
|
9
|
|
|
|
|
548
|
|
54
|
9
|
|
|
9
|
|
43
|
use constant CQL_UNORDERED => 121; ## The "unordered" proximity ordering |
|
9
|
|
|
|
|
19
|
|
|
9
|
|
|
|
|
440
|
|
55
|
9
|
|
|
9
|
|
42
|
use constant CQL_RELEVANT => 122; ## The "relevant" relation modifier |
|
9
|
|
|
|
|
19
|
|
|
9
|
|
|
|
|
380
|
|
56
|
9
|
|
|
9
|
|
42
|
use constant CQL_FUZZY => 123; ## The "fuzzy" relation modifier |
|
9
|
|
|
|
|
19
|
|
|
9
|
|
|
|
|
348
|
|
57
|
9
|
|
|
9
|
|
40
|
use constant CQL_STEM => 124; ## The "stem" relation modifier |
|
9
|
|
|
|
|
14
|
|
|
9
|
|
|
|
|
388
|
|
58
|
9
|
|
|
9
|
|
41
|
use constant CQL_SCR => 125; ## The server choice relation |
|
9
|
|
|
|
|
13
|
|
|
9
|
|
|
|
|
447
|
|
59
|
9
|
|
|
9
|
|
41
|
use constant CQL_PHONETIC => 126; ## The "phonetic" relation modifier |
|
9
|
|
|
|
|
15
|
|
|
9
|
|
|
|
|
354
|
|
60
|
9
|
|
|
9
|
|
199
|
use constant CQL_WORD => 127; ## A general word (not an operator) |
|
9
|
|
|
|
|
47
|
|
|
9
|
|
|
|
|
708
|
|
61
|
9
|
|
|
9
|
|
47
|
use constant CQL_LPAREN => 128; ## A left paren |
|
9
|
|
|
|
|
15
|
|
|
9
|
|
|
|
|
382
|
|
62
|
9
|
|
|
9
|
|
38
|
use constant CQL_RPAREN => 129; ## A right paren |
|
9
|
|
|
|
|
17
|
|
|
9
|
|
|
|
|
355
|
|
63
|
9
|
|
|
9
|
|
43
|
use constant CQL_EOF => 130; ## End of query |
|
9
|
|
|
|
|
16
|
|
|
9
|
|
|
|
|
509
|
|
64
|
9
|
|
|
9
|
|
38
|
use constant CQL_MODIFIER => 131; ## Start of modifier '/' |
|
9
|
|
|
|
|
13
|
|
|
9
|
|
|
|
|
442
|
|
65
|
9
|
|
|
9
|
|
47
|
use constant CQL_STRING => 132; ## The "string" relation modifier |
|
9
|
|
|
|
|
16
|
|
|
9
|
|
|
|
|
376
|
|
66
|
9
|
|
|
9
|
|
43
|
use constant CQL_ISODATE => 133; ## The "isoDate" relation modifier |
|
9
|
|
|
|
|
15
|
|
|
9
|
|
|
|
|
363
|
|
67
|
9
|
|
|
9
|
|
41
|
use constant CQL_NUMBER => 134; ## The "number" relation modifier |
|
9
|
|
|
|
|
19
|
|
|
9
|
|
|
|
|
335
|
|
68
|
9
|
|
|
9
|
|
47
|
use constant CQL_URI => 135; ## The "uri" relation modifier |
|
9
|
|
|
|
|
12
|
|
|
9
|
|
|
|
|
366
|
|
69
|
9
|
|
|
9
|
|
40
|
use constant CQL_MASKED => 137; ## The "masked" relation modifier |
|
9
|
|
|
|
|
14
|
|
|
9
|
|
|
|
|
375
|
|
70
|
9
|
|
|
9
|
|
40
|
use constant CQL_UNMASKED => 138; ## The "unmasked" relation modifier |
|
9
|
|
|
|
|
13
|
|
|
9
|
|
|
|
|
550
|
|
71
|
9
|
|
|
9
|
|
48
|
use constant CQL_NWSE => 139; ## The "nwse" relation modifier |
|
9
|
|
|
|
|
12
|
|
|
9
|
|
|
|
|
339
|
|
72
|
9
|
|
|
9
|
|
41
|
use constant CQL_DISTANCE => 140; ## The "distance" proximity modifier |
|
9
|
|
|
|
|
14
|
|
|
9
|
|
|
|
|
372
|
|
73
|
9
|
|
|
9
|
|
47
|
use constant CQL_UNIT => 141; ## The "unit" proximity modifier |
|
9
|
|
|
|
|
13
|
|
|
9
|
|
|
|
|
6627
|
|
74
|
|
|
|
|
|
|
|
75
|
|
|
|
|
|
|
## lookup table for easily determining token type |
76
|
|
|
|
|
|
|
our %lookupTable = ( |
77
|
|
|
|
|
|
|
'<' => CQL_LT, |
78
|
|
|
|
|
|
|
'>' => CQL_GT, |
79
|
|
|
|
|
|
|
'=' => CQL_EQ, |
80
|
|
|
|
|
|
|
'<=' => CQL_LE, |
81
|
|
|
|
|
|
|
'>=' => CQL_GE, |
82
|
|
|
|
|
|
|
'<>' => CQL_NE, |
83
|
|
|
|
|
|
|
'and' => CQL_AND, |
84
|
|
|
|
|
|
|
'or' => CQL_OR, |
85
|
|
|
|
|
|
|
'not' => CQL_NOT, |
86
|
|
|
|
|
|
|
'prox' => CQL_PROX, |
87
|
|
|
|
|
|
|
'any' => CQL_ANY, |
88
|
|
|
|
|
|
|
'within' => CQL_WITHIN, |
89
|
|
|
|
|
|
|
'encloses' => CQL_ENCLOSES, |
90
|
|
|
|
|
|
|
'partial' => CQL_PARTIAL, |
91
|
|
|
|
|
|
|
'all' => CQL_ALL, |
92
|
|
|
|
|
|
|
'exact' => CQL_EXACT, |
93
|
|
|
|
|
|
|
'word' => CQL_PWORD, |
94
|
|
|
|
|
|
|
'sentence' => CQL_SENTENCE, |
95
|
|
|
|
|
|
|
'paragraph' => CQL_PARAGRAPH, |
96
|
|
|
|
|
|
|
'element' => CQL_ELEMENT, |
97
|
|
|
|
|
|
|
'ordered' => CQL_ORDERED, |
98
|
|
|
|
|
|
|
'unordered' => CQL_UNORDERED, |
99
|
|
|
|
|
|
|
'relevant' => CQL_RELEVANT, |
100
|
|
|
|
|
|
|
'fuzzy' => CQL_FUZZY, |
101
|
|
|
|
|
|
|
'stem' => CQL_STEM, |
102
|
|
|
|
|
|
|
'phonetic' => CQL_PHONETIC, |
103
|
|
|
|
|
|
|
'(' => CQL_LPAREN, |
104
|
|
|
|
|
|
|
')' => CQL_RPAREN, |
105
|
|
|
|
|
|
|
'/' => CQL_MODIFIER, |
106
|
|
|
|
|
|
|
'' => CQL_EOF, |
107
|
|
|
|
|
|
|
'string' => CQL_STRING, |
108
|
|
|
|
|
|
|
'isodate' => CQL_ISODATE, |
109
|
|
|
|
|
|
|
'number' => CQL_NUMBER, |
110
|
|
|
|
|
|
|
'uri' => CQL_URI, |
111
|
|
|
|
|
|
|
'masked' => CQL_MASKED, |
112
|
|
|
|
|
|
|
'unmasked' => CQL_UNMASKED, |
113
|
|
|
|
|
|
|
'nwse' => CQL_NWSE, |
114
|
|
|
|
|
|
|
'distance' => CQL_DISTANCE, |
115
|
|
|
|
|
|
|
'unit' => CQL_UNIT, |
116
|
|
|
|
|
|
|
); |
117
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
## constants available for folks to use when looking at |
119
|
|
|
|
|
|
|
## token types |
120
|
|
|
|
|
|
|
|
121
|
|
|
|
|
|
|
our @EXPORT = qw( |
122
|
|
|
|
|
|
|
CQL_LT CQL_GT CQL_EQ CQL_LE CQL_GE CQL_NE CQL_AND CQL_OR CQL_NOT |
123
|
|
|
|
|
|
|
CQL_PROX CQL_ANY CQL_ALL CQL_EXACT CQL_PWORD CQL_SENTENCE CQL_PARAGRAPH |
124
|
|
|
|
|
|
|
CQL_ELEMENT CQL_ORDERED CQL_UNORDERED CQL_RELEVANT CQL_FUZZY |
125
|
|
|
|
|
|
|
CQL_STEM CQL_SCR CQL_PHONETIC CQL_RPAREN CQL_LPAREN |
126
|
|
|
|
|
|
|
CQL_WORD CQL_PHRASE CQL_EOF CQL_MODIFIER CQL_STRING CQL_ISODATE |
127
|
|
|
|
|
|
|
CQL_NUMBER CQL_URI CQL_MASKED CQL_UNMASKED CQL_WITHIN CQL_PARTIAL |
128
|
|
|
|
|
|
|
CQL_ENCLOSES CQL_NWSE |
129
|
|
|
|
|
|
|
CQL_DISTANCE CQL_UNIT |
130
|
|
|
|
|
|
|
); |
131
|
|
|
|
|
|
|
|
132
|
|
|
|
|
|
|
=head2 new() |
133
|
|
|
|
|
|
|
|
134
|
|
|
|
|
|
|
=cut |
135
|
|
|
|
|
|
|
|
136
|
|
|
|
|
|
|
sub new { |
137
|
415
|
|
|
415
|
1
|
638
|
my ($class,$string) = @_; |
138
|
415
|
|
|
|
|
446
|
my $type; |
139
|
|
|
|
|
|
|
|
140
|
|
|
|
|
|
|
# see if it's a reserved word, which are case insensitive |
141
|
415
|
|
|
|
|
686
|
my $normalString = lc($string); |
142
|
415
|
100
|
|
|
|
3573
|
if ( exists($lookupTable{$normalString}) ) { |
143
|
244
|
|
|
|
|
507
|
$type = $lookupTable{$normalString}; |
144
|
|
|
|
|
|
|
} |
145
|
|
|
|
|
|
|
else { |
146
|
171
|
|
|
|
|
297
|
$type = CQL_WORD; |
147
|
|
|
|
|
|
|
# remove outer quotes if present |
148
|
171
|
100
|
|
|
|
896
|
if ($string =~ m/^"(.*)"$/g) { |
149
|
25
|
|
|
|
|
70
|
$string = $1; |
150
|
|
|
|
|
|
|
# replace escaped double quote with double quote. |
151
|
|
|
|
|
|
|
# Is save this way cause the string is assumed to be syntactically correct |
152
|
25
|
|
|
|
|
120
|
$string =~ s/\\"/"/g; |
153
|
|
|
|
|
|
|
} |
154
|
|
|
|
|
|
|
} |
155
|
415
|
|
33
|
|
|
4521
|
return bless { string=>$string, type=>$type }, ref($class) || $class; |
156
|
|
|
|
|
|
|
} |
157
|
|
|
|
|
|
|
|
158
|
|
|
|
|
|
|
=head2 getType() |
159
|
|
|
|
|
|
|
|
160
|
|
|
|
|
|
|
Returns the token type which will be available as one of the constants |
161
|
|
|
|
|
|
|
that CQL::Token exports. See internals for a list of available constants. |
162
|
|
|
|
|
|
|
|
163
|
|
|
|
|
|
|
=cut |
164
|
|
|
|
|
|
|
|
165
|
1921
|
|
|
1921
|
1
|
6561
|
sub getType { return shift->{type}; } |
166
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
=head2 getString() |
168
|
|
|
|
|
|
|
|
169
|
|
|
|
|
|
|
Retruns the string equivalent of the token. Particularly useful when |
170
|
|
|
|
|
|
|
you only know it's a CQL_WORD. |
171
|
|
|
|
|
|
|
|
172
|
|
|
|
|
|
|
=cut |
173
|
|
|
|
|
|
|
|
174
|
1434
|
|
|
1434
|
1
|
8087
|
sub getString { return shift->{string}; } |
175
|
|
|
|
|
|
|
|
176
|
|
|
|
|
|
|
1; |